On
> +#undef NetXen_LOOPBACK
> +#undef SINGLE_DMA_BUF
> +#define NetXen_NIC_HW_CSUM
> +#define NetXen_NIC_NAPI
> +// #undef NetXen_NIC_NAPI
> +
> +#define NetXen_NETIF_F_TSO
Ugh. MixedCase define's and ifdef configuration message.
Remember, either keep the code or remove it.
> +// for cmd line parameteres----------
> +#define NetXen_PARAM(X,S) \
> +static int X=0; \
> +MODULE_PARM(X,"i"); \
> +MODULE_PARM_DESC(X,S);
>
More macro crap.
> +
> +
> +MODULE_AUTHOR("NetXen");
Author is a human, not a company.
> +MODULE_DESCRIPTION("NetXen Multi port (1/10) Gigabit Network Driver");
> +MODULE_LICENSE("GPL");
> +
> +/*static int netxen_nic_debug = NETIF_MSG_DRV | NETIF_MSG_PROBE; TODO */
> +int netxen_nic_debug;
"static int debug" is good better.
> +
> +MODULE_PARM(netxen_nic_debug, "i");
> +MODULE_PARM_DESC(netxen_nic_debug, "Debug level (0=none,...,16=all)");
> +
> +
> +char netxen_nic_driver_name[] = "netxen";
can be "static const char"
> +char netxen_nic_driver_string[] = "NetXen Network Driver version "
> + NetXen_NIC_LINUX_VERSIONID
> + "-"
> + NetXen_NIC_BUILD_NO
> + " generated "
> + NetXen_NIC_TIMESTAMP;
> +
> +#ifndef ARCH_KMALLOC_MINALIGN
> +#define ARCH_KMALLOC_MINALIGN 0
> +#endif
> +#ifndef ARCH_KMALLOC_FLAGS
> +#define ARCH_KMALLOC_FLAGS SLAB_HWCACHE_ALIGN
> +#endif
More macro obfuscation.
> +
> +#define NetXen_NETDEV_WEIGHT 120
> +#define ADAPTER_UP_MAGIC 777
> +
> +kmem_cache_t *cmd_desc_cache = NULL;
> +kmem_cache_t *cmd_buff_cache = NULL;
> +cmdDescType0_t *cmd_desc_array[NR_CPUS];
> +struct netxen_cmd_buffer *cmd_buff_array[NR_CPUS];
> +
> +static int netxen_nic_probe_err = 0;
> +
> +#define RCV_DESC_RINGSIZE (sizeof(rcvDesc_t) *
> adapter->MaxRxDescCount)
> +#define STATUS_DESC_RINGSIZE (sizeof(statusDesc_t)*
> adapter->MaxRxDescCount)
Don't use structure obscuring typedef's (rcvDesc_t) ...
> +#define JUMBO_DESC_RINGSIZE (sizeof(rcvDesc_t) *
> adapter->MaxJumboRxDescCount)
> +#define TX_RINGSIZE (sizeof(struct netxen_cmd_buffer) *
> adapter->MaxTxDescCount)
> +#define RCV_BUFFSIZE (sizeof(struct netxen_rx_buffer) *
> rcv_desc->MaxRxDescCount)
> +
> +#define NetXen_NIC_INT_RESET 0x2004
> +
> +/* Local functions to NetXen NIC driver */
> +static int __devinit netxen_nic_probe(struct pci_dev *pdev,
> + const struct pci_device_id *ent);
> +static void __devexit netxen_nic_remove(struct pci_dev *pdev);
> +static void netxen_nic_hw_reset (struct netxen_adapter_s *adapter);
> +static int netxen_nic_open(struct net_device *netdev);
> +static int netxen_nic_close(struct net_device *netdev);
> +static int netxen_nic_xmit_frame(struct sk_buff *, struct net_device *);
> +static int netxen_nic_set_mac(struct net_device *netdev, void *p);
> +static int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu);
> +static int netxen_nic_hw_resources(struct netxen_adapter_s *adapter);
> +static void netxen_nic_set_multi(struct net_device *netdev);
> +static void initialize_adapter_sw(struct netxen_adapter_s *adapter);
> +static void netxen_post_rx_buffers(struct netxen_adapter_s *adapter,
> uint32_t ctx,
> + uint32_t num, uint32_t type);
> +static void netxen_process_rcv(struct netxen_adapter_s *adapter,int ctx,
> + statusDesc_t *desc);
> +static void netxen_tx_timeout(struct net_device *netdev);
> +static void netxen_tx_timeout_task(struct net_device *netdev);
> +static void netxen_process_cmd_ring(unsigned long data);
> +static void netxen_nic_down(struct netxen_port *port);
> +static int netxen_nic_do_ioctl(struct netxen_adapter_s *adapter,
> void*u_data,
> + struct netxen_port *port);
> +static int initialize_adapter_hw(struct netxen_adapter_s *adapter);
> +static void netxen_watchdog(unsigned long);
> +static void netxen_watchdog_task(unsigned long adapter);
> +static void netxen_nic_tune_phantom(struct pci_dev *pdev,
> + struct netxen_adapter_s*);
> +static void netxen_nic_enable_int(netxen_adapter *adapter);
> +static void netxen_nic_disable_int(netxen_adapter *adapter);
> +static uint32_t netxen_process_rcv_ring(struct netxen_adapter_s *, int, int);
> +static void netxen_nic_clear_stats(struct netxen_adapter_s *);
> +static struct net_device_stats *netxen_nic_get_stats(struct net_device
> *netdev);
> +static void netxen_nic_irq_enable(struct netxen_adapter_s *adapter);
> +static int netxen_handle_int(netxen_adapter *, struct net_device *);
> +static int netxen_nic_ioctl(struct net_device *netdev,
> + struct ifreq *ifr, int cmd);
> +static int netxen_nic_read_proc(char *buf, char **start, off_t offset,
> + int count, int *eof, void *data);
> +static int netxen_nic_port_read_proc(char *buf, char **start, off_t
> offset,
> + int count, int *eof, void *data);
> +#ifdef NetXen_NIC_NAPI
> +static int netxen_nic_rx_has_work(struct netxen_adapter_s *adapter);
> +static int netxen_nic_tx_has_work(struct netxen_adapter_s *adapter);
> +static int netxen_nic_poll(struct net_device *dev, int *budget);
> +#endif
> +#ifdef CONFIG_NET_POLL_CONTROLLER
> +static void netxen_nic_poll_controller(struct net_device *netdev);
> +#endif
> +#ifdef NetXen_NIC_HW_CSUM
> +static int netxen_tx_csum(struct netxen_adapter_s *adapter,
> cmdDescType0_t *desc,
> + struct sk_buff *skb);
> +#endif
> +static irqreturn_t netxen_intr(int irq, void *data, struct pt_regs *regs);
> +
> +extern void set_ethtool_ops(struct net_device *netdev);
> +struct netxen_adapter_s *g_adapter;
> +spinlock_t hal_lock;
> +
> +unsigned int loopback_start = 0;
> +
> +static struct proc_dir_entry *netxen_proc_dir_entry;
> +
> +static unsigned char *tx_user_packet_data = NULL, *rx_user_packet_data;
> +static unsigned int tx_user_packet_length = 0, rx_datalen, rx_user_pos = 0;
> +static int capture_input = 0, captured = 0;
> +
> +#define DIDX_DIF(p, c) \
> + ((p >= c) ? (p - c) : (MAX_CMD_DESCRIPTORS - p + c))
Why not a simple inline?
> +
> +#define CIS_WATERMARK 0x60
> +
> +#define PEG_LOOP 1000 /* loop to pegstuck? */
> +
> +#define QMAJ(hdr) ((hdr >> 19) & 0xF)
> +#define QMIN(hdr) (hdr & 0x3ffff)
> +#define QSUB(hdr) ((hdr >> 18) & 0x1)
> +
> +extern void xge_loopback(int on);
> +extern long xge_link_status (void);
> +
> +void __devinit
> +netxen_check_options(netxen_adapter *adapter)
> +{
> + adapter->MaxTxDescCount = MAX_CMD_DESCRIPTORS;
> + adapter->MaxRxDescCount = MAX_RCV_DESCRIPTORS;
> + adapter->MaxJumboRxDescCount = MAX_JUMBO_RCV_DESCRIPTORS;
> + return;
> +}
Why have a simple function like this ... ex C++ programmer?
> +
> +/* PCI Device ID Table */
> +static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
> + {PCI_VENDOR_ID_NetXen,PCI_DEVICE_ID_NetXen_4PORT,PCI_ANY_ID,
> + PCI_ANY_ID,0,0,0UL},
Use PCI_DEVICE() for this.
> + {0,}
> +};
> +
> +MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
> +
> +struct netxen_adapter_s *adapterlist[MAX_NUM_CARDS];
This is artifically limiting . Use dynamic allocation and pci_privdata
to find adapter structure.
> +
> +/*
> +netxen_nic_probe()
> +
> +Linux system will invoke this after identifying the vendor ID and device Id
> +in the pci_tbl where this module will search for NetXen vedonr and device ID
> for
> +quad port adapter.
> +
> +Even though there are 4 seperate devices (functions) on the quad port NIC,
> but
> +the probe will be invoked for the first device (function) only. This will
> +initialize the adapter, and setup the global parameters along with the port's
> +specific structure.
> +*/
> +static int __devinit
> +netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
> +{
> + struct net_device *netdev = NULL;
> + struct netxen_adapter_s *adapter = NULL;
> + struct netxen_port *port = NULL;
> + uint8_t *mem_ptr = NULL;
> + unsigned long mem_base, mem_len;
> + int pci_using_dac, i, err;
> + int boardno = 0;
> + int ring;
> + netdev_list_t *netlist = NULL;
> + netxen_recv_context_t *recv_ctx = NULL;
> + netxen_rcv_desc_ctx_t *rcv_desc = NULL;
> + struct netxen_cmd_buffer *cmd_buf_arr = NULL;
> + struct proc_dir_entry *procfile;
> + static int netxen_cards_found = 0;
> +
> + printk("NetXen: adapter %d\n", netxen_cards_found);
> +
> + if((err = pci_enable_device(pdev))) {
> + DPRINTK(1, ERR, "Cannot enable PCI device, aborting. %d\n",
> + err);
> + netxen_nic_probe_err = err;
> + return err;
> + }
> +
> + if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
> + DPRINTK(1, ERR, "Cannot find proper PCI device "
> + "base address, aborting. %p\n", pdev);
> + err = -ENODEV;
> + goto err_out_disable_pdev;
> + }
> +
> + if((err = pci_request_regions(pdev, netxen_nic_driver_name))) {
> + DPRINTK(1, ERR, "Cannot find proper PCI resources"
> + " aborting:%d\n", err);
> + goto err_out_disable_pdev;
> + }
> +
> + pci_set_master(pdev);
> +
> + if(!(err = pci_set_dma_mask(pdev, PCI_DMA_64BIT)) &&
> + !(err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))) {
> + pci_using_dac = 1;
> + } else {
> + if((err = pci_set_dma_mask(pdev, PCI_DMA_32BIT)) ||
> + (err = pci_set_consistent_dma_mask(pdev,
> DMA_32BIT_MASK))) {
> + DPRINTK(1, ERR, "No usable DMA configuration,"
> + " aborting:%d\n", err);
> + goto err_out_free_res;
> + }
> + pci_using_dac = 0;
> + }
> + DPRINTK(1, INFO, "pci_using_dac: %d\n", pci_using_dac);
> +
> + /* remap phys address */
> + mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
> + mem_len = pci_resource_len(pdev, 0);
> +
> + /* 128 Meg of memory */
> + DPRINTK(1, INFO, "ioremap from %lx a size of %lx\n", mem_base,
> + mem_len);
> + mem_ptr = ioremap(mem_base, NetXen_PCI_MAPSIZE_BYTES);
> + if (mem_ptr == 0UL) {
> + DPRINTK(1, ERR, "Cannot remap adapter memory aborting.:%p\n",
> + mem_ptr);
> + err = -EIO;
> + goto err_out_free_res;
> + }
> + DPRINTK(1, ERR, "ioremaped at %p\n", mem_ptr);
> +
> +/*
> + * Allocate a adapter structure which will manage all the initialization
> + * as well as the common resources for all ports...
> + * all the ports will have pointer to this adapter as well as Adapter
> + * will have pointers of all the ports structures.
> + */
> +
> + /* One adapter structure for all 4 ports.... */
> + adapter = (struct netxen_adapter_s *)kmalloc(sizeof(struct
> netxen_adapter_s),
> + GFP_KERNEL);
Cast is unnecessary here.
> + if (adapter == NULL) {
> + DPRINTK(1, ERR, "Could not allocate adapter memory:%d\n",
> + (int)sizeof(struct netxen_adapter_s));
> + err = -ENOMEM;
> + goto err_out_iounmap;
> + }
> +
> + if (netxen_cards_found == 0) {
> + g_adapter = adapter;
> + spin_lock_init(&hal_lock);
> + }
> +
> + /* Initialize to 0 */
> + memset(adapter, 0 , sizeof(struct netxen_adapter_s));
Use kzalloc.
> + DPRINTK(1, INFO, "malloced memory at %p\n", adapter);
> +
> + netxen_check_options(adapter);
> +
> + cmd_buf_arr = (struct netxen_cmd_buffer*) vmalloc(TX_RINGSIZE);
Your ring must be huge to need to vmalloc?
> + if (cmd_buf_arr == NULL) {
> + DPRINTK(1, ERR, "Could not allocate command buffer array,"
> + " order :%d\n", get_order(TX_RINGSIZE));
> + err = -ENOMEM;
> + goto err_out_free_adapter;
> + }
> + memset (cmd_buf_arr, 0, TX_RINGSIZE);
> +
> + for (i = 0; i < MAX_RCV_CTX; ++i) {
> + recv_ctx = &adapter->recv_ctx[i];
> + for (ring = 0; ring < NUM_RCV_DESC_RINGS; ring++) {
> + rcv_desc = &recv_ctx->rcv_desc[ring];
> + switch (RCV_DESC_TYPE(ring)) {
> + case RCV_RING_STD:
> + rcv_desc->MaxRxDescCount =
> + adapter->MaxRxDescCount;
> + rcv_desc->flags = RCV_DESC_NORMAL;
> + rcv_desc->dma_size = RX_DMA_MAP_LEN;
> + rcv_desc->skb_size = MAX_RX_BUFFER_LENGTH;
> + break;
> +
> + case RCV_RING_JUMBO:
> + rcv_desc->MaxRxDescCount =
> + adapter->MaxJumboRxDescCount;
> + rcv_desc->flags = RCV_DESC_JUMBO;
> + rcv_desc->dma_size = RX_JUMBO_DMA_MAP_LEN;
> + rcv_desc->skb_size =
> + MAX_RX_JUMBO_BUFFER_LENGTH;
> + break;
> +
> + default:
> + printk("%s: netxen_nic_probe: bad receive "
> + "descriptor type %d\n",
> + netxen_nic_driver_name,
> + RCV_DESC_TYPE(ring));
> + break;
> + }
> + rcv_desc->rx_buf_arr = (struct netxen_rx_buffer*)
> +
> pci_alloc_consistent(pdev,
> + RCV_BUFFSIZE,
> + &rcv_desc->rx_buf_phys);
> +
> + if(rcv_desc->rx_buf_arr == NULL) {
> + DPRINTK(1, ERR, "Could not allocate rx"
> + " buffer array ring %d,"
> + " size:%u\n", ring,
> + (unsigned int)RCV_BUFFSIZE);
> + err = -ENOMEM;
> + goto err_out_free_rx_buffer;
> + }
> + memset (rcv_desc->rx_buf_arr, 0, RCV_BUFFSIZE);
> + }
> +
> + }
> +
> + adapter->cmd_buf_arr = cmd_buf_arr;
> + adapter->ahw.pci_base = (unsigned long)mem_ptr;
> + adapter->ahw.pci_len = mem_len;
> + adapter->ahw.crb_base = adapter->ahw.pci_base + NetXen_PCI_CRBSPACE;
> + rwlock_init(&adapter->adapter_lock);
Reader writer locks are the slowest of all the locking options. Why are you
using
it rather than something better.
> + spin_lock_init(&adapter->tx_lock);
> + spin_lock_init(&adapter->lock);
> + initialize_adapter_sw(adapter); /* initialize the buffers in adapter
> */
> + /*
> + * Set the CRB window to invalid. If any register in window 0 is
> + * accessed it should set the window to 0 and then reset it to 1.
> + */
> + adapter->curr_window = 255;
> + /*
> + * Adapter in our case is quad port so initialize it beofore
> + * initializing the ports
> + */
> + initialize_adapter_hw(adapter); /* initialize the adapter */
> + adapter->port =
> + (struct netxen_port**) kmalloc(sizeof(struct
> netxen_adapter_s)*
> + (adapter->ahw.max_ports),
> + GFP_KERNEL);
Use kcalloc, cast not needed
> + if (adapter->port == NULL) {
> + DPRINTK(1, ERR, "Could not allocate port-array memory:%d\n",
> + (int)sizeof(struct netxen_adapter_s) *
> + (adapter->ahw.max_ports));
> + err = -ENOMEM;
> + goto err_out_free_rx_buffer;
> + }
> + init_timer(&adapter->watchdog_timer);
> + adapter->ahw.xg_linkup = 0;
> + adapter->watchdog_timer.function = &netxen_watchdog;
> + adapter->watchdog_timer.data = (unsigned long) adapter;
> + INIT_WORK(&adapter->watchdog_task,
> + (void (*)(void *))netxen_watchdog_task, adapter);
> + adapter->ahw.vendor_id = pdev->vendor;
> + adapter->ahw.device_id = pdev->device;
> + adapter->ahw.pdev = pdev;
> + adapter->procCmdBufCounter = 0;
> + pci_read_config_byte(pdev, PCI_REVISION_ID,
> &adapter->ahw.revision_id);
> + pci_read_config_word(pdev, PCI_COMMAND, &adapter->ahw.pci_cmd_word);
> +
> +#if defined(CONFIG_PCI_MSI)
> + adapter->flags |= NetXen_NIC_MSI_ENABLED;
> + if (pci_enable_msi(pdev)) {
> + adapter->flags &= ~NetXen_NIC_MSI_ENABLED;
> + printk(KERN_WARNING "%s: unable to allocate MSI interrupt"
> + " error\n",netxen_nic_driver_name);
> + }
> +#endif
> + netxen_nic_tune_phantom(pdev, adapter);
> +
> + /* initialize the all the ports */
> + DPRINTK(1, INFO, "about to allocate all the %d net devs.\n",
> + adapter->ahw.max_ports);
> + for (i = 0; i < adapter->ahw.max_ports; i ++) {
> + netlist = kmalloc(sizeof(netdev_list_t), GFP_KERNEL);
> + if (netlist == NULL) {
> + goto err_out_free_dev;
> + }
> + netlist->netdev = alloc_etherdev(sizeof(struct netxen_port));
> + if(!netlist->netdev) {
> + DPRINTK(1, ERR, " could not allocate netdev for port"
> + " %d\n",i+1);
> + kfree(netlist);
> + goto err_out_free_dev;
> + }
> + netdev = netlist->netdev;
> +
> + SET_MODULE_OWNER(netdev);
> +
> + port = netdev->priv;
> + port->netdev = netdev;
> + port->pdev = pdev;
> + port->hw.port = port;
> + port->adapter = adapter;
> + port->portnum = i; /* Gigabit port number starting from 0-3
> */
> + port->flags &= ~NETDEV_STATUS;
> +
> + netdev->open = netxen_nic_open;
> + netdev->stop = netxen_nic_close;
> + netdev->hard_start_xmit = netxen_nic_xmit_frame;
> + netdev->get_stats = netxen_nic_get_stats;
> + netdev->set_multicast_list = netxen_nic_set_multi;
> + netdev->set_mac_address = netxen_nic_set_mac;
> + netdev->change_mtu = netxen_nic_change_mtu;
> + netdev->do_ioctl = netxen_nic_ioctl;
> + netdev->tx_timeout = netxen_tx_timeout;
> + set_ethtool_ops(netdev);
> + /* FIXME: maybe
> SET_ETHTOOL_OPS(netdev,&netxen_nic_ethtool_ops);*/
Yes, do it right.
> + netdev->irq = pdev->irq;
> +#ifdef NetXen_NIC_NAPI
> + netdev->poll = netxen_nic_poll;
> + netdev->weight = NetXen_NETDEV_WEIGHT;
> +#endif
> +#ifdef CONFIG_NET_POLL_CONTROLLER
> + netdev->poll_controller = netxen_nic_poll_controller;
> +#endif
> +#ifdef NetXen_NIC_HW_CSUM
> + /* ScatterGather support */
> + netdev->features = NETIF_F_SG ;
> + netdev->features |= NETIF_F_IP_CSUM;
> +#endif
> +#ifdef NetXen_NIC_HW_VLAN
> + netdev->features |= NETIF_F_HW_VLAN_TX;
> + netdev->features |= NETIF_F_HW_VLAN_RX;
> +#endif
> +#ifdef NetXen_NETIF_F_TSO
> + netdev->features |= NETIF_F_TSO;
> +#endif
> +
> + if(pci_using_dac)
> + netdev->features |= NETIF_F_HIGHDMA;
> + DPRINTK(1, INFO, "setting mac address: %p\n", port);
> +
> + /*
> + * Allocate h/w address and set in h/w.
> + * Eventually, we will read from the flash and set the mac
> + * address.
> + * For now set the lower 3 bytes to be same as board number
> + */
Do it right, otherwise you risk issues with multiple systems with same address!
> + boardno = netxen_nic_get_board_num(adapter);
> + port->hw.mac_addr[0] = 0x00;
> + port->hw.mac_addr[1] = 0x0e;
> + port->hw.mac_addr[2] = 0x1e;
> + port->hw.mac_addr[3] = ((boardno & (0xff << 16)) >> 16) + i;
> + port->hw.mac_addr[4] = (boardno & (0xff << 8)) >> 8;
> + port->hw.mac_addr[5] = boardno & 0xff;
> + netxen_nic_macaddr_set (port, port->hw.mac_addr);
> + memcpy(netdev->dev_addr, port->hw.mac_addr,
> netdev->addr_len);
> + if(!is_valid_ether_addr(netdev->dev_addr)) {
> + DPRINTK(1, ERR, "BAD MAC :is_valid_ether_addr"
> + " aborting:%d\n", err);
> + break;
> + }
> + INIT_WORK(adapter->tx_timeout_task + i,
> + (void (*)(void *))netxen_tx_timeout_task,
> netdev);
> + netif_carrier_off(netdev);
> + netif_stop_queue(netdev);
> +
> + if((err = register_netdev(netdev))) {
> + DPRINTK(1, ERR, "register_netdev failed port #%d"
> + " aborting\n", i+1);
> + break;
> + }
> + procfile = create_proc_entry(netdev->name, S_IRUGO,
> + netxen_proc_dir_entry);
> + if (procfile) {
> + procfile->data = netdev;
> + procfile->owner = THIS_MODULE;
> + procfile->read_proc = netxen_nic_port_read_proc;
> + }
Is the /proc entry really needed? If so use seq_file. Also netdev->name can
change so you need to track name changes...
Enough crap for now.
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html