Re: [PATCH 6/9] Resending NetXen 1G/10G NIC driver patch
Why is this necessary. Additional private API seems like leftover debug code. > +int > +netxen_nic_do_ioctl(struct netxen_adapter *adapter, void *u_data, > + struct netxen_port *port) > +{ > + struct netxen_nic_ioctl_data data; > + struct netxen_nic_ioctl_data *up_data; > + int retval = 0; > + struct netxen_statistics netxen_stats; > + > + up_data = (void *)u_data; > + > + DPRINTK(INFO, "doing ioctl for %p\n", adapter); > + if (copy_from_user(&data, up_data, sizeof(data))) { > + /* evil user tried to crash the kernel */ > + DPRINTK(ERR, "bad copy from userland: %d\n", (int)sizeof(data)); > + retval = -EFAULT; > + goto error_out; > + } > + > + /* Shouldn't access beyond legal limits of "char u[64];" member */ > + if (!data.ptr && (data.size > sizeof(data.u))) { > + /* evil user tried to crash the kernel */ > + DPRINTK(ERR, "bad size: %d\n", data.size); > + retval = -EFAULT; > + goto error_out; > + } > + > + switch (data.cmd) { > + case netxen_nic_cmd_pci_read: > + if ((retval = netxen_nic_hw_read_wx(adapter, data.off, > + &(data.u), data.size))) > + goto error_out; > + if (copy_to_user((void *)&(up_data->u), &(data.u), data.size)) { > + DPRINTK(ERR, "bad copy to userland: %d\n", > + (int)sizeof(data)); > + retval = -EFAULT; > + goto error_out; > + } > + data.rv = 0; > + break; > + Can't you access the same registers area with ethtool. > + case netxen_nic_cmd_pci_write: > + data.rv = netxen_nic_hw_write_wx(adapter, data.off, &(data.u), > + data.size); > + break; > + > + case netxen_nic_cmd_pci_mem_read: > + DPRINTK(INFO, "doing %s for %p\n", > + "netxen_nic_cmd_pci_mm_rd", adapter); > + netxen_nic_pci_mem_read(adapter, data.off, &(data.u), > + data.size); > + if (copy_to_user((void *)&(up_data->u), &(data.u), data.size)) { > + DPRINTK(ERR, "bad copy to userland: %d\n", > + (int)sizeof(data)); > + retval = -EFAULT; > + goto error_out; > + } > + data.rv = 0; > + DPRINTK(INFO, "read %lx\n", (unsigned long)data.u); > + break; PCI memory is accessible directly through sysfs for diagnostic tools. > + case netxen_nic_cmd_pci_mem_write: > + netxen_nic_pci_mem_write(adapter, data.off, &(data.u), > + data.size); > + data.rv = 0;/* write always succeeds */ > + break; > + > + case netxen_nic_cmd_pci_config_read: > + switch (data.size) { > + case 1: > + data.rv = pci_read_config_byte(adapter->ahw.pdev, > +data.off, > +(char *)&(data.u)); > + break; > + case 2: > + data.rv = pci_read_config_word(adapter->ahw.pdev, > +data.off, > +(short *)&(data.u)); > + break; > + case 4: > + data.rv = pci_read_config_dword(adapter->ahw.pdev, > + data.off, > + (u32 *) & (data.u)); > + break; > + } > + if (copy_to_user((void *)&(up_data->u), &(data.u), data.size)) { > + DPRINTK(ERR, "bad copy to userland: %d\n", > + (int)sizeof(data)); > + retval = -EFAULT; > + goto error_out; > + } > + break; > + > + case netxen_nic_cmd_pci_config_write: > + switch (data.size) { > + case 1: > + data.rv = pci_write_config_byte(adapter->ahw.pdev, > + data.off, > + *(char *)&(data.u)); > + break; > + case 2: > + data.rv = pci_write_config_word(adapter->ahw.pdev, > + data.off, > + *(short *)&(data.u)); > + break; > + case 4: > + data.rv = pci_write_config_dword(adapter->ahw.pdev, > + d
Re: [PATCH 6/9] Resending NetXen 1G/10G NIC driver patch
diff -u linux-2.6.16.18/drivers/net/netxen/netxen_nic_init.c linux-2.6.16.18/drivers/net/netxen/netxen_nic_init.c --- linux-2.6.16.18/drivers/net/netxen/netxen_nic_init.c 2006-05-25 02:43:22.0 -0700 +++ linux-2.6.16.18/drivers/net/netxen/netxen_nic_init.c 2006-05-26 04:05:34.0 -0700 @@ -200,8 +200,8 @@ } /* - * netxen_decode_crb_addr(0 - utility to translate from internal Phantom - * CRB address to external PCI CRB address. + * netxen_decode_crb_addr(0 - utility to translate from internal Phantom CRB address + * to external PCI CRB address. */ unsigned long netxen_decode_crb_addr(unsigned long addr) { @@ -869,7 +869,6 @@ for (p = 0; p < adapter->ahw.max_ports; p++) { nport = adapter->port[p]; if (netif_queue_stopped(nport->netdev) - && (nport->state == NETXEN_PORT_UP) && (nport->flags & NETXEN_NETDEV_STATUS)) { netif_wake_queue(nport->netdev); nport->flags &= ~NETXEN_NETDEV_STATUS; @@ -920,7 +919,7 @@ } count++;/* now there should be no failure */ pdesc = &rcv_desc->desc_head[producer]; - skb_reserve(skb, IP_ALIGNMENT_BYTES); + skb_reserve(skb, NET_IP_ALIGN); /* * This will be setup when we receive the * buffer after it has been filled On Thu, 2006-05-25 at 09:47 -0700, Stephen Hemminger wrote: > Why is this necessary. Additional private API seems like leftover > debug code. > > > +int > > +netxen_nic_do_ioctl(struct netxen_adapter *adapter, void *u_data, > > + struct netxen_port *port) > > +{ > > + struct netxen_nic_ioctl_data data; > > + struct netxen_nic_ioctl_data *up_data; > > + int retval = 0; > > + struct netxen_statistics netxen_stats; > > + > > + up_data = (void *)u_data; > > + > > + DPRINTK(INFO, "doing ioctl for %p\n", adapter); > > + if (copy_from_user(&data, up_data, sizeof(data))) { > > + /* evil user tried to crash the kernel */ > > + DPRINTK(ERR, "bad copy from userland: %d\n", (int)sizeof(data)); > > + retval = -EFAULT; > > + goto error_out; > > + } > > + > > + /* Shouldn't access beyond legal limits of "char u[64];" member */ > > + if (!data.ptr && (data.size > sizeof(data.u))) { > > + /* evil user tried to crash the kernel */ > > + DPRINTK(ERR, "bad size: %d\n", data.size); > > + retval = -EFAULT; > > + goto error_out; > > + } > > + > > + switch (data.cmd) { > > + case netxen_nic_cmd_pci_read: > > + if ((retval = netxen_nic_hw_read_wx(adapter, data.off, > > + &(data.u), data.size))) > > + goto error_out; > > + if (copy_to_user((void *)&(up_data->u), &(data.u), data.size)) { > > + DPRINTK(ERR, "bad copy to userland: %d\n", > > + (int)sizeof(data)); > > + retval = -EFAULT; > > + goto error_out; > > + } > > + data.rv = 0; > > + break; > > + > > Can't you access the same registers area with ethtool. > > > > + case netxen_nic_cmd_pci_write: > > + data.rv = netxen_nic_hw_write_wx(adapter, data.off, &(data.u), > > +data.size); > > + break; > > + > > + case netxen_nic_cmd_pci_mem_read: > > + DPRINTK(INFO, "doing %s for %p\n", > > + "netxen_nic_cmd_pci_mm_rd", adapter); > > + netxen_nic_pci_mem_read(adapter, data.off, &(data.u), > > + data.size); > > + if (copy_to_user((void *)&(up_data->u), &(data.u), data.size)) { > > + DPRINTK(ERR, "bad copy to userland: %d\n", > > + (int)sizeof(data)); > > + retval = -EFAULT; > > + goto error_out; > > + } > > + data.rv = 0; > > + DPRINTK(INFO, "read %lx\n", (unsigned long)data.u); > > + break; > > PCI memory is accessible directly through sysfs for diagnostic tools. > > > > + case netxen_nic_cmd_pci_mem_write: > > + netxen_nic_pci_mem_write(adapter, data.off, &(data.u), > > +data.size); > > + data.rv = 0;/* write always succeeds */ > > + break; > > + > > + case netxen_nic_cmd_pci_config_read: > > + switch (data.size) { > > + case 1: > > + data.rv = pci_read_config_byte(adapter->ahw.pdev, > > + data.off, > > + (char *)&(data.u)); > > + break; > > + case 2: > > + data.rv = pci_read_config_word(ad