Re: [PATCH 6/9] Resending NetXen 1G/10G NIC driver patch

2006-05-25 Thread Stephen Hemminger

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

2006-05-26 Thread Pradeep Dalvi
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