1* reception stalls permanently (until admin intervention) if the rx buffer 2 queues become empty because of allocation failures (ex. under memory 3 pressure) 4* commit 7c734359d350 ("qlge: Size RX buffers based on MTU.", v2.6.33-rc1) 5 introduced dead code in the receive routines, which should be rewritten 6 anyways by the admission of the author himself, see the comment above 7 ql_build_rx_skb(). That function is now used exclusively to handle packets 8 that underwent header splitting but it still contains code to handle non 9 split cases. 10* truesize accounting is incorrect (ex: a 9000B frame has skb->truesize 10280 11 while containing two frags of order-1 allocations, ie. >16K) 12* while in that area, using two 8k buffers to store one 9k frame is a poor 13 choice of buffer size. 14* in the "chain of large buffers" case, the driver uses an skb allocated with 15 head room but only puts data in the frags. 16* rename "rx" queues to "completion" queues. Calling tx completion queues "rx 17 queues" is confusing. 18* struct rx_ring is used for rx and tx completions, with some members relevant 19 to one case only 20* there is an inordinate amount of disparate debugging code, most of which is 21 of questionable value. In particular, qlge_dbg.c has hundreds of lines of 22 code bitrotting away in ifdef land (doesn't compile since commit 23 18c49b91777c ("qlge: do vlan cleanup", v3.1-rc1), 8 years ago). 24* triggering an ethtool regdump will hexdump a 176k struct to dmesg depending 25 on some module parameters. 26* the flow control implementation in firmware is buggy (sends a flood of pause 27 frames, resets the link, device and driver buffer queues become 28 desynchronized), disable it by default 29* some structures are initialized redundantly (ex. memset 0 after 30 alloc_etherdev()) 31* the driver has a habit of using runtime checks where compile time checks are 32 possible (ex. ql_free_rx_buffers(), ql_alloc_rx_buffers()) 33* reorder struct members to avoid holes if it doesn't impact performance 34* in terms of namespace, the driver uses either qlge_, ql_ (used by 35 other qlogic drivers, with clashes, ex: ql_sem_spinlock) or nothing (with 36 clashes, ex: struct ob_mac_iocb_req). Rename everything to use the "qlge_" 37 prefix. 38* avoid legacy/deprecated apis (ex. replace pci_dma_*, replace pci_enable_msi, 39 use pci_iomap) 40* some "while" loops could be rewritten with simple "for", ex. 41 ql_wait_reg_rdy(), ql_start_rx_ring()) 42* remove duplicate and useless comments 43* fix weird line wrapping (all over, ex. the ql_set_routing_reg() calls in 44 qlge_set_multicast_list()). 45* fix weird indentation (all over, ex. the for loops in qlge_get_stats()) 46* fix checkpatch issues 47