From 50f77cddfb8487e862d1a95bf8ad0a25177959e6 Mon Sep 17 00:00:00 2001 From: Geert Uytterhoeven Date: Sun, 26 Oct 2008 17:04:38 +0100 Subject: [PATCH] --- yaml --- r: 117820 b: refs/heads/master c: dd56b638951936cda945ba5641cc44927a5f1c6d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/ata/libata-scsi.c | 6 +-- trunk/drivers/hwmon/w83781d.c | 4 +- trunk/drivers/ide/icside.c | 4 +- trunk/drivers/ide/rapide.c | 4 +- trunk/drivers/net/r8169.c | 88 ++++++++++++++++++++++++++++++++ trunk/fs/ext3/dir.c | 20 +++++--- trunk/fs/ext4/dir.c | 20 +++++--- trunk/init/main.c | 3 +- trunk/kernel/stop_machine.c | 2 +- trunk/scripts/kconfig/confdata.c | 3 +- 11 files changed, 125 insertions(+), 31 deletions(-) diff --git a/[refs] b/[refs] index 76967356bb32..9dfaf1f091a0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e383d56487062275e9971094f2efcca34227ee60 +refs/heads/master: dd56b638951936cda945ba5641cc44927a5f1c6d diff --git a/trunk/drivers/ata/libata-scsi.c b/trunk/drivers/ata/libata-scsi.c index 4b95c4387e9e..d5b9b7266c8b 100644 --- a/trunk/drivers/ata/libata-scsi.c +++ b/trunk/drivers/ata/libata-scsi.c @@ -708,11 +708,7 @@ static struct ata_queued_cmd *ata_scsi_qc_new(struct ata_device *dev, { struct ata_queued_cmd *qc; - if (cmd->request->tag != -1) - qc = ata_qc_new_init(dev, cmd->request->tag); - else - qc = ata_qc_new_init(dev, 0); - + qc = ata_qc_new_init(dev, cmd->request->tag); if (qc) { qc->scsicmd = cmd; qc->scsidone = done; diff --git a/trunk/drivers/hwmon/w83781d.c b/trunk/drivers/hwmon/w83781d.c index d4d1b859d4f1..fc12bd412e3a 100644 --- a/trunk/drivers/hwmon/w83781d.c +++ b/trunk/drivers/hwmon/w83781d.c @@ -1968,7 +1968,7 @@ w83781d_isa_register(void) return res; } -static void __exit +static void w83781d_isa_unregister(void) { if (pdev) { @@ -2017,7 +2017,7 @@ w83781d_isa_register(void) return 0; } -static void __exit +static void w83781d_isa_unregister(void) { } diff --git a/trunk/drivers/ide/icside.c b/trunk/drivers/ide/icside.c index 2d848010499d..76bdc9a27f6f 100644 --- a/trunk/drivers/ide/icside.c +++ b/trunk/drivers/ide/icside.c @@ -690,9 +690,9 @@ static int __init icside_init(void) return ecard_register_driver(&icside_driver); } -static void __exit icside_exit(void) +static void __exit icside_exit(void); { - ecard_remove_driver(&icside_driver); + ecard_unregister_driver(&icside_driver); } MODULE_AUTHOR("Russell King "); diff --git a/trunk/drivers/ide/rapide.c b/trunk/drivers/ide/rapide.c index d5003ca69801..78d27d9ae430 100644 --- a/trunk/drivers/ide/rapide.c +++ b/trunk/drivers/ide/rapide.c @@ -11,7 +11,7 @@ #include -static const struct ide_port_info rapide_port_info = { +static struct const ide_port_info rapide_port_info = { .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA, }; @@ -97,7 +97,7 @@ static int __init rapide_init(void) static void __exit rapide_exit(void) { - ecard_remove_driver(&rapide_driver); + ecard_unregister_driver(&rapide_driver); } MODULE_LICENSE("GPL"); diff --git a/trunk/drivers/net/r8169.c b/trunk/drivers/net/r8169.c index 4b7cb389dc49..2b4e975770f3 100644 --- a/trunk/drivers/net/r8169.c +++ b/trunk/drivers/net/r8169.c @@ -1915,6 +1915,92 @@ static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp) } } +static int rtl_eeprom_read(struct pci_dev *pdev, int cap, int addr, __le32 *val) +{ + int ret, count = 100; + u16 status = 0; + u32 value; + + ret = pci_write_config_word(pdev, cap + PCI_VPD_ADDR, addr); + if (ret < 0) + return ret; + + do { + udelay(10); + ret = pci_read_config_word(pdev, cap + PCI_VPD_ADDR, &status); + if (ret < 0) + return ret; + } while (!(status & PCI_VPD_ADDR_F) && --count); + + if (!(status & PCI_VPD_ADDR_F)) + return -ETIMEDOUT; + + ret = pci_read_config_dword(pdev, cap + PCI_VPD_DATA, &value); + if (ret < 0) + return ret; + + *val = cpu_to_le32(value); + + return 0; +} + +static void rtl_init_mac_address(struct rtl8169_private *tp, + void __iomem *ioaddr) +{ + struct pci_dev *pdev = tp->pci_dev; + int vpd_cap; + __le32 sig; + u8 mac[8]; + u8 cfg1; + + cfg1 = RTL_R8(Config1); + if (!(cfg1 & VPD)) { + if (netif_msg_probe(tp)) + dev_info(&pdev->dev, "VPD access disabled, enabling\n"); + RTL_W8(Cfg9346, Cfg9346_Unlock); + RTL_W8(Config1, cfg1 | VPD); + RTL_W8(Cfg9346, Cfg9346_Lock); + } + + vpd_cap = pci_find_capability(pdev, PCI_CAP_ID_VPD); + if (!vpd_cap) + return; + + if (rtl_eeprom_read(pdev, vpd_cap, RTL_EEPROM_SIG_ADDR, &sig) < 0) + return; + + if ((sig & RTL_EEPROM_SIG_MASK) != RTL_EEPROM_SIG) { + dev_info(&pdev->dev, "Missing EEPROM signature: %08x\n", sig); + return; + } + + /* + * MAC address is stored in EEPROM at offset 0x0e + * Realtek says: "The VPD address does not have to be a DWORD-aligned + * address as defined in the PCI 2.2 Specifications, but the VPD data + * is always consecutive 4-byte data starting from the VPD address + * specified." + */ + if (rtl_eeprom_read(pdev, vpd_cap, 0x000e, (__le32*)&mac[0]) < 0 || + rtl_eeprom_read(pdev, vpd_cap, 0x0012, (__le32*)&mac[4]) < 0) { + if (netif_msg_probe(tp)) { + dev_warn(&pdev->dev, + "reading MAC address from EEPROM failed\n"); + } + return; + } + + if (netif_msg_probe(tp)) { + DECLARE_MAC_BUF(buf); + + dev_info(&pdev->dev, "MAC address found in EEPROM: %s\n", + print_mac(buf, mac)); + } + + if (is_valid_ether_addr(mac)) + rtl_rar_set(tp, mac); +} + static int __devinit rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -2092,6 +2178,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) tp->mmio_addr = ioaddr; + rtl_init_mac_address(tp, ioaddr); + /* Get MAC address */ for (i = 0; i < MAC_ADDR_LEN; i++) dev->dev_addr[i] = RTL_R8(MAC0 + i); diff --git a/trunk/fs/ext3/dir.c b/trunk/fs/ext3/dir.c index 5853f4440af4..4c82531ea0a8 100644 --- a/trunk/fs/ext3/dir.c +++ b/trunk/fs/ext3/dir.c @@ -456,8 +456,17 @@ static int ext3_dx_readdir(struct file * filp, if (info->extra_fname) { if (call_filldir(filp, dirent, filldir, info->extra_fname)) goto finished; + info->extra_fname = NULL; - goto next_node; + info->curr_node = rb_next(info->curr_node); + if (!info->curr_node) { + if (info->next_hash == ~0) { + filp->f_pos = EXT3_HTREE_EOF; + goto finished; + } + info->curr_hash = info->next_hash; + info->curr_minor_hash = 0; + } } else if (!info->curr_node) info->curr_node = rb_first(&info->root); @@ -489,14 +498,9 @@ static int ext3_dx_readdir(struct file * filp, info->curr_minor_hash = fname->minor_hash; if (call_filldir(filp, dirent, filldir, fname)) break; - next_node: + info->curr_node = rb_next(info->curr_node); - if (info->curr_node) { - fname = rb_entry(info->curr_node, struct fname, - rb_hash); - info->curr_hash = fname->hash; - info->curr_minor_hash = fname->minor_hash; - } else { + if (!info->curr_node) { if (info->next_hash == ~0) { filp->f_pos = EXT3_HTREE_EOF; break; diff --git a/trunk/fs/ext4/dir.c b/trunk/fs/ext4/dir.c index fed5b610df5a..3ca6a2b7632d 100644 --- a/trunk/fs/ext4/dir.c +++ b/trunk/fs/ext4/dir.c @@ -459,8 +459,17 @@ static int ext4_dx_readdir(struct file *filp, if (info->extra_fname) { if (call_filldir(filp, dirent, filldir, info->extra_fname)) goto finished; + info->extra_fname = NULL; - goto next_node; + info->curr_node = rb_next(info->curr_node); + if (!info->curr_node) { + if (info->next_hash == ~0) { + filp->f_pos = EXT4_HTREE_EOF; + goto finished; + } + info->curr_hash = info->next_hash; + info->curr_minor_hash = 0; + } } else if (!info->curr_node) info->curr_node = rb_first(&info->root); @@ -492,14 +501,9 @@ static int ext4_dx_readdir(struct file *filp, info->curr_minor_hash = fname->minor_hash; if (call_filldir(filp, dirent, filldir, fname)) break; - next_node: + info->curr_node = rb_next(info->curr_node); - if (info->curr_node) { - fname = rb_entry(info->curr_node, struct fname, - rb_hash); - info->curr_hash = fname->hash; - info->curr_minor_hash = fname->minor_hash; - } else { + if (!info->curr_node) { if (info->next_hash == ~0) { filp->f_pos = EXT4_HTREE_EOF; break; diff --git a/trunk/init/main.c b/trunk/init/main.c index 7e117a231af1..130d1a0eef11 100644 --- a/trunk/init/main.c +++ b/trunk/init/main.c @@ -768,7 +768,6 @@ static void __init do_initcalls(void) static void __init do_basic_setup(void) { rcu_init_sched(); /* needed by module_init stage. */ - init_workqueues(); usermodehelper_init(); driver_init(); init_irq_proc(); @@ -852,6 +851,8 @@ static int __init kernel_init(void * unused) cad_pid = task_pid(current); + init_workqueues(); + smp_prepare_cpus(setup_max_cpus); do_pre_smp_initcalls(); diff --git a/trunk/kernel/stop_machine.c b/trunk/kernel/stop_machine.c index 9bc4c00872c9..8aff79d90ddc 100644 --- a/trunk/kernel/stop_machine.c +++ b/trunk/kernel/stop_machine.c @@ -160,4 +160,4 @@ static int __init stop_machine_init(void) stop_machine_work = alloc_percpu(struct work_struct); return 0; } -core_initcall(stop_machine_init); +early_initcall(stop_machine_init); diff --git a/trunk/scripts/kconfig/confdata.c b/trunk/scripts/kconfig/confdata.c index 830d9eae11f9..b91cf241a539 100644 --- a/trunk/scripts/kconfig/confdata.c +++ b/trunk/scripts/kconfig/confdata.c @@ -852,7 +852,8 @@ void conf_set_all_new_symbols(enum conf_def_mode mode) } - sym_clear_all_valid(); + if (modules_sym) + sym_calc_value(modules_sym); if (mode != def_random) return;