Overall, if this were a class assignment I would give it a C- if I was
feeling generous. It tries to follow the linux driver style, but it
really needs more work and is incomplete at this time.

* The most troublesome design flaw seems to be that the hardware knows
  about the ip_address. Well, if you are doing some offloading, your going
  to get screwed cause you don't handle address changes, and gob of other
  issues related to addreses, IPV6, ...

* Don't use typedef's ql3xx_adapter, ... etc.

* Don't define stuff in ql3_def.h that is already in other linux headers
        ETH_DATA_LEN ...

* You have to allocate an skb and copy the data into the buffer on
  every receive in interrupt. 
  Boy I bet that really sucks for performance.

* Use netdev_priv() rather than dev->priv

* You are making more work than necessary. The driver is keeping
  stuff in the adapter data structure that is available already
  in net_device mtu, eth_addr, multicast list, ...

* Also lots of rx/tx block information is redundant and can be
  rederived.  If you have the skb and map address that should
  be sufficient.

* Any gigabit driver ought to be using NAPI, this isn't

* Don't do ethtool via ioctl hook use ethtool_ops.

* Do nvram via ethtool

* Needs real ethtool support for speed setting/reporting

* If you need a linked list, use list macros?

* Use new module_param() not deprecated MODULE_PARM()

* Use netif_msg_ rather than your current print_lvl / qDbgLevel

* Remove wrapper macros like QLDPRT5

* Remove HARD_ETHER_ADDRESS!

* Use existing MII code and interface

* Use C90 style initializers rather than old GNU style

* WTF is ql3xxx_driver_entry?

* ql3xxx_open is unnecessary stupid wrapper to ql_open
  remove it

* Don't use a dpc thread, use a work queue instead

* qdev->stats should just be part of the netdev_priv() not malloc'd

* enable/disable interrupts should probably be inline in .h file

* ql_sem_spinlock and ql_sem_lock defined but not used? delete it

* make functions used in one file static.

* isr routine shouldn't save/restore flags 
  it's an isr interrupts are disabled already

* code is full of places where it looks like you are being paid by the LOC
        if (retval)
                return IRQ_HANDLED;
        else
                return IRQ_NONE;

        vs.
        return IRA_HANDLED(retval);


* Minor
        - use const char for name/string/version
        - add MODULE_VERS(DRV_VERSION)
        - use PCI_DEVICE() macro in pci_device_id table
        - source lines > 80 characters please indent
        - Splitting things up into separate files isn't helpful for
          a driver this size. 

* Different from common usage:
        - Most net drivers use pci_alloc_consistent rather than 
          dma_alloc_coherent in network drivers

-
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

Reply via email to