Ueimor, Jeff, Thanks for reviewing. We are integrating these into our code and will send an update tomorrow.
-Amit On Wednesday 31 January 2007 15:46, Jeff Garzik wrote: > Amit S. Kale wrote: > > Added ethtool support for user level firmware management utilities. > > > > Signed-off-by: Amit S. Kale <[EMAIL PROTECTED]> > > You will need to resend against netdev#upstream, which now contains Al > Viro's netxen annotations. > > Please add sparse checking (read Documentation/sparse.txt) to your build > process, after updating for Al Viro's changes. > > > --- > > > > netxen_nic.h | 16 ++- > > netxen_nic_ethtool.c | 87 +++++++++++++--- > > netxen_nic_init.c | 268 > > ++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 351 > > insertions(+), 20 deletions(-) > > > > diff --git a/drivers/net/netxen/netxen_nic.h > > b/drivers/net/netxen/netxen_nic.h index 59324b1..f188b59 100644 > > --- a/drivers/net/netxen/netxen_nic.h > > +++ b/drivers/net/netxen/netxen_nic.h > > @@ -63,12 +63,16 @@ #include <asm/pgtable.h> > > > > #include "netxen_nic_hw.h" > > > > -#define NETXEN_NIC_BUILD_NO "2" > > +#define NETXEN_NIC_BUILD_NO "3" > > As mentioned previously, this constant should be removed > > > #define _NETXEN_NIC_LINUX_MAJOR 3 > > #define _NETXEN_NIC_LINUX_MINOR 3 > > #define _NETXEN_NIC_LINUX_SUBVERSION 3 > > #define NETXEN_NIC_LINUX_VERSIONID "3.3.3" "-" NETXEN_NIC_BUILD_NO > > > > +#define NUM_FLASH_SECTORS (64) > > +#define FLASH_SECTOR_SIZE (64*1024) > > +#define FLASH_TOTAL_SIZE (NUM_FLASH_SECTORS*FLASH_SECTOR_SIZE) > > + > > #define RCV_DESC_RINGSIZE \ > > (sizeof(struct rcv_desc) * adapter->max_rx_desc_count) > > #define STATUS_DESC_RINGSIZE \ > > @@ -85,6 +89,7 @@ #define NETXEN_NETDEV_STATUS 0x1 > > #define NETXEN_RCV_PRODUCER_OFFSET 0 > > #define NETXEN_RCV_PEG_DB_ID 2 > > #define NETXEN_HOST_DUMMY_DMA_SIZE 1024 > > +#define FLASH_SUCCESS 0 > > > > #define ADDR_IN_WINDOW1(off) \ > > ((off > NETXEN_CRB_PCIX_HOST2) && (off < NETXEN_CRB_MAX)) ? 1 : 0 > > @@ -1034,6 +1039,15 @@ void netxen_phantom_init(struct netxen_a > > void netxen_load_firmware(struct netxen_adapter *adapter); > > int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose); > > int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int > > *valp); +int netxen_rom_fast_read_words(struct netxen_adapter *adapter, > > int addr, + u8 *bytes, size_t size); > > +int netxen_rom_fast_write_words(struct netxen_adapter *adapter, int > > addr, + u8 *bytes, size_t size); > > +int netxen_flash_unlock(struct netxen_adapter *adapter); > > +int netxen_backup_crbinit(struct netxen_adapter *adapter); > > +int netxen_flash_erase_secondary(struct netxen_adapter *adapter); > > +int netxen_flash_erase_primary(struct netxen_adapter *adapter); > > + > > int netxen_rom_fast_write(struct netxen_adapter *adapter, int addr, int > > data); int netxen_rom_se(struct netxen_adapter *adapter, int addr); > > int netxen_do_rom_se(struct netxen_adapter *adapter, int addr); > > diff --git a/drivers/net/netxen/netxen_nic_ethtool.c > > b/drivers/net/netxen/netxen_nic_ethtool.c index 3404461..49b3b4c 100644 > > --- a/drivers/net/netxen/netxen_nic_ethtool.c > > +++ b/drivers/net/netxen/netxen_nic_ethtool.c > > @@ -32,6 +32,7 @@ > > */ > > > > #include <linux/types.h> > > +#include <linux/delay.h> > > #include <asm/uaccess.h> > > #include <linux/pci.h> > > #include <asm/io.h> > > @@ -94,17 +95,7 @@ #define NETXEN_MAX_EEPROM_LEN 1024 > > > > static int netxen_nic_get_eeprom_len(struct net_device *dev) > > { > > - struct netxen_port *port = netdev_priv(dev); > > - struct netxen_adapter *adapter = port->adapter; > > - int n; > > - > > - if ((netxen_rom_fast_read(adapter, 0, &n) == 0) > > - && (n & NETXEN_ROM_ROUNDUP)) { > > - n &= ~NETXEN_ROM_ROUNDUP; > > - if (n < NETXEN_MAX_EEPROM_LEN) > > - return n; > > - } > > - return 0; > > + return FLASH_TOTAL_SIZE; > > } > > > > static void > > @@ -445,13 +436,78 @@ netxen_nic_get_eeprom(struct net_device > > return -EINVAL; > > > > eeprom->magic = (port->pdev)->vendor | ((port->pdev)->device << 16); > > - for (offset = 0; offset < eeprom->len; offset++) > > - if (netxen_rom_fast_read > > - (adapter, (8 * offset) + 8, (int *)eeprom->data) == -1) > > - return -EIO; > > + offset = eeprom->offset; > > + > > + if (netxen_rom_fast_read_words > > + (adapter, offset, bytes, eeprom->len) == -1){ > > + return -EIO; > > + } > > two non-standard style elements: > > 1) function arguments should follow the function on the same line. wrap > the line at the first argument that crosses the 72-column barrier > > 2) do not use braces '{' '}' to enclose a single C statement > > > return 0; > > } > > > > +static int > > +netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom > > *eeprom, + u8 * bytes) > > +{ > > + struct netxen_port *port = netdev_priv(dev); > > + struct netxen_adapter *adapter = port->adapter; > > + int offset = eeprom->offset; > > + static int first_write = 1; > > + int ret; > > + static int ready_to_flash = 0; > > + > > + if(first_write == 1){ > > + netxen_flash_unlock(adapter); > > + printk("%s: flash unlocked. \n", netxen_nic_driver_name); > > + if ((ret = netxen_flash_erase_secondary(adapter)) > > + != FLASH_SUCCESS) { > > do not combine a test and a C statement into the same line > > > + printk("%s: Flash erase failed.\n", > > + netxen_nic_driver_name); > > + return(ret); > > 1) return is not a function. do not enclose its arguments in parens. > > 2) is it ok to return without re-locking flash? > > > + } > > + printk("%s: secondary flash erased successfully.\n", > > + netxen_nic_driver_name); > > Do not add printk() calls without a KERN_xxx message prefix. > > Moreover, you should probably be using dev_{err,info,...} instead of > printk() > > > + first_write = 0; > > + return 0; > > ditto (re-locking flash) > > > + } > > + > > + if(offset == BOOTLD_START){ > > add spaces following "if", this is not Java ;-) > > > + if ((ret = netxen_flash_erase_primary(adapter)) > > + != FLASH_SUCCESS) { > > + printk("%s: Flash erase failed.\n", > > + netxen_nic_driver_name); > > + return ret; > > ditto (re-locking flash) > > > + } > > + if((ret = netxen_rom_se(adapter, USER_START)) != FLASH_SUCCESS) > > + return ret; > > + if((ret = netxen_rom_se(adapter, FIXED_START)) != FLASH_SUCCESS) > > + return ret; > > 1) more statement + tests that should be split into two lines apiece > > 2) re-locking flash? > > > + printk("%s: primary flash erased successfully\n", > > + netxen_nic_driver_name); > > + udelay (500); > > + > > + if((ret = netxen_backup_crbinit(adapter)) != FLASH_SUCCESS){ > > + printk("%s: CRBinit backup failed.\n", > > + netxen_nic_driver_name); > > + return ret; > > + } > > + printk("%s: CRBinit backup done.\n", netxen_nic_driver_name); > > + ready_to_flash = 1; > > + udelay (500); > > + } > > + > > + if(!ready_to_flash){ > > + printk("%s: Invalid write sequence, returning...\n", > > + netxen_nic_driver_name); > > + return -EINVAL; > > more naked printk's > > > + > > + udelay (500); > > + > > + return netxen_rom_fast_write_words(adapter, offset, bytes, > > eeprom->len); +} > > + > > static void > > netxen_nic_get_ringparam(struct net_device *dev, struct > > ethtool_ringparam *ring) { > > @@ -721,6 +777,7 @@ struct ethtool_ops netxen_nic_ethtool_op > > .get_link = netxen_nic_get_link, > > .get_eeprom_len = netxen_nic_get_eeprom_len, > > .get_eeprom = netxen_nic_get_eeprom, > > + .set_eeprom = netxen_nic_set_eeprom, > > .get_ringparam = netxen_nic_get_ringparam, > > .get_pauseparam = netxen_nic_get_pauseparam, > > .set_pauseparam = netxen_nic_set_pauseparam, > > diff --git a/drivers/net/netxen/netxen_nic_init.c > > b/drivers/net/netxen/netxen_nic_init.c index c3e41f3..069436f 100644 > > --- a/drivers/net/netxen/netxen_nic_init.c > > +++ b/drivers/net/netxen/netxen_nic_init.c > > @@ -391,6 +391,7 @@ static inline int do_rom_fast_write(stru > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, > > M25P_INSTR_PP); > > + udelay(100); > > why? > > maybe just a PCI posting bug? > > > if (netxen_wait_rom_done(adapter)) { > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); > > return -1; > > @@ -399,12 +400,13 @@ static inline int do_rom_fast_write(stru > > return netxen_rom_wip_poll(adapter); > > } > > > > + > > static inline int > > do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) > > { > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); > > - udelay(100); /* prevent bursting on CRB */ > > + udelay(70); /* prevent bursting on CRB */ > > why? > > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); > > if (netxen_wait_rom_done(adapter)) { > > @@ -413,13 +415,45 @@ do_rom_fast_read(struct netxen_adapter * > > } > > /* reset abyte_cnt and dummy_byte_cnt */ > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); > > - udelay(100); /* prevent bursting on CRB */ > > + udelay(70); /* prevent bursting on CRB */ > > why? > > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); > > > > *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); > > return 0; > > } > > > > +static inline int > > +do_rom_fast_read_words(struct netxen_adapter *adapter, int addr, > > + u8 *bytes, size_t size) > > +{ > > + int addridx = addr; > > + int ret = 0; > > + > > + while (addridx < (addr + size)) { > > + ret = do_rom_fast_read(adapter, addridx, (int *)bytes); > > + if(ret != 0) > > add space after 'if' > > > + break; > > + bytes += 4; > > + addridx += 4; > > + } > > + return ret; > > +} > > + > > +int > > +netxen_rom_fast_read_words (struct netxen_adapter *adapter, int addr, u8 > > *bytes, + size_t size) > > +{ > > + int ret; > > add blank line after definition of automatic variable > > > + if (rom_lock(adapter) != 0) { > > + return -1; > > + } > > remove braces > > > + ret = do_rom_fast_read_words(adapter, addr, bytes, size); > > + > > + netxen_rom_unlock(adapter); > > + return ret; > > +} > > + > > int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, int > > *valp) { > > int ret; > > @@ -443,20 +477,189 @@ int netxen_rom_fast_write(struct netxen_ > > netxen_rom_unlock(adapter); > > return ret; > > } > > + > > +static inline int do_rom_fast_write_words(struct netxen_adapter > > *adapter, + int addr, u8 *bytes, > > size_t size) > > +{ > > + int addridx = addr; > > + int data1; > > + int data; > > + int ret = 0; > > + int timeout = 0; > > + > > + while (addridx < (addr + size)) { > > + data = *(u32*)bytes; > > + > > + ret = do_rom_fast_write(adapter, addridx, data); > > + if(ret == -1){ > > add space > > > + printk("do_rom_fast_write returned error \n"); > > naked printk > > > + return ret; > > + > > + } > > + timeout = 0; > > + > > + while(1){ > > + do_rom_fast_read(adapter, addridx, &data1); > > + > > + if(data1 == data){ > > + break; > > + } > > kill braces > > > + if(timeout++ >= 300) { > > + printk("netxen_nic: Data write didn't succeed" > > + " at address %x\n", addridx); > > + break; > > naked printk > > > + } > > + } > > + > > + bytes += 4; > > + addridx += 4; > > + } > > + > > + return ret; > > +} > > + > > +int netxen_rom_fast_write_words(struct netxen_adapter *adapter, int > > addr, + u8 *bytes, size_t size) > > +{ > > + int ret = 0; > > + > > + if (rom_lock(adapter) != 0) { > > + return -EAGAIN; > > + } > > kill braces > > > + ret = do_rom_fast_write_words(adapter, addr, bytes, size); > > + netxen_rom_unlock(adapter); > > + return ret; > > +} > > + > > +int netxen_rom_wrsr(struct netxen_adapter *adapter, int data) > > +{ > > + if (netxen_rom_wren(adapter)){ > > + return -1; > > + } > > ditto > > > + netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_ROM_WDATA, data); > > + netxen_crb_writelit_adapter(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, > > 0x1); + > > + if (netxen_wait_rom_done(adapter)) { > > + return -1; > > + } > > ditto > > > + return netxen_rom_wip_poll(adapter); > > +} > > + > > +int netxen_rom_rdsr(struct netxen_adapter *adapter) > > +{ > > + int ret; > > + > > + if (rom_lock(adapter) != 0){ > > + return -1; > > + } > > ditto > > > + ret = netxen_do_rom_rdsr(adapter); > > + netxen_rom_unlock(adapter); > > + return ret; > > +} > > + > > +int netxen_backup_crbinit(struct netxen_adapter *adapter) > > +{ > > + int ret = FLASH_SUCCESS; > > + int val; > > + char *buffer = kmalloc(FLASH_SECTOR_SIZE, GFP_KERNEL); > > check for NULL > > > + /* unlock sector 63 */ > > + val = netxen_rom_rdsr(adapter); > > + val = val & 0xe3; > > + ret = netxen_rom_wrsr(adapter, val); > > + if(ret != FLASH_SUCCESS){ > > + kfree(buffer); > > + return -1; > > + } > > + ret = netxen_rom_wip_poll(adapter); > > + if(ret != FLASH_SUCCESS){ > > + kfree(buffer); > > + return -1; > > + } > > + /* copy sector 0 to sector 63 */ > > + > > + if (netxen_rom_fast_read_words > > + (adapter, CRBINIT_START, buffer, FLASH_SECTOR_SIZE) == -1){ > > function args start on previous line > > > + printk("get_eeprom() fails...\n"); > > + kfree(buffer); > > + return -EIO; > > + } > > + > > + ret = netxen_rom_fast_write_words(adapter, FIXED_START, buffer, > > + FLASH_SECTOR_SIZE); > > like this > > > + if(ret != FLASH_SUCCESS){ > > add space after 'if' > > > + kfree(buffer); > > + return -1; > > + } > > + > > + /* lock sector 63 */ > > + val = netxen_rom_rdsr(adapter); > > + if (!(val & 0x8)) { > > + val |= (0x1 << 2); > > + /* lock sector 63 */ > > + if (netxen_rom_wrsr(adapter, val) == 0) { > > + ret = netxen_rom_wip_poll(adapter); > > + if(ret != FLASH_SUCCESS){ > > + kfree(buffer); > > + return -1; > > + } > > + /* lock SR writes */ > > + val = val | 0x80; > > + ret = netxen_rom_wip_poll(adapter); > > + if(ret != FLASH_SUCCESS){ > > + kfree(buffer); > > + return -1; > > + } > > + } > > + } > > + kfree(buffer); > > + return ret; > > overall, WAY TOO MANY duplicate 'kfree(buffer)' calls. it is kernel > style to use 'goto' to jump to a single error handling callsite, rather > than all this duplication > > > int netxen_do_rom_se(struct netxen_adapter *adapter, int addr) > > { > > - netxen_rom_wren(adapter); > > + if(netxen_rom_wren(adapter) != 0) > > + return -1; > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); > > + udelay(200); > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); > > + udelay(200); > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, > > - M25P_INSTR_SE); > > + M25P_INSTR_SE); > > + udelay(200); > > why? > > PCI posting bugs? > > > if (netxen_wait_rom_done(adapter)) { > > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); > > return -1; > > } > > + > > return netxen_rom_wip_poll(adapter); > > } > > > > +void check_erased_flash(struct netxen_adapter *adapter, int addr) > > +{ > > + int i; > > + int val; > > + int count = 0, erased_errors =0; > > + int range; > > + > > + if(addr == 0x3e8000) > > + range = 0x3f0000; > > what do these magic numbers mean? why aren't they named constants? > > > + else range = addr + FLASH_SECTOR_SIZE; > > + > > + for(i = addr; i < range; i+=4){ > > + netxen_rom_fast_read(adapter, i, &val); > > + if(val != 0xffffffff) > > + erased_errors++; > > + count++; > > + } > > + > > + if(erased_errors) > > space after 'if' > > > + printk("0x%x out of 0x%x words fail to be erased " > > + "for sector address: %x\n", erased_errors, count, addr); > > naked printk > > > int netxen_rom_se(struct netxen_adapter *adapter, int addr) > > { > > int ret = 0; > > @@ -465,6 +668,63 @@ int netxen_rom_se(struct netxen_adapter > > } > > ret = netxen_do_rom_se(adapter, addr); > > netxen_rom_unlock(adapter); > > + schedule(); > > + check_erased_flash(adapter, addr); > > + return ret; > > why are you calling schedule() here? more likely you want to call > msleep(), I'm guessing. > > > +int > > +netxen_flash_erase_sections(struct netxen_adapter *adapter, int start, > > int end) +{ > > + int ret = FLASH_SUCCESS; > > + int i; > > + for (i = start; i < end; i++) { > > + ret = netxen_rom_se(adapter, i*FLASH_SECTOR_SIZE); > > + if (ret) > > + break; > > + if (netxen_rom_wip_poll(adapter) != 0) { > > + ret = -1; > > + break; > > + } > > + } > > + return(ret); > > +} > > + > > +int > > +netxen_flash_erase_secondary(struct netxen_adapter *adapter) > > +{ > > + int ret = FLASH_SUCCESS; > > + int start, end; > > + > > + start = SECONDARY_START/FLASH_SECTOR_SIZE; > > + end = USER_START/FLASH_SECTOR_SIZE; > > + netxen_flash_erase_sections(adapter, start, end); > > + > > + return(ret); > > +} > > + > > +int > > +netxen_flash_erase_primary(struct netxen_adapter *adapter) > > +{ > > + int ret = FLASH_SUCCESS; > > + int start, end; > > + > > + start = PRIMARY_START/FLASH_SECTOR_SIZE; > > + end = SECONDARY_START/FLASH_SECTOR_SIZE; > > + ret = netxen_flash_erase_sections(adapter, start, end); > > + > > + return(ret); > > +} > > + > > +int netxen_flash_unlock(struct netxen_adapter *adapter) > > +{ > > + int ret = 0; > > + > > + if (netxen_rom_wrsr(adapter, 0) != 0) > > + ret = -1; > > + if (netxen_rom_wren(adapter) != 0) > > + ret = -1; > > + > > return ret; > > } - 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