/* * Copyright (c) 2021 Cornelis Networks. All rights reserved. * Copyright (c) 2013 Intel Corporation. All rights reserved. * Copyright (c) 2006, 2007, 2008, 2009 QLogic Corporation. All rights reserved. * Copyright (c) 2003, 2004, 2005, 2006 PathScale, Inc. All rights reserved. * * This software is available to you under a choice of one of two * licenses. You may choose to be licensed under the terms of the GNU * General Public License (GPL) Version 2, available from the file * COPYING in the main directory of this source tree, or the * OpenIB.org BSD license below: * * Redistribution and use in source and binary forms, with or * without modification, are permitted provided that the following * conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the following * disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials * provided with the distribution. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #include <linux/spinlock.h> #include <linux/pci.h> #include <linux/io.h> #include <linux/delay.h> #include <linux/netdevice.h> #include <linux/vmalloc.h> #include <linux/module.h> #include <linux/prefetch.h> #include "qib.h" DEFINE_MUTEX(…) …; /* general driver use */ unsigned qib_ibmtu; module_param_named(ibmtu, qib_ibmtu, uint, S_IRUGO); MODULE_PARM_DESC(…) …; unsigned qib_compat_ddr_negotiate = …; module_param_named(compat_ddr_negotiate, qib_compat_ddr_negotiate, uint, S_IWUSR | S_IRUGO); MODULE_PARM_DESC(…) …; MODULE_LICENSE(…) …; MODULE_AUTHOR(…) …; MODULE_DESCRIPTION(…) …; /* * QIB_PIO_MAXIBHDR is the max IB header size allowed for in our * PIO send buffers. This is well beyond anything currently * defined in the InfiniBand spec. */ #define QIB_PIO_MAXIBHDR … /* * QIB_MAX_PKT_RCV is the max # if packets processed per receive interrupt. */ #define QIB_MAX_PKT_RECV … struct qlogic_ib_stats qib_stats; struct pci_dev *qib_get_pci_dev(struct rvt_dev_info *rdi) { … } /* * Return count of units with at least one port ACTIVE. */ int qib_count_active_units(void) { … } /* * Return count of all units, optionally return in arguments * the number of usable (present) units, and the number of * ports that are up. */ int qib_count_units(int *npresentp, int *nupp) { … } /** * qib_wait_linkstate - wait for an IB link state change to occur * @ppd: the qlogic_ib device * @state: the state to wait for * @msecs: the number of milliseconds to wait * * wait up to msecs milliseconds for IB link state change to occur for * now, take the easy polling route. Currently used only by * qib_set_linkstate. Returns 0 if state reached, otherwise * -ETIMEDOUT state can have multiple states set, for any of several * transitions. */ int qib_wait_linkstate(struct qib_pportdata *ppd, u32 state, int msecs) { … } int qib_set_linkstate(struct qib_pportdata *ppd, u8 newstate) { … } /* * Get address of eager buffer from it's index (allocated in chunks, not * contiguous). */ static inline void *qib_get_egrbuf(const struct qib_ctxtdata *rcd, u32 etail) { … } /* * Returns 1 if error was a CRC, else 0. * Needed for some chip's synthesized error counters. */ static u32 qib_rcv_hdrerr(struct qib_ctxtdata *rcd, struct qib_pportdata *ppd, u32 ctxt, u32 eflags, u32 l, u32 etail, __le32 *rhf_addr, struct qib_message_header *rhdr) { … } /* * qib_kreceive - receive a packet * @rcd: the qlogic_ib context * @llic: gets count of good packets needed to clear lli, * (used with chips that need need to track crcs for lli) * * called from interrupt handler for errors or receive interrupt * Returns number of CRC error packets, needed by some chips for * local link integrity tracking. crcs are adjusted down by following * good packets, if any, and count of good packets is also tracked. */ u32 qib_kreceive(struct qib_ctxtdata *rcd, u32 *llic, u32 *npkts) { … } /** * qib_set_mtu - set the MTU * @ppd: the perport data * @arg: the new MTU * * We can handle "any" incoming size, the issue here is whether we * need to restrict our outgoing size. For now, we don't do any * sanity checking on this, and we don't deal with what happens to * programs that are already running when the size changes. * NOTE: changing the MTU will usually cause the IBC to go back to * link INIT state... */ int qib_set_mtu(struct qib_pportdata *ppd, u16 arg) { … } int qib_set_lid(struct qib_pportdata *ppd, u32 lid, u8 lmc) { … } /* * Following deal with the "obviously simple" task of overriding the state * of the LEDS, which normally indicate link physical and logical status. * The complications arise in dealing with different hardware mappings * and the board-dependent routine being called from interrupts. * and then there's the requirement to _flash_ them. */ #define LED_OVER_FREQ_SHIFT … #define LED_OVER_FREQ_MASK … /* Below is "non-zero" to force override, but both actual LEDs are off */ #define LED_OVER_BOTH_OFF … static void qib_run_led_override(struct timer_list *t) { … } void qib_set_led_override(struct qib_pportdata *ppd, unsigned int val) { … } /** * qib_reset_device - reset the chip if possible * @unit: the device to reset * * Whether or not reset is successful, we attempt to re-initialize the chip * (that is, much like a driver unload/reload). We clear the INITTED flag * so that the various entry points will fail until we reinitialize. For * now, we only allow this if no user contexts are open that use chip resources */ int qib_reset_device(int unit) { … }