From 8fb6f732c389847dece403b7470d6d3d2778804a Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Mon, 28 Aug 2006 22:12:54 -0700 Subject: [E100]: Add module option to ignore bad EEPROM checksums. Several people run into the situation where the E100 EEPROM contents are fine, but the checksum hasn't been set properly. This renders the device useless for them even though it would function correctly. The default is off, which retains the current behavior. Signed-off-by: David S. Miller --- drivers/net/e100.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'drivers/net') diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 91ef5f2fd768..ce850f1078b5 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -173,8 +173,11 @@ MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); static int debug = 3; +static int eeprom_bad_csum_allow = 0; module_param(debug, int, 0); +module_param(eeprom_bad_csum_allow, int, 0); MODULE_PARM_DESC(debug, "Debug level (0=none,...,16=all)"); +MODULE_PARM_DESC(eeprom_bad_csum_allow, "Allow bad eeprom checksums"); #define DPRINTK(nlevel, klevel, fmt, args...) \ (void)((NETIF_MSG_##nlevel & nic->msg_enable) && \ printk(KERN_##klevel PFX "%s: %s: " fmt, nic->netdev->name, \ @@ -756,7 +759,8 @@ static int e100_eeprom_load(struct nic *nic) checksum = le16_to_cpu(0xBABA - checksum); if(checksum != nic->eeprom[nic->eeprom_wc - 1]) { DPRINTK(PROBE, ERR, "EEPROM corrupted\n"); - return -EAGAIN; + if (!eeprom_bad_csum_allow) + return -EAGAIN; } return 0; -- cgit v1.2.3 From ee1377c3eef4238d89b2f99fa4d0bbbad3078b64 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 29 Aug 2006 21:18:45 -0700 Subject: [STRIP]: Fix neighbour table refcount leak. Found by inspection. The STRIP driver does neigh_lookup() but never releases. This driver shouldn't being doing gratuitous arp anyway. Untested, obviously, because of lack of hardware. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/wireless/strip.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'drivers/net') diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index fd31885c6844..ccaf28e8db0a 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c @@ -467,6 +467,7 @@ static int arp_query(unsigned char *haddr, u32 paddr, struct net_device *dev) { struct neighbour *neighbor_entry; + int ret = 0; neighbor_entry = neigh_lookup(&arp_tbl, &paddr, dev); @@ -474,10 +475,11 @@ static int arp_query(unsigned char *haddr, u32 paddr, neighbor_entry->used = jiffies; if (neighbor_entry->nud_state & NUD_VALID) { memcpy(haddr, neighbor_entry->ha, dev->addr_len); - return 1; + ret = 1; } + neigh_release(neighbor_entry); } - return 0; + return ret; } static void DumpData(char *msg, struct strip *strip_info, __u8 * ptr, -- cgit v1.2.3 From 404dda854b8bb04df72405d5088fa3e6100aef36 Mon Sep 17 00:00:00 2001 From: Krzysztof Helt Date: Mon, 28 Aug 2006 23:28:16 -0700 Subject: [SUNLANCE]: Fix probing problem. The current probe table causes ledma and lebuffer "le" devices to get probed twice which is not what we want. Match just "le" and look directly at the parent to get the correct top-level node information. Signed-off-by: Krzysztof Helt Signed-off-by: David S. Miller --- drivers/net/sunlance.c | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) (limited to 'drivers/net') diff --git a/drivers/net/sunlance.c b/drivers/net/sunlance.c index 0e3fdf7c6dd3..ec0413609f36 100644 --- a/drivers/net/sunlance.c +++ b/drivers/net/sunlance.c @@ -1566,20 +1566,21 @@ static int __exit sunlance_sun4_remove(void) static int __devinit sunlance_sbus_probe(struct of_device *dev, const struct of_device_id *match) { struct sbus_dev *sdev = to_sbus_device(&dev->dev); - struct device_node *dp = dev->node; int err; - if (!strcmp(dp->name, "le")) { - err = sparc_lance_probe_one(sdev, NULL, NULL); - } else if (!strcmp(dp->name, "ledma")) { - struct sbus_dma *ledma = find_ledma(sdev); + if (sdev->parent) { + struct of_device *parent = &sdev->parent->ofdev; - err = sparc_lance_probe_one(sdev->child, ledma, NULL); - } else { - BUG_ON(strcmp(dp->name, "lebuffer")); + if (!strcmp(parent->node->name, "ledma")) { + struct sbus_dma *ledma = find_ledma(to_sbus_device(&parent->dev)); - err = sparc_lance_probe_one(sdev->child, NULL, sdev); - } + err = sparc_lance_probe_one(sdev, ledma, NULL); + } else if (!strcmp(parent->node->name, "lebuffer")) { + err = sparc_lance_probe_one(sdev, NULL, to_sbus_device(&parent->dev)); + } else + err = sparc_lance_probe_one(sdev, NULL, NULL); + } else + err = sparc_lance_probe_one(sdev, NULL, NULL); return err; } @@ -1604,12 +1605,6 @@ static struct of_device_id sunlance_sbus_match[] = { { .name = "le", }, - { - .name = "ledma", - }, - { - .name = "lebuffer", - }, {}, }; -- cgit v1.2.3