diff options
64 files changed, 731 insertions, 337 deletions
diff --git a/arch/i386/kernel/traps.c b/arch/i386/kernel/traps.c index cfffe3dd9e83..47b0bef335bd 100644 --- a/arch/i386/kernel/traps.c +++ b/arch/i386/kernel/traps.c | |||
@@ -100,36 +100,45 @@ asmlinkage void machine_check(void); | |||
100 | int kstack_depth_to_print = 24; | 100 | int kstack_depth_to_print = 24; |
101 | static unsigned int code_bytes = 64; | 101 | static unsigned int code_bytes = 64; |
102 | 102 | ||
103 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) | 103 | static inline int valid_stack_ptr(struct thread_info *tinfo, void *p, unsigned size) |
104 | { | 104 | { |
105 | return p > (void *)tinfo && | 105 | return p > (void *)tinfo && |
106 | p < (void *)tinfo + THREAD_SIZE - 3; | 106 | p <= (void *)tinfo + THREAD_SIZE - size; |
107 | } | 107 | } |
108 | 108 | ||
109 | /* The form of the top of the frame on the stack */ | ||
110 | struct stack_frame { | ||
111 | struct stack_frame *next_frame; | ||
112 | unsigned long return_address; | ||
113 | }; | ||
114 | |||
109 | static inline unsigned long print_context_stack(struct thread_info *tinfo, | 115 | static inline unsigned long print_context_stack(struct thread_info *tinfo, |
110 | unsigned long *stack, unsigned long ebp, | 116 | unsigned long *stack, unsigned long ebp, |
111 | struct stacktrace_ops *ops, void *data) | 117 | struct stacktrace_ops *ops, void *data) |
112 | { | 118 | { |
113 | unsigned long addr; | ||
114 | |||
115 | #ifdef CONFIG_FRAME_POINTER | 119 | #ifdef CONFIG_FRAME_POINTER |
116 | while (valid_stack_ptr(tinfo, (void *)ebp)) { | 120 | struct stack_frame *frame = (struct stack_frame *)ebp; |
117 | unsigned long new_ebp; | 121 | while (valid_stack_ptr(tinfo, frame, sizeof(*frame))) { |
118 | addr = *(unsigned long *)(ebp + 4); | 122 | struct stack_frame *next; |
123 | unsigned long addr; | ||
124 | |||
125 | addr = frame->return_address; | ||
119 | ops->address(data, addr); | 126 | ops->address(data, addr); |
120 | /* | 127 | /* |
121 | * break out of recursive entries (such as | 128 | * break out of recursive entries (such as |
122 | * end_of_stack_stop_unwind_function). Also, | 129 | * end_of_stack_stop_unwind_function). Also, |
123 | * we can never allow a frame pointer to | 130 | * we can never allow a frame pointer to |
124 | * move downwards! | 131 | * move downwards! |
125 | */ | 132 | */ |
126 | new_ebp = *(unsigned long *)ebp; | 133 | next = frame->next_frame; |
127 | if (new_ebp <= ebp) | 134 | if (next <= frame) |
128 | break; | 135 | break; |
129 | ebp = new_ebp; | 136 | frame = next; |
130 | } | 137 | } |
131 | #else | 138 | #else |
132 | while (valid_stack_ptr(tinfo, stack)) { | 139 | while (valid_stack_ptr(tinfo, stack, sizeof(*stack))) { |
140 | unsigned long addr; | ||
141 | |||
133 | addr = *stack++; | 142 | addr = *stack++; |
134 | if (__kernel_text_address(addr)) | 143 | if (__kernel_text_address(addr)) |
135 | ops->address(data, addr); | 144 | ops->address(data, addr); |
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 430fcf4f9ef3..945466954724 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/libata.h> | 26 | #include <linux/libata.h> |
27 | 27 | ||
28 | #define DRV_NAME "ata_generic" | 28 | #define DRV_NAME "ata_generic" |
29 | #define DRV_VERSION "0.2.12" | 29 | #define DRV_VERSION "0.2.13" |
30 | 30 | ||
31 | /* | 31 | /* |
32 | * A generic parallel ATA driver using libata | 32 | * A generic parallel ATA driver using libata |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 071d274afaab..e40c94f5f59d 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -94,7 +94,7 @@ | |||
94 | #include <linux/dmi.h> | 94 | #include <linux/dmi.h> |
95 | 95 | ||
96 | #define DRV_NAME "ata_piix" | 96 | #define DRV_NAME "ata_piix" |
97 | #define DRV_VERSION "2.11" | 97 | #define DRV_VERSION "2.12" |
98 | 98 | ||
99 | enum { | 99 | enum { |
100 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ | 100 | PIIX_IOCFG = 0x54, /* IDE I/O configuration register */ |
@@ -130,6 +130,7 @@ enum { | |||
130 | ich6m_sata_ahci = 8, | 130 | ich6m_sata_ahci = 8, |
131 | ich8_sata_ahci = 9, | 131 | ich8_sata_ahci = 9, |
132 | piix_pata_mwdma = 10, /* PIIX3 MWDMA only */ | 132 | piix_pata_mwdma = 10, /* PIIX3 MWDMA only */ |
133 | tolapai_sata_ahci = 11, | ||
133 | 134 | ||
134 | /* constants for mapping table */ | 135 | /* constants for mapping table */ |
135 | P0 = 0, /* port 0 */ | 136 | P0 = 0, /* port 0 */ |
@@ -253,6 +254,8 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
253 | { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, | 254 | { 0x8086, 0x292d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, |
254 | /* SATA Controller IDE (ICH9M) */ | 255 | /* SATA Controller IDE (ICH9M) */ |
255 | { 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, | 256 | { 0x8086, 0x292e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_ahci }, |
257 | /* SATA Controller IDE (Tolapai) */ | ||
258 | { 0x8086, 0x5028, PCI_ANY_ID, PCI_ANY_ID, 0, 0, tolapai_sata_ahci }, | ||
256 | 259 | ||
257 | { } /* terminate list */ | 260 | { } /* terminate list */ |
258 | }; | 261 | }; |
@@ -441,12 +444,25 @@ static const struct piix_map_db ich8_map_db = { | |||
441 | }, | 444 | }, |
442 | }; | 445 | }; |
443 | 446 | ||
447 | static const struct piix_map_db tolapai_map_db = { | ||
448 | .mask = 0x3, | ||
449 | .port_enable = 0x3, | ||
450 | .map = { | ||
451 | /* PM PS SM SS MAP */ | ||
452 | { P0, NA, P1, NA }, /* 00b */ | ||
453 | { RV, RV, RV, RV }, /* 01b */ | ||
454 | { RV, RV, RV, RV }, /* 10b */ | ||
455 | { RV, RV, RV, RV }, | ||
456 | }, | ||
457 | }; | ||
458 | |||
444 | static const struct piix_map_db *piix_map_db_table[] = { | 459 | static const struct piix_map_db *piix_map_db_table[] = { |
445 | [ich5_sata] = &ich5_map_db, | 460 | [ich5_sata] = &ich5_map_db, |
446 | [ich6_sata] = &ich6_map_db, | 461 | [ich6_sata] = &ich6_map_db, |
447 | [ich6_sata_ahci] = &ich6_map_db, | 462 | [ich6_sata_ahci] = &ich6_map_db, |
448 | [ich6m_sata_ahci] = &ich6m_map_db, | 463 | [ich6m_sata_ahci] = &ich6m_map_db, |
449 | [ich8_sata_ahci] = &ich8_map_db, | 464 | [ich8_sata_ahci] = &ich8_map_db, |
465 | [tolapai_sata_ahci] = &tolapai_map_db, | ||
450 | }; | 466 | }; |
451 | 467 | ||
452 | static struct ata_port_info piix_port_info[] = { | 468 | static struct ata_port_info piix_port_info[] = { |
@@ -560,6 +576,17 @@ static struct ata_port_info piix_port_info[] = { | |||
560 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ | 576 | .mwdma_mask = 0x06, /* mwdma1-2 ?? CHECK 0 should be ok but slow */ |
561 | .port_ops = &piix_pata_ops, | 577 | .port_ops = &piix_pata_ops, |
562 | }, | 578 | }, |
579 | |||
580 | /* tolapai_sata_ahci: 11: */ | ||
581 | { | ||
582 | .sht = &piix_sht, | ||
583 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SCR | | ||
584 | PIIX_FLAG_AHCI, | ||
585 | .pio_mask = 0x1f, /* pio0-4 */ | ||
586 | .mwdma_mask = 0x07, /* mwdma0-2 */ | ||
587 | .udma_mask = ATA_UDMA6, | ||
588 | .port_ops = &piix_sata_ops, | ||
589 | }, | ||
563 | }; | 590 | }; |
564 | 591 | ||
565 | static struct pci_bits piix_enable_bits[] = { | 592 | static struct pci_bits piix_enable_bits[] = { |
@@ -908,6 +935,13 @@ static int piix_broken_suspend(void) | |||
908 | }, | 935 | }, |
909 | }, | 936 | }, |
910 | { | 937 | { |
938 | .ident = "Satellite U200", | ||
939 | .matches = { | ||
940 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
941 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U200"), | ||
942 | }, | ||
943 | }, | ||
944 | { | ||
911 | .ident = "Satellite U205", | 945 | .ident = "Satellite U205", |
912 | .matches = { | 946 | .matches = { |
913 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | 947 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
@@ -1139,6 +1173,39 @@ static void __devinit piix_init_sata_map(struct pci_dev *pdev, | |||
1139 | hpriv->map = map; | 1173 | hpriv->map = map; |
1140 | } | 1174 | } |
1141 | 1175 | ||
1176 | static void piix_iocfg_bit18_quirk(struct pci_dev *pdev) | ||
1177 | { | ||
1178 | static struct dmi_system_id sysids[] = { | ||
1179 | { | ||
1180 | /* Clevo M570U sets IOCFG bit 18 if the cdrom | ||
1181 | * isn't used to boot the system which | ||
1182 | * disables the channel. | ||
1183 | */ | ||
1184 | .ident = "M570U", | ||
1185 | .matches = { | ||
1186 | DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."), | ||
1187 | DMI_MATCH(DMI_PRODUCT_NAME, "M570U"), | ||
1188 | }, | ||
1189 | }, | ||
1190 | }; | ||
1191 | u32 iocfg; | ||
1192 | |||
1193 | if (!dmi_check_system(sysids)) | ||
1194 | return; | ||
1195 | |||
1196 | /* The datasheet says that bit 18 is NOOP but certain systems | ||
1197 | * seem to use it to disable a channel. Clear the bit on the | ||
1198 | * affected systems. | ||
1199 | */ | ||
1200 | pci_read_config_dword(pdev, PIIX_IOCFG, &iocfg); | ||
1201 | if (iocfg & (1 << 18)) { | ||
1202 | dev_printk(KERN_INFO, &pdev->dev, | ||
1203 | "applying IOCFG bit18 quirk\n"); | ||
1204 | iocfg &= ~(1 << 18); | ||
1205 | pci_write_config_dword(pdev, PIIX_IOCFG, iocfg); | ||
1206 | } | ||
1207 | } | ||
1208 | |||
1142 | /** | 1209 | /** |
1143 | * piix_init_one - Register PIIX ATA PCI device with kernel services | 1210 | * piix_init_one - Register PIIX ATA PCI device with kernel services |
1144 | * @pdev: PCI device to register | 1211 | * @pdev: PCI device to register |
@@ -1200,6 +1267,9 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
1200 | piix_map_db_table[ent->driver_data]); | 1267 | piix_map_db_table[ent->driver_data]); |
1201 | } | 1268 | } |
1202 | 1269 | ||
1270 | /* apply IOCFG bit18 quirk */ | ||
1271 | piix_iocfg_bit18_quirk(pdev); | ||
1272 | |||
1203 | /* On ICH5, some BIOSen disable the interrupt using the | 1273 | /* On ICH5, some BIOSen disable the interrupt using the |
1204 | * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. | 1274 | * PCI_COMMAND_INTX_DISABLE bit added in PCI 2.3. |
1205 | * On ICH6, this bit has the same effect, but only when | 1275 | * On ICH6, this bit has the same effect, but only when |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 2ad4dda6d4a7..a3ee087223de 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -1911,8 +1911,9 @@ int ata_dev_configure(struct ata_device *dev) | |||
1911 | dev->flags |= ATA_DFLAG_FLUSH_EXT; | 1911 | dev->flags |= ATA_DFLAG_FLUSH_EXT; |
1912 | } | 1912 | } |
1913 | 1913 | ||
1914 | if (ata_id_hpa_enabled(dev->id)) | 1914 | if (!(dev->horkage & ATA_HORKAGE_BROKEN_HPA) && |
1915 | dev->n_sectors = ata_hpa_resize(dev); | 1915 | ata_id_hpa_enabled(dev->id)) |
1916 | dev->n_sectors = ata_hpa_resize(dev); | ||
1916 | 1917 | ||
1917 | /* config NCQ */ | 1918 | /* config NCQ */ |
1918 | ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc)); | 1919 | ata_dev_config_ncq(dev, ncq_desc, sizeof(ncq_desc)); |
@@ -3795,7 +3796,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
3795 | { "ST9160821AS", "3.CLF", ATA_HORKAGE_NONCQ, }, | 3796 | { "ST9160821AS", "3.CLF", ATA_HORKAGE_NONCQ, }, |
3796 | { "SAMSUNG HD401LJ", "ZZ100-15", ATA_HORKAGE_NONCQ, }, | 3797 | { "SAMSUNG HD401LJ", "ZZ100-15", ATA_HORKAGE_NONCQ, }, |
3797 | 3798 | ||
3798 | /* Devices with NCQ limits */ | 3799 | /* devices which puke on READ_NATIVE_MAX */ |
3800 | { "HDS724040KLSA80", "KFAOA20N", ATA_HORKAGE_BROKEN_HPA, }, | ||
3801 | { "WDC WD3200JD-00KLB0", "WD-WCAMR1130137", ATA_HORKAGE_BROKEN_HPA }, | ||
3802 | { "WDC WD2500JD-00HBB0", "WD-WMAL71490727", ATA_HORKAGE_BROKEN_HPA }, | ||
3803 | { "MAXTOR 6L080L4", "A93.0500", ATA_HORKAGE_BROKEN_HPA }, | ||
3799 | 3804 | ||
3800 | /* End Marker */ | 3805 | /* End Marker */ |
3801 | { } | 3806 | { } |
@@ -3985,6 +3990,11 @@ static unsigned int ata_dev_init_params(struct ata_device *dev, | |||
3985 | tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */ | 3990 | tf.device |= (heads - 1) & 0x0f; /* max head = num. of heads - 1 */ |
3986 | 3991 | ||
3987 | err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); | 3992 | err_mask = ata_exec_internal(dev, &tf, NULL, DMA_NONE, NULL, 0); |
3993 | /* A clean abort indicates an original or just out of spec drive | ||
3994 | and we should continue as we issue the setup based on the | ||
3995 | drive reported working geometry */ | ||
3996 | if (err_mask == AC_ERR_DEV && (tf.feature & ATA_ABORTED)) | ||
3997 | err_mask = 0; | ||
3988 | 3998 | ||
3989 | DPRINTK("EXIT, err_mask=%x\n", err_mask); | 3999 | DPRINTK("EXIT, err_mask=%x\n", err_mask); |
3990 | return err_mask; | 4000 | return err_mask; |
diff --git a/drivers/ata/pata_ali.c b/drivers/ata/pata_ali.c index e8a28e94fe47..94e5edc12ac9 100644 --- a/drivers/ata/pata_ali.c +++ b/drivers/ata/pata_ali.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/dmi.h> | 34 | #include <linux/dmi.h> |
35 | 35 | ||
36 | #define DRV_NAME "pata_ali" | 36 | #define DRV_NAME "pata_ali" |
37 | #define DRV_VERSION "0.7.4" | 37 | #define DRV_VERSION "0.7.5" |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * Cable special cases | 40 | * Cable special cases |
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index b09facad63e1..04048fcf6305 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c | |||
@@ -25,7 +25,7 @@ | |||
25 | #include <linux/libata.h> | 25 | #include <linux/libata.h> |
26 | 26 | ||
27 | #define DRV_NAME "pata_amd" | 27 | #define DRV_NAME "pata_amd" |
28 | #define DRV_VERSION "0.3.8" | 28 | #define DRV_VERSION "0.3.9" |
29 | 29 | ||
30 | /** | 30 | /** |
31 | * timing_setup - shared timing computation and load | 31 | * timing_setup - shared timing computation and load |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index 80509be49e7a..86f85a2cab7e 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/libata.h> | 22 | #include <linux/libata.h> |
23 | 23 | ||
24 | #define DRV_NAME "pata_atiixp" | 24 | #define DRV_NAME "pata_atiixp" |
25 | #define DRV_VERSION "0.4.5" | 25 | #define DRV_VERSION "0.4.6" |
26 | 26 | ||
27 | enum { | 27 | enum { |
28 | ATIIXP_IDE_PIO_TIMING = 0x40, | 28 | ATIIXP_IDE_PIO_TIMING = 0x40, |
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c index 7dc76e71bd55..e2459088cdcd 100644 --- a/drivers/ata/pata_cs5520.c +++ b/drivers/ata/pata_cs5520.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/libata.h> | 41 | #include <linux/libata.h> |
42 | 42 | ||
43 | #define DRV_NAME "pata_cs5520" | 43 | #define DRV_NAME "pata_cs5520" |
44 | #define DRV_VERSION "0.6.5" | 44 | #define DRV_VERSION "0.6.6" |
45 | 45 | ||
46 | struct pio_clocks | 46 | struct pio_clocks |
47 | { | 47 | { |
diff --git a/drivers/ata/pata_cs5530.c b/drivers/ata/pata_cs5530.c index 68f150a1e2f4..c6066aa43ec8 100644 --- a/drivers/ata/pata_cs5530.c +++ b/drivers/ata/pata_cs5530.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/dmi.h> | 35 | #include <linux/dmi.h> |
36 | 36 | ||
37 | #define DRV_NAME "pata_cs5530" | 37 | #define DRV_NAME "pata_cs5530" |
38 | #define DRV_VERSION "0.7.3" | 38 | #define DRV_VERSION "0.7.4" |
39 | 39 | ||
40 | static void __iomem *cs5530_port_base(struct ata_port *ap) | 40 | static void __iomem *cs5530_port_base(struct ata_port *ap) |
41 | { | 41 | { |
diff --git a/drivers/ata/pata_isapnp.c b/drivers/ata/pata_isapnp.c index 91a396fa5b20..9e553c54203a 100644 --- a/drivers/ata/pata_isapnp.c +++ b/drivers/ata/pata_isapnp.c | |||
@@ -17,7 +17,7 @@ | |||
17 | #include <linux/libata.h> | 17 | #include <linux/libata.h> |
18 | 18 | ||
19 | #define DRV_NAME "pata_isapnp" | 19 | #define DRV_NAME "pata_isapnp" |
20 | #define DRV_VERSION "0.2.1" | 20 | #define DRV_VERSION "0.2.2" |
21 | 21 | ||
22 | static struct scsi_host_template isapnp_sht = { | 22 | static struct scsi_host_template isapnp_sht = { |
23 | .module = THIS_MODULE, | 23 | .module = THIS_MODULE, |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index 7225124d96c2..ed637ae33ece 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
@@ -80,7 +80,7 @@ | |||
80 | 80 | ||
81 | 81 | ||
82 | #define DRV_NAME "pata_it821x" | 82 | #define DRV_NAME "pata_it821x" |
83 | #define DRV_VERSION "0.3.7" | 83 | #define DRV_VERSION "0.3.8" |
84 | 84 | ||
85 | struct it821x_dev | 85 | struct it821x_dev |
86 | { | 86 | { |
diff --git a/drivers/ata/pata_marvell.c b/drivers/ata/pata_marvell.c index 87594c04d3a3..ae206f35f747 100644 --- a/drivers/ata/pata_marvell.c +++ b/drivers/ata/pata_marvell.c | |||
@@ -192,6 +192,8 @@ static int marvell_init_one (struct pci_dev *pdev, const struct pci_device_id *i | |||
192 | 192 | ||
193 | static const struct pci_device_id marvell_pci_tbl[] = { | 193 | static const struct pci_device_id marvell_pci_tbl[] = { |
194 | { PCI_DEVICE(0x11AB, 0x6101), }, | 194 | { PCI_DEVICE(0x11AB, 0x6101), }, |
195 | { PCI_DEVICE(0x11AB, 0x6121), }, | ||
196 | { PCI_DEVICE(0x11AB, 0x6123), }, | ||
195 | { PCI_DEVICE(0x11AB, 0x6145), }, | 197 | { PCI_DEVICE(0x11AB, 0x6145), }, |
196 | { } /* terminate list */ | 198 | { } /* terminate list */ |
197 | }; | 199 | }; |
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index 182e83c9047b..099f4cdc4cd9 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
@@ -24,7 +24,7 @@ | |||
24 | 24 | ||
25 | 25 | ||
26 | #define DRV_NAME "mpc52xx_ata" | 26 | #define DRV_NAME "mpc52xx_ata" |
27 | #define DRV_VERSION "0.1.0ac2" | 27 | #define DRV_VERSION "0.1.2" |
28 | 28 | ||
29 | 29 | ||
30 | /* Private structures used by the driver */ | 30 | /* Private structures used by the driver */ |
diff --git a/drivers/ata/pata_pcmcia.c b/drivers/ata/pata_pcmcia.c index 6da23feed039..0f2b027624d6 100644 --- a/drivers/ata/pata_pcmcia.c +++ b/drivers/ata/pata_pcmcia.c | |||
@@ -42,7 +42,7 @@ | |||
42 | 42 | ||
43 | 43 | ||
44 | #define DRV_NAME "pata_pcmcia" | 44 | #define DRV_NAME "pata_pcmcia" |
45 | #define DRV_VERSION "0.3.1" | 45 | #define DRV_VERSION "0.3.2" |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * Private data structure to glue stuff together | 48 | * Private data structure to glue stuff together |
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c index e3245b36269a..bb64a986e8f5 100644 --- a/drivers/ata/pata_pdc2027x.c +++ b/drivers/ata/pata_pdc2027x.c | |||
@@ -35,7 +35,7 @@ | |||
35 | #include <linux/libata.h> | 35 | #include <linux/libata.h> |
36 | 36 | ||
37 | #define DRV_NAME "pata_pdc2027x" | 37 | #define DRV_NAME "pata_pdc2027x" |
38 | #define DRV_VERSION "0.9" | 38 | #define DRV_VERSION "1.0" |
39 | #undef PDC_DEBUG | 39 | #undef PDC_DEBUG |
40 | 40 | ||
41 | #ifdef PDC_DEBUG | 41 | #ifdef PDC_DEBUG |
diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c index a909f793ffc1..5086d03f2d7c 100644 --- a/drivers/ata/pata_platform.c +++ b/drivers/ata/pata_platform.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include <linux/pata_platform.h> | 22 | #include <linux/pata_platform.h> |
23 | 23 | ||
24 | #define DRV_NAME "pata_platform" | 24 | #define DRV_NAME "pata_platform" |
25 | #define DRV_VERSION "1.0" | 25 | #define DRV_VERSION "1.1" |
26 | 26 | ||
27 | static int pio_mask = 1; | 27 | static int pio_mask = 1; |
28 | 28 | ||
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index b8b2d11e4180..5edf67b1f3bf 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <linux/libata.h> | 40 | #include <linux/libata.h> |
41 | 41 | ||
42 | #define DRV_NAME "sc1200" | 42 | #define DRV_NAME "sc1200" |
43 | #define DRV_VERSION "0.2.5" | 43 | #define DRV_VERSION "0.2.6" |
44 | 44 | ||
45 | #define SC1200_REV_A 0x00 | 45 | #define SC1200_REV_A 0x00 |
46 | #define SC1200_REV_B1 0x01 | 46 | #define SC1200_REV_B1 0x01 |
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c index 36cdbd2b0bd5..2d048ef25a5a 100644 --- a/drivers/ata/pata_scc.c +++ b/drivers/ata/pata_scc.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include <linux/libata.h> | 43 | #include <linux/libata.h> |
44 | 44 | ||
45 | #define DRV_NAME "pata_scc" | 45 | #define DRV_NAME "pata_scc" |
46 | #define DRV_VERSION "0.2" | 46 | #define DRV_VERSION "0.3" |
47 | 47 | ||
48 | #define PCI_DEVICE_ID_TOSHIBA_SCC_ATA 0x01b4 | 48 | #define PCI_DEVICE_ID_TOSHIBA_SCC_ATA 0x01b4 |
49 | 49 | ||
diff --git a/drivers/ata/pata_serverworks.c b/drivers/ata/pata_serverworks.c index 89691541fe59..0faf99c8f13e 100644 --- a/drivers/ata/pata_serverworks.c +++ b/drivers/ata/pata_serverworks.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #include <linux/libata.h> | 41 | #include <linux/libata.h> |
42 | 42 | ||
43 | #define DRV_NAME "pata_serverworks" | 43 | #define DRV_NAME "pata_serverworks" |
44 | #define DRV_VERSION "0.4.1" | 44 | #define DRV_VERSION "0.4.2" |
45 | 45 | ||
46 | #define SVWKS_CSB5_REVISION_NEW 0x92 /* min PCI_REVISION_ID for UDMA5 (A2.0) */ | 46 | #define SVWKS_CSB5_REVISION_NEW 0x92 /* min PCI_REVISION_ID for UDMA5 (A2.0) */ |
47 | #define SVWKS_CSB6_REVISION 0xa0 /* min PCI_REVISION_ID for UDMA4 (A1.0) */ | 47 | #define SVWKS_CSB6_REVISION 0xa0 /* min PCI_REVISION_ID for UDMA4 (A1.0) */ |
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c index b0cd52d6e3fb..40395804a66f 100644 --- a/drivers/ata/pata_sil680.c +++ b/drivers/ata/pata_sil680.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include <linux/libata.h> | 33 | #include <linux/libata.h> |
34 | 34 | ||
35 | #define DRV_NAME "pata_sil680" | 35 | #define DRV_NAME "pata_sil680" |
36 | #define DRV_VERSION "0.4.6" | 36 | #define DRV_VERSION "0.4.7" |
37 | 37 | ||
38 | #define SIL680_MMIO_BAR 5 | 38 | #define SIL680_MMIO_BAR 5 |
39 | 39 | ||
diff --git a/drivers/ata/pata_sl82c105.c b/drivers/ata/pata_sl82c105.c index 8c2813aa6cdb..c0f43bb25956 100644 --- a/drivers/ata/pata_sl82c105.c +++ b/drivers/ata/pata_sl82c105.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #include <linux/libata.h> | 26 | #include <linux/libata.h> |
27 | 27 | ||
28 | #define DRV_NAME "pata_sl82c105" | 28 | #define DRV_NAME "pata_sl82c105" |
29 | #define DRV_VERSION "0.3.1" | 29 | #define DRV_VERSION "0.3.2" |
30 | 30 | ||
31 | enum { | 31 | enum { |
32 | /* | 32 | /* |
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c index bec1de594de8..5c79271401af 100644 --- a/drivers/ata/pdc_adma.c +++ b/drivers/ata/pdc_adma.c | |||
@@ -44,7 +44,7 @@ | |||
44 | #include <linux/libata.h> | 44 | #include <linux/libata.h> |
45 | 45 | ||
46 | #define DRV_NAME "pdc_adma" | 46 | #define DRV_NAME "pdc_adma" |
47 | #define DRV_VERSION "0.06" | 47 | #define DRV_VERSION "1.0" |
48 | 48 | ||
49 | /* macro to calculate base address for ATA regs */ | 49 | /* macro to calculate base address for ATA regs */ |
50 | #define ADMA_ATA_REGS(base,port_no) ((base) + ((port_no) * 0x40)) | 50 | #define ADMA_ATA_REGS(base,port_no) ((base) + ((port_no) * 0x40)) |
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index a9c948d7604a..fdbed8ecdfc2 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -28,7 +28,7 @@ | |||
28 | #include <scsi/scsi_device.h> | 28 | #include <scsi/scsi_device.h> |
29 | 29 | ||
30 | #define DRV_NAME "sata_inic162x" | 30 | #define DRV_NAME "sata_inic162x" |
31 | #define DRV_VERSION "0.2" | 31 | #define DRV_VERSION "0.3" |
32 | 32 | ||
33 | enum { | 33 | enum { |
34 | MMIO_BAR = 5, | 34 | MMIO_BAR = 5, |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 3acf65e75eb2..11bf6c7ac122 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -72,7 +72,7 @@ | |||
72 | #include <linux/libata.h> | 72 | #include <linux/libata.h> |
73 | 73 | ||
74 | #define DRV_NAME "sata_mv" | 74 | #define DRV_NAME "sata_mv" |
75 | #define DRV_VERSION "0.81" | 75 | #define DRV_VERSION "1.0" |
76 | 76 | ||
77 | enum { | 77 | enum { |
78 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | 78 | /* BAR's are enumerated in terms of pci_resource_start() terms */ |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 0b58c4df6fd2..40dc73139858 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -49,7 +49,7 @@ | |||
49 | #include <linux/libata.h> | 49 | #include <linux/libata.h> |
50 | 50 | ||
51 | #define DRV_NAME "sata_nv" | 51 | #define DRV_NAME "sata_nv" |
52 | #define DRV_VERSION "3.4" | 52 | #define DRV_VERSION "3.5" |
53 | 53 | ||
54 | #define NV_ADMA_DMA_BOUNDARY 0xffffffffUL | 54 | #define NV_ADMA_DMA_BOUNDARY 0xffffffffUL |
55 | 55 | ||
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c index d39ebc23c4a9..25698cf0dce0 100644 --- a/drivers/ata/sata_promise.c +++ b/drivers/ata/sata_promise.c | |||
@@ -45,7 +45,7 @@ | |||
45 | #include "sata_promise.h" | 45 | #include "sata_promise.h" |
46 | 46 | ||
47 | #define DRV_NAME "sata_promise" | 47 | #define DRV_NAME "sata_promise" |
48 | #define DRV_VERSION "2.09" | 48 | #define DRV_VERSION "2.10" |
49 | 49 | ||
50 | enum { | 50 | enum { |
51 | PDC_MAX_PORTS = 4, | 51 | PDC_MAX_PORTS = 4, |
@@ -328,8 +328,8 @@ static const struct pci_device_id pdc_ata_pci_tbl[] = { | |||
328 | 328 | ||
329 | { PCI_VDEVICE(PROMISE, 0x3318), board_20319 }, | 329 | { PCI_VDEVICE(PROMISE, 0x3318), board_20319 }, |
330 | { PCI_VDEVICE(PROMISE, 0x3319), board_20319 }, | 330 | { PCI_VDEVICE(PROMISE, 0x3319), board_20319 }, |
331 | { PCI_VDEVICE(PROMISE, 0x3515), board_20319 }, | 331 | { PCI_VDEVICE(PROMISE, 0x3515), board_40518 }, |
332 | { PCI_VDEVICE(PROMISE, 0x3519), board_20319 }, | 332 | { PCI_VDEVICE(PROMISE, 0x3519), board_40518 }, |
333 | { PCI_VDEVICE(PROMISE, 0x3d17), board_40518 }, | 333 | { PCI_VDEVICE(PROMISE, 0x3d17), board_40518 }, |
334 | { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 }, | 334 | { PCI_VDEVICE(PROMISE, 0x3d18), board_40518 }, |
335 | 335 | ||
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c index c8f9242e7f44..5e1dfdda698f 100644 --- a/drivers/ata/sata_qstor.c +++ b/drivers/ata/sata_qstor.c | |||
@@ -39,7 +39,7 @@ | |||
39 | #include <linux/libata.h> | 39 | #include <linux/libata.h> |
40 | 40 | ||
41 | #define DRV_NAME "sata_qstor" | 41 | #define DRV_NAME "sata_qstor" |
42 | #define DRV_VERSION "0.08" | 42 | #define DRV_VERSION "0.09" |
43 | 43 | ||
44 | enum { | 44 | enum { |
45 | QS_MMIO_BAR = 4, | 45 | QS_MMIO_BAR = 4, |
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c index db6763758952..8c72e714b456 100644 --- a/drivers/ata/sata_sil.c +++ b/drivers/ata/sata_sil.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include <linux/libata.h> | 46 | #include <linux/libata.h> |
47 | 47 | ||
48 | #define DRV_NAME "sata_sil" | 48 | #define DRV_NAME "sata_sil" |
49 | #define DRV_VERSION "2.2" | 49 | #define DRV_VERSION "2.3" |
50 | 50 | ||
51 | enum { | 51 | enum { |
52 | SIL_MMIO_BAR = 5, | 52 | SIL_MMIO_BAR = 5, |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 46fbbe7f121c..ef83e6b1e314 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/libata.h> | 30 | #include <linux/libata.h> |
31 | 31 | ||
32 | #define DRV_NAME "sata_sil24" | 32 | #define DRV_NAME "sata_sil24" |
33 | #define DRV_VERSION "0.9" | 33 | #define DRV_VERSION "1.0" |
34 | 34 | ||
35 | /* | 35 | /* |
36 | * Port request block (PRB) 32 bytes | 36 | * Port request block (PRB) 32 bytes |
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 31a2f55aae66..41c1d6e8f1fe 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
@@ -43,7 +43,7 @@ | |||
43 | #include "sis.h" | 43 | #include "sis.h" |
44 | 44 | ||
45 | #define DRV_NAME "sata_sis" | 45 | #define DRV_NAME "sata_sis" |
46 | #define DRV_VERSION "0.8" | 46 | #define DRV_VERSION "1.0" |
47 | 47 | ||
48 | enum { | 48 | enum { |
49 | sis_180 = 0, | 49 | sis_180 = 0, |
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c index 92e877075037..d9678e7bc3a9 100644 --- a/drivers/ata/sata_svw.c +++ b/drivers/ata/sata_svw.c | |||
@@ -53,7 +53,7 @@ | |||
53 | #endif /* CONFIG_PPC_OF */ | 53 | #endif /* CONFIG_PPC_OF */ |
54 | 54 | ||
55 | #define DRV_NAME "sata_svw" | 55 | #define DRV_NAME "sata_svw" |
56 | #define DRV_VERSION "2.2" | 56 | #define DRV_VERSION "2.3" |
57 | 57 | ||
58 | enum { | 58 | enum { |
59 | /* ap->flags bits */ | 59 | /* ap->flags bits */ |
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c index 5193bd8647ba..97aefdd87be4 100644 --- a/drivers/ata/sata_sx4.c +++ b/drivers/ata/sata_sx4.c | |||
@@ -92,7 +92,7 @@ | |||
92 | #include "sata_promise.h" | 92 | #include "sata_promise.h" |
93 | 93 | ||
94 | #define DRV_NAME "sata_sx4" | 94 | #define DRV_NAME "sata_sx4" |
95 | #define DRV_VERSION "0.11" | 95 | #define DRV_VERSION "0.12" |
96 | 96 | ||
97 | 97 | ||
98 | enum { | 98 | enum { |
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c index 78c28512f01c..e6b8b45279af 100644 --- a/drivers/ata/sata_uli.c +++ b/drivers/ata/sata_uli.c | |||
@@ -36,7 +36,7 @@ | |||
36 | #include <linux/libata.h> | 36 | #include <linux/libata.h> |
37 | 37 | ||
38 | #define DRV_NAME "sata_uli" | 38 | #define DRV_NAME "sata_uli" |
39 | #define DRV_VERSION "1.2" | 39 | #define DRV_VERSION "1.3" |
40 | 40 | ||
41 | enum { | 41 | enum { |
42 | uli_5289 = 0, | 42 | uli_5289 = 0, |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index 86b7bfc17324..a4e631766eee 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -46,7 +46,7 @@ | |||
46 | #include <linux/libata.h> | 46 | #include <linux/libata.h> |
47 | 47 | ||
48 | #define DRV_NAME "sata_via" | 48 | #define DRV_NAME "sata_via" |
49 | #define DRV_VERSION "2.2" | 49 | #define DRV_VERSION "2.3" |
50 | 50 | ||
51 | enum board_ids_enum { | 51 | enum board_ids_enum { |
52 | vt6420, | 52 | vt6420, |
diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c index 24344d0d0575..1920915dfa2c 100644 --- a/drivers/ata/sata_vsc.c +++ b/drivers/ata/sata_vsc.c | |||
@@ -47,7 +47,7 @@ | |||
47 | #include <linux/libata.h> | 47 | #include <linux/libata.h> |
48 | 48 | ||
49 | #define DRV_NAME "sata_vsc" | 49 | #define DRV_NAME "sata_vsc" |
50 | #define DRV_VERSION "2.2" | 50 | #define DRV_VERSION "2.3" |
51 | 51 | ||
52 | enum { | 52 | enum { |
53 | VSC_MMIO_BAR = 0, | 53 | VSC_MMIO_BAR = 0, |
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c index 77bf4aa217a8..7ecffc9c738f 100644 --- a/drivers/char/hpet.c +++ b/drivers/char/hpet.c | |||
@@ -909,6 +909,8 @@ int hpet_alloc(struct hpet_data *hdp) | |||
909 | 909 | ||
910 | hpetp->hp_delta = hpet_calibrate(hpetp); | 910 | hpetp->hp_delta = hpet_calibrate(hpetp); |
911 | 911 | ||
912 | /* This clocksource driver currently only works on ia64 */ | ||
913 | #ifdef CONFIG_IA64 | ||
912 | if (!hpet_clocksource) { | 914 | if (!hpet_clocksource) { |
913 | hpet_mctr = (void __iomem *)&hpetp->hp_hpet->hpet_mc; | 915 | hpet_mctr = (void __iomem *)&hpetp->hp_hpet->hpet_mc; |
914 | CLKSRC_FSYS_MMIO_SET(clocksource_hpet.fsys_mmio, hpet_mctr); | 916 | CLKSRC_FSYS_MMIO_SET(clocksource_hpet.fsys_mmio, hpet_mctr); |
@@ -918,6 +920,7 @@ int hpet_alloc(struct hpet_data *hdp) | |||
918 | hpetp->hp_clocksource = &clocksource_hpet; | 920 | hpetp->hp_clocksource = &clocksource_hpet; |
919 | hpet_clocksource = &clocksource_hpet; | 921 | hpet_clocksource = &clocksource_hpet; |
920 | } | 922 | } |
923 | #endif | ||
921 | 924 | ||
922 | return 0; | 925 | return 0; |
923 | } | 926 | } |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index 1518b41482ae..beb2a381467f 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c | |||
@@ -916,7 +916,7 @@ int cxio_rdev_open(struct cxio_rdev *rdev_p) | |||
916 | PDBG("%s opening rnic dev %s\n", __FUNCTION__, rdev_p->dev_name); | 916 | PDBG("%s opening rnic dev %s\n", __FUNCTION__, rdev_p->dev_name); |
917 | memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp)); | 917 | memset(&rdev_p->ctrl_qp, 0, sizeof(rdev_p->ctrl_qp)); |
918 | if (!rdev_p->t3cdev_p) | 918 | if (!rdev_p->t3cdev_p) |
919 | rdev_p->t3cdev_p = T3CDEV(netdev_p); | 919 | rdev_p->t3cdev_p = dev2t3cdev(netdev_p); |
920 | rdev_p->t3cdev_p->ulp = (void *) rdev_p; | 920 | rdev_p->t3cdev_p->ulp = (void *) rdev_p; |
921 | err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS, | 921 | err = rdev_p->t3cdev_p->ctl(rdev_p->t3cdev_p, RDMA_GET_PARAMS, |
922 | &(rdev_p->rnic_info)); | 922 | &(rdev_p->rnic_info)); |
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c index fc19ef9fd963..cf22472d9414 100644 --- a/drivers/infiniband/hw/ehca/ehca_hca.c +++ b/drivers/infiniband/hw/ehca/ehca_hca.c | |||
@@ -93,9 +93,13 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | |||
93 | props->max_pd = min_t(int, rblock->max_pd, INT_MAX); | 93 | props->max_pd = min_t(int, rblock->max_pd, INT_MAX); |
94 | props->max_ah = min_t(int, rblock->max_ah, INT_MAX); | 94 | props->max_ah = min_t(int, rblock->max_ah, INT_MAX); |
95 | props->max_fmr = min_t(int, rblock->max_mr, INT_MAX); | 95 | props->max_fmr = min_t(int, rblock->max_mr, INT_MAX); |
96 | props->max_srq = 0; | 96 | |
97 | props->max_srq_wr = 0; | 97 | if (EHCA_BMASK_GET(HCA_CAP_SRQ, shca->hca_cap)) { |
98 | props->max_srq_sge = 0; | 98 | props->max_srq = props->max_qp; |
99 | props->max_srq_wr = props->max_qp_wr; | ||
100 | props->max_srq_sge = 3; | ||
101 | } | ||
102 | |||
99 | props->max_pkeys = 16; | 103 | props->max_pkeys = 16; |
100 | props->local_ca_ack_delay | 104 | props->local_ca_ack_delay |
101 | = rblock->local_ca_ack_delay; | 105 | = rblock->local_ca_ack_delay; |
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c index ee06d8bd7396..a925ea52443f 100644 --- a/drivers/infiniband/hw/ehca/ehca_irq.c +++ b/drivers/infiniband/hw/ehca/ehca_irq.c | |||
@@ -175,41 +175,55 @@ error_data1: | |||
175 | 175 | ||
176 | } | 176 | } |
177 | 177 | ||
178 | static void qp_event_callback(struct ehca_shca *shca, u64 eqe, | 178 | static void dispatch_qp_event(struct ehca_shca *shca, struct ehca_qp *qp, |
179 | enum ib_event_type event_type, int fatal) | 179 | enum ib_event_type event_type) |
180 | { | 180 | { |
181 | struct ib_event event; | 181 | struct ib_event event; |
182 | struct ehca_qp *qp; | ||
183 | u32 token = EHCA_BMASK_GET(EQE_QP_TOKEN, eqe); | ||
184 | |||
185 | read_lock(&ehca_qp_idr_lock); | ||
186 | qp = idr_find(&ehca_qp_idr, token); | ||
187 | read_unlock(&ehca_qp_idr_lock); | ||
188 | |||
189 | |||
190 | if (!qp) | ||
191 | return; | ||
192 | |||
193 | if (fatal) | ||
194 | ehca_error_data(shca, qp, qp->ipz_qp_handle.handle); | ||
195 | 182 | ||
196 | event.device = &shca->ib_device; | 183 | event.device = &shca->ib_device; |
184 | event.event = event_type; | ||
197 | 185 | ||
198 | if (qp->ext_type == EQPT_SRQ) { | 186 | if (qp->ext_type == EQPT_SRQ) { |
199 | if (!qp->ib_srq.event_handler) | 187 | if (!qp->ib_srq.event_handler) |
200 | return; | 188 | return; |
201 | 189 | ||
202 | event.event = fatal ? IB_EVENT_SRQ_ERR : event_type; | ||
203 | event.element.srq = &qp->ib_srq; | 190 | event.element.srq = &qp->ib_srq; |
204 | qp->ib_srq.event_handler(&event, qp->ib_srq.srq_context); | 191 | qp->ib_srq.event_handler(&event, qp->ib_srq.srq_context); |
205 | } else { | 192 | } else { |
206 | if (!qp->ib_qp.event_handler) | 193 | if (!qp->ib_qp.event_handler) |
207 | return; | 194 | return; |
208 | 195 | ||
209 | event.event = event_type; | ||
210 | event.element.qp = &qp->ib_qp; | 196 | event.element.qp = &qp->ib_qp; |
211 | qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context); | 197 | qp->ib_qp.event_handler(&event, qp->ib_qp.qp_context); |
212 | } | 198 | } |
199 | } | ||
200 | |||
201 | static void qp_event_callback(struct ehca_shca *shca, u64 eqe, | ||
202 | enum ib_event_type event_type, int fatal) | ||
203 | { | ||
204 | struct ehca_qp *qp; | ||
205 | u32 token = EHCA_BMASK_GET(EQE_QP_TOKEN, eqe); | ||
206 | |||
207 | read_lock(&ehca_qp_idr_lock); | ||
208 | qp = idr_find(&ehca_qp_idr, token); | ||
209 | read_unlock(&ehca_qp_idr_lock); | ||
210 | |||
211 | if (!qp) | ||
212 | return; | ||
213 | |||
214 | if (fatal) | ||
215 | ehca_error_data(shca, qp, qp->ipz_qp_handle.handle); | ||
216 | |||
217 | dispatch_qp_event(shca, qp, fatal && qp->ext_type == EQPT_SRQ ? | ||
218 | IB_EVENT_SRQ_ERR : event_type); | ||
219 | |||
220 | /* | ||
221 | * eHCA only processes one WQE at a time for SRQ base QPs, | ||
222 | * so the last WQE has been processed as soon as the QP enters | ||
223 | * error state. | ||
224 | */ | ||
225 | if (fatal && qp->ext_type == EQPT_SRQBASE) | ||
226 | dispatch_qp_event(shca, qp, IB_EVENT_QP_LAST_WQE_REACHED); | ||
213 | 227 | ||
214 | return; | 228 | return; |
215 | } | 229 | } |
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index b178cba96345..84d435a5ee11 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
@@ -600,10 +600,12 @@ static struct ehca_qp *internal_create_qp( | |||
600 | 600 | ||
601 | if (EHCA_BMASK_GET(HCA_CAP_MINI_QP, shca->hca_cap) | 601 | if (EHCA_BMASK_GET(HCA_CAP_MINI_QP, shca->hca_cap) |
602 | && !(context && udata)) { /* no small QP support in userspace ATM */ | 602 | && !(context && udata)) { /* no small QP support in userspace ATM */ |
603 | ehca_determine_small_queue( | 603 | if (HAS_SQ(my_qp)) |
604 | &parms.squeue, max_send_sge, is_llqp); | 604 | ehca_determine_small_queue( |
605 | ehca_determine_small_queue( | 605 | &parms.squeue, max_send_sge, is_llqp); |
606 | &parms.rqueue, max_recv_sge, is_llqp); | 606 | if (HAS_RQ(my_qp)) |
607 | ehca_determine_small_queue( | ||
608 | &parms.rqueue, max_recv_sge, is_llqp); | ||
607 | parms.qp_storage = | 609 | parms.qp_storage = |
608 | (parms.squeue.is_small || parms.rqueue.is_small); | 610 | (parms.squeue.is_small || parms.rqueue.is_small); |
609 | } | 611 | } |
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c index a090c679c397..29bd476fbd54 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c | |||
@@ -172,7 +172,7 @@ static void free_small_queue_page(struct ipz_queue *queue, struct ehca_pd *pd) | |||
172 | unsigned long bit; | 172 | unsigned long bit; |
173 | int free_page = 0; | 173 | int free_page = 0; |
174 | 174 | ||
175 | bit = ((unsigned long)queue->queue_pages[0] & PAGE_MASK) | 175 | bit = ((unsigned long)queue->queue_pages[0] & ~PAGE_MASK) |
176 | >> (order + 9); | 176 | >> (order + 9); |
177 | 177 | ||
178 | mutex_lock(&pd->lock); | 178 | mutex_lock(&pd->lock); |
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h index ab72563b81ee..20e887de2545 100644 --- a/drivers/net/cxgb3/adapter.h +++ b/drivers/net/cxgb3/adapter.h | |||
@@ -50,7 +50,9 @@ typedef irqreturn_t(*intr_handler_t) (int, void *); | |||
50 | 50 | ||
51 | struct vlan_group; | 51 | struct vlan_group; |
52 | 52 | ||
53 | struct adapter; | ||
53 | struct port_info { | 54 | struct port_info { |
55 | struct adapter *adapter; | ||
54 | struct vlan_group *vlan_grp; | 56 | struct vlan_group *vlan_grp; |
55 | const struct port_type_info *port_type; | 57 | const struct port_type_info *port_type; |
56 | u8 port_id; | 58 | u8 port_id; |
diff --git a/drivers/net/cxgb3/common.h b/drivers/net/cxgb3/common.h index 16378004507a..2129210a67c1 100644 --- a/drivers/net/cxgb3/common.h +++ b/drivers/net/cxgb3/common.h | |||
@@ -679,7 +679,8 @@ const struct adapter_info *t3_get_adapter_info(unsigned int board_id); | |||
679 | int t3_seeprom_read(struct adapter *adapter, u32 addr, u32 *data); | 679 | int t3_seeprom_read(struct adapter *adapter, u32 addr, u32 *data); |
680 | int t3_seeprom_write(struct adapter *adapter, u32 addr, u32 data); | 680 | int t3_seeprom_write(struct adapter *adapter, u32 addr, u32 data); |
681 | int t3_seeprom_wp(struct adapter *adapter, int enable); | 681 | int t3_seeprom_wp(struct adapter *adapter, int enable); |
682 | int t3_check_tpsram_version(struct adapter *adapter); | 682 | int t3_get_tp_version(struct adapter *adapter, u32 *vers); |
683 | int t3_check_tpsram_version(struct adapter *adapter, int *must_load); | ||
683 | int t3_check_tpsram(struct adapter *adapter, u8 *tp_ram, unsigned int size); | 684 | int t3_check_tpsram(struct adapter *adapter, u8 *tp_ram, unsigned int size); |
684 | int t3_set_proto_sram(struct adapter *adap, u8 *data); | 685 | int t3_set_proto_sram(struct adapter *adap, u8 *data); |
685 | int t3_read_flash(struct adapter *adapter, unsigned int addr, | 686 | int t3_read_flash(struct adapter *adapter, unsigned int addr, |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index dc5d26988bb3..5ab319cfe5de 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -358,11 +358,14 @@ static int init_dummy_netdevs(struct adapter *adap) | |||
358 | 358 | ||
359 | for (j = 0; j < pi->nqsets - 1; j++) { | 359 | for (j = 0; j < pi->nqsets - 1; j++) { |
360 | if (!adap->dummy_netdev[dummy_idx]) { | 360 | if (!adap->dummy_netdev[dummy_idx]) { |
361 | nd = alloc_netdev(0, "", ether_setup); | 361 | struct port_info *p; |
362 | |||
363 | nd = alloc_netdev(sizeof(*p), "", ether_setup); | ||
362 | if (!nd) | 364 | if (!nd) |
363 | goto free_all; | 365 | goto free_all; |
364 | 366 | ||
365 | nd->priv = adap; | 367 | p = netdev_priv(nd); |
368 | p->adapter = adap; | ||
366 | nd->weight = 64; | 369 | nd->weight = 64; |
367 | set_bit(__LINK_STATE_START, &nd->state); | 370 | set_bit(__LINK_STATE_START, &nd->state); |
368 | adap->dummy_netdev[dummy_idx] = nd; | 371 | adap->dummy_netdev[dummy_idx] = nd; |
@@ -482,7 +485,8 @@ static ssize_t attr_store(struct device *d, struct device_attribute *attr, | |||
482 | #define CXGB3_SHOW(name, val_expr) \ | 485 | #define CXGB3_SHOW(name, val_expr) \ |
483 | static ssize_t format_##name(struct net_device *dev, char *buf) \ | 486 | static ssize_t format_##name(struct net_device *dev, char *buf) \ |
484 | { \ | 487 | { \ |
485 | struct adapter *adap = dev->priv; \ | 488 | struct port_info *pi = netdev_priv(dev); \ |
489 | struct adapter *adap = pi->adapter; \ | ||
486 | return sprintf(buf, "%u\n", val_expr); \ | 490 | return sprintf(buf, "%u\n", val_expr); \ |
487 | } \ | 491 | } \ |
488 | static ssize_t show_##name(struct device *d, struct device_attribute *attr, \ | 492 | static ssize_t show_##name(struct device *d, struct device_attribute *attr, \ |
@@ -493,7 +497,8 @@ static ssize_t show_##name(struct device *d, struct device_attribute *attr, \ | |||
493 | 497 | ||
494 | static ssize_t set_nfilters(struct net_device *dev, unsigned int val) | 498 | static ssize_t set_nfilters(struct net_device *dev, unsigned int val) |
495 | { | 499 | { |
496 | struct adapter *adap = dev->priv; | 500 | struct port_info *pi = netdev_priv(dev); |
501 | struct adapter *adap = pi->adapter; | ||
497 | int min_tids = is_offload(adap) ? MC5_MIN_TIDS : 0; | 502 | int min_tids = is_offload(adap) ? MC5_MIN_TIDS : 0; |
498 | 503 | ||
499 | if (adap->flags & FULL_INIT_DONE) | 504 | if (adap->flags & FULL_INIT_DONE) |
@@ -515,7 +520,8 @@ static ssize_t store_nfilters(struct device *d, struct device_attribute *attr, | |||
515 | 520 | ||
516 | static ssize_t set_nservers(struct net_device *dev, unsigned int val) | 521 | static ssize_t set_nservers(struct net_device *dev, unsigned int val) |
517 | { | 522 | { |
518 | struct adapter *adap = dev->priv; | 523 | struct port_info *pi = netdev_priv(dev); |
524 | struct adapter *adap = pi->adapter; | ||
519 | 525 | ||
520 | if (adap->flags & FULL_INIT_DONE) | 526 | if (adap->flags & FULL_INIT_DONE) |
521 | return -EBUSY; | 527 | return -EBUSY; |
@@ -556,9 +562,10 @@ static struct attribute_group cxgb3_attr_group = {.attrs = cxgb3_attrs }; | |||
556 | static ssize_t tm_attr_show(struct device *d, struct device_attribute *attr, | 562 | static ssize_t tm_attr_show(struct device *d, struct device_attribute *attr, |
557 | char *buf, int sched) | 563 | char *buf, int sched) |
558 | { | 564 | { |
559 | ssize_t len; | 565 | struct port_info *pi = netdev_priv(to_net_dev(d)); |
566 | struct adapter *adap = pi->adapter; | ||
560 | unsigned int v, addr, bpt, cpt; | 567 | unsigned int v, addr, bpt, cpt; |
561 | struct adapter *adap = to_net_dev(d)->priv; | 568 | ssize_t len; |
562 | 569 | ||
563 | addr = A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2; | 570 | addr = A_TP_TX_MOD_Q1_Q0_RATE_LIMIT - sched / 2; |
564 | rtnl_lock(); | 571 | rtnl_lock(); |
@@ -581,10 +588,11 @@ static ssize_t tm_attr_show(struct device *d, struct device_attribute *attr, | |||
581 | static ssize_t tm_attr_store(struct device *d, struct device_attribute *attr, | 588 | static ssize_t tm_attr_store(struct device *d, struct device_attribute *attr, |
582 | const char *buf, size_t len, int sched) | 589 | const char *buf, size_t len, int sched) |
583 | { | 590 | { |
591 | struct port_info *pi = netdev_priv(to_net_dev(d)); | ||
592 | struct adapter *adap = pi->adapter; | ||
593 | unsigned int val; | ||
584 | char *endp; | 594 | char *endp; |
585 | ssize_t ret; | 595 | ssize_t ret; |
586 | unsigned int val; | ||
587 | struct adapter *adap = to_net_dev(d)->priv; | ||
588 | 596 | ||
589 | if (!capable(CAP_NET_ADMIN)) | 597 | if (!capable(CAP_NET_ADMIN)) |
590 | return -EPERM; | 598 | return -EPERM; |
@@ -721,6 +729,7 @@ static void bind_qsets(struct adapter *adap) | |||
721 | } | 729 | } |
722 | 730 | ||
723 | #define FW_FNAME "t3fw-%d.%d.%d.bin" | 731 | #define FW_FNAME "t3fw-%d.%d.%d.bin" |
732 | #define TPSRAM_NAME "t3%c_protocol_sram-%d.%d.%d.bin" | ||
724 | 733 | ||
725 | static int upgrade_fw(struct adapter *adap) | 734 | static int upgrade_fw(struct adapter *adap) |
726 | { | 735 | { |
@@ -739,6 +748,71 @@ static int upgrade_fw(struct adapter *adap) | |||
739 | } | 748 | } |
740 | ret = t3_load_fw(adap, fw->data, fw->size); | 749 | ret = t3_load_fw(adap, fw->data, fw->size); |
741 | release_firmware(fw); | 750 | release_firmware(fw); |
751 | |||
752 | if (ret == 0) | ||
753 | dev_info(dev, "successful upgrade to firmware %d.%d.%d\n", | ||
754 | FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); | ||
755 | else | ||
756 | dev_err(dev, "failed to upgrade to firmware %d.%d.%d\n", | ||
757 | FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO); | ||
758 | |||
759 | return ret; | ||
760 | } | ||
761 | |||
762 | static inline char t3rev2char(struct adapter *adapter) | ||
763 | { | ||
764 | char rev = 0; | ||
765 | |||
766 | switch(adapter->params.rev) { | ||
767 | case T3_REV_B: | ||
768 | case T3_REV_B2: | ||
769 | rev = 'b'; | ||
770 | break; | ||
771 | } | ||
772 | return rev; | ||
773 | } | ||
774 | |||
775 | int update_tpsram(struct adapter *adap) | ||
776 | { | ||
777 | const struct firmware *tpsram; | ||
778 | char buf[64]; | ||
779 | struct device *dev = &adap->pdev->dev; | ||
780 | int ret; | ||
781 | char rev; | ||
782 | |||
783 | rev = t3rev2char(adap); | ||
784 | if (!rev) | ||
785 | return 0; | ||
786 | |||
787 | snprintf(buf, sizeof(buf), TPSRAM_NAME, rev, | ||
788 | TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); | ||
789 | |||
790 | ret = request_firmware(&tpsram, buf, dev); | ||
791 | if (ret < 0) { | ||
792 | dev_err(dev, "could not load TP SRAM: unable to load %s\n", | ||
793 | buf); | ||
794 | return ret; | ||
795 | } | ||
796 | |||
797 | ret = t3_check_tpsram(adap, tpsram->data, tpsram->size); | ||
798 | if (ret) | ||
799 | goto release_tpsram; | ||
800 | |||
801 | ret = t3_set_proto_sram(adap, tpsram->data); | ||
802 | if (ret == 0) | ||
803 | dev_info(dev, | ||
804 | "successful update of protocol engine " | ||
805 | "to %d.%d.%d\n", | ||
806 | TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); | ||
807 | else | ||
808 | dev_err(dev, "failed to update of protocol engine %d.%d.%d\n", | ||
809 | TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); | ||
810 | if (ret) | ||
811 | dev_err(dev, "loading protocol SRAM failed\n"); | ||
812 | |||
813 | release_tpsram: | ||
814 | release_firmware(tpsram); | ||
815 | |||
742 | return ret; | 816 | return ret; |
743 | } | 817 | } |
744 | 818 | ||
@@ -755,6 +829,7 @@ static int upgrade_fw(struct adapter *adap) | |||
755 | static int cxgb_up(struct adapter *adap) | 829 | static int cxgb_up(struct adapter *adap) |
756 | { | 830 | { |
757 | int err = 0; | 831 | int err = 0; |
832 | int must_load; | ||
758 | 833 | ||
759 | if (!(adap->flags & FULL_INIT_DONE)) { | 834 | if (!(adap->flags & FULL_INIT_DONE)) { |
760 | err = t3_check_fw_version(adap); | 835 | err = t3_check_fw_version(adap); |
@@ -763,6 +838,13 @@ static int cxgb_up(struct adapter *adap) | |||
763 | if (err) | 838 | if (err) |
764 | goto out; | 839 | goto out; |
765 | 840 | ||
841 | err = t3_check_tpsram_version(adap, &must_load); | ||
842 | if (err == -EINVAL) { | ||
843 | err = update_tpsram(adap); | ||
844 | if (err && must_load) | ||
845 | goto out; | ||
846 | } | ||
847 | |||
766 | err = init_dummy_netdevs(adap); | 848 | err = init_dummy_netdevs(adap); |
767 | if (err) | 849 | if (err) |
768 | goto out; | 850 | goto out; |
@@ -858,8 +940,9 @@ static void schedule_chk_task(struct adapter *adap) | |||
858 | 940 | ||
859 | static int offload_open(struct net_device *dev) | 941 | static int offload_open(struct net_device *dev) |
860 | { | 942 | { |
861 | struct adapter *adapter = dev->priv; | 943 | struct port_info *pi = netdev_priv(dev); |
862 | struct t3cdev *tdev = T3CDEV(dev); | 944 | struct adapter *adapter = pi->adapter; |
945 | struct t3cdev *tdev = dev2t3cdev(dev); | ||
863 | int adap_up = adapter->open_device_map & PORT_MASK; | 946 | int adap_up = adapter->open_device_map & PORT_MASK; |
864 | int err = 0; | 947 | int err = 0; |
865 | 948 | ||
@@ -924,10 +1007,10 @@ static int offload_close(struct t3cdev *tdev) | |||
924 | 1007 | ||
925 | static int cxgb_open(struct net_device *dev) | 1008 | static int cxgb_open(struct net_device *dev) |
926 | { | 1009 | { |
927 | int err; | ||
928 | struct adapter *adapter = dev->priv; | ||
929 | struct port_info *pi = netdev_priv(dev); | 1010 | struct port_info *pi = netdev_priv(dev); |
1011 | struct adapter *adapter = pi->adapter; | ||
930 | int other_ports = adapter->open_device_map & PORT_MASK; | 1012 | int other_ports = adapter->open_device_map & PORT_MASK; |
1013 | int err; | ||
931 | 1014 | ||
932 | if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) | 1015 | if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) |
933 | return err; | 1016 | return err; |
@@ -951,17 +1034,17 @@ static int cxgb_open(struct net_device *dev) | |||
951 | 1034 | ||
952 | static int cxgb_close(struct net_device *dev) | 1035 | static int cxgb_close(struct net_device *dev) |
953 | { | 1036 | { |
954 | struct adapter *adapter = dev->priv; | 1037 | struct port_info *pi = netdev_priv(dev); |
955 | struct port_info *p = netdev_priv(dev); | 1038 | struct adapter *adapter = pi->adapter; |
956 | 1039 | ||
957 | t3_port_intr_disable(adapter, p->port_id); | 1040 | t3_port_intr_disable(adapter, pi->port_id); |
958 | netif_stop_queue(dev); | 1041 | netif_stop_queue(dev); |
959 | p->phy.ops->power_down(&p->phy, 1); | 1042 | pi->phy.ops->power_down(&pi->phy, 1); |
960 | netif_carrier_off(dev); | 1043 | netif_carrier_off(dev); |
961 | t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); | 1044 | t3_mac_disable(&pi->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); |
962 | 1045 | ||
963 | spin_lock(&adapter->work_lock); /* sync with update task */ | 1046 | spin_lock(&adapter->work_lock); /* sync with update task */ |
964 | clear_bit(p->port_id, &adapter->open_device_map); | 1047 | clear_bit(pi->port_id, &adapter->open_device_map); |
965 | spin_unlock(&adapter->work_lock); | 1048 | spin_unlock(&adapter->work_lock); |
966 | 1049 | ||
967 | if (!(adapter->open_device_map & PORT_MASK)) | 1050 | if (!(adapter->open_device_map & PORT_MASK)) |
@@ -976,13 +1059,13 @@ static int cxgb_close(struct net_device *dev) | |||
976 | 1059 | ||
977 | static struct net_device_stats *cxgb_get_stats(struct net_device *dev) | 1060 | static struct net_device_stats *cxgb_get_stats(struct net_device *dev) |
978 | { | 1061 | { |
979 | struct adapter *adapter = dev->priv; | 1062 | struct port_info *pi = netdev_priv(dev); |
980 | struct port_info *p = netdev_priv(dev); | 1063 | struct adapter *adapter = pi->adapter; |
981 | struct net_device_stats *ns = &p->netstats; | 1064 | struct net_device_stats *ns = &pi->netstats; |
982 | const struct mac_stats *pstats; | 1065 | const struct mac_stats *pstats; |
983 | 1066 | ||
984 | spin_lock(&adapter->stats_lock); | 1067 | spin_lock(&adapter->stats_lock); |
985 | pstats = t3_mac_update_stats(&p->mac); | 1068 | pstats = t3_mac_update_stats(&pi->mac); |
986 | spin_unlock(&adapter->stats_lock); | 1069 | spin_unlock(&adapter->stats_lock); |
987 | 1070 | ||
988 | ns->tx_bytes = pstats->tx_octets; | 1071 | ns->tx_bytes = pstats->tx_octets; |
@@ -1015,14 +1098,16 @@ static struct net_device_stats *cxgb_get_stats(struct net_device *dev) | |||
1015 | 1098 | ||
1016 | static u32 get_msglevel(struct net_device *dev) | 1099 | static u32 get_msglevel(struct net_device *dev) |
1017 | { | 1100 | { |
1018 | struct adapter *adapter = dev->priv; | 1101 | struct port_info *pi = netdev_priv(dev); |
1102 | struct adapter *adapter = pi->adapter; | ||
1019 | 1103 | ||
1020 | return adapter->msg_enable; | 1104 | return adapter->msg_enable; |
1021 | } | 1105 | } |
1022 | 1106 | ||
1023 | static void set_msglevel(struct net_device *dev, u32 val) | 1107 | static void set_msglevel(struct net_device *dev, u32 val) |
1024 | { | 1108 | { |
1025 | struct adapter *adapter = dev->priv; | 1109 | struct port_info *pi = netdev_priv(dev); |
1110 | struct adapter *adapter = pi->adapter; | ||
1026 | 1111 | ||
1027 | adapter->msg_enable = val; | 1112 | adapter->msg_enable = val; |
1028 | } | 1113 | } |
@@ -1096,10 +1181,13 @@ static int get_eeprom_len(struct net_device *dev) | |||
1096 | 1181 | ||
1097 | static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | 1182 | static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) |
1098 | { | 1183 | { |
1184 | struct port_info *pi = netdev_priv(dev); | ||
1185 | struct adapter *adapter = pi->adapter; | ||
1099 | u32 fw_vers = 0; | 1186 | u32 fw_vers = 0; |
1100 | struct adapter *adapter = dev->priv; | 1187 | u32 tp_vers = 0; |
1101 | 1188 | ||
1102 | t3_get_fw_version(adapter, &fw_vers); | 1189 | t3_get_fw_version(adapter, &fw_vers); |
1190 | t3_get_tp_version(adapter, &tp_vers); | ||
1103 | 1191 | ||
1104 | strcpy(info->driver, DRV_NAME); | 1192 | strcpy(info->driver, DRV_NAME); |
1105 | strcpy(info->version, DRV_VERSION); | 1193 | strcpy(info->version, DRV_VERSION); |
@@ -1108,11 +1196,14 @@ static void get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info) | |||
1108 | strcpy(info->fw_version, "N/A"); | 1196 | strcpy(info->fw_version, "N/A"); |
1109 | else { | 1197 | else { |
1110 | snprintf(info->fw_version, sizeof(info->fw_version), | 1198 | snprintf(info->fw_version, sizeof(info->fw_version), |
1111 | "%s %u.%u.%u", | 1199 | "%s %u.%u.%u TP %u.%u.%u", |
1112 | G_FW_VERSION_TYPE(fw_vers) ? "T" : "N", | 1200 | G_FW_VERSION_TYPE(fw_vers) ? "T" : "N", |
1113 | G_FW_VERSION_MAJOR(fw_vers), | 1201 | G_FW_VERSION_MAJOR(fw_vers), |
1114 | G_FW_VERSION_MINOR(fw_vers), | 1202 | G_FW_VERSION_MINOR(fw_vers), |
1115 | G_FW_VERSION_MICRO(fw_vers)); | 1203 | G_FW_VERSION_MICRO(fw_vers), |
1204 | G_TP_VERSION_MAJOR(tp_vers), | ||
1205 | G_TP_VERSION_MINOR(tp_vers), | ||
1206 | G_TP_VERSION_MICRO(tp_vers)); | ||
1116 | } | 1207 | } |
1117 | } | 1208 | } |
1118 | 1209 | ||
@@ -1136,8 +1227,8 @@ static unsigned long collect_sge_port_stats(struct adapter *adapter, | |||
1136 | static void get_stats(struct net_device *dev, struct ethtool_stats *stats, | 1227 | static void get_stats(struct net_device *dev, struct ethtool_stats *stats, |
1137 | u64 *data) | 1228 | u64 *data) |
1138 | { | 1229 | { |
1139 | struct adapter *adapter = dev->priv; | ||
1140 | struct port_info *pi = netdev_priv(dev); | 1230 | struct port_info *pi = netdev_priv(dev); |
1231 | struct adapter *adapter = pi->adapter; | ||
1141 | const struct mac_stats *s; | 1232 | const struct mac_stats *s; |
1142 | 1233 | ||
1143 | spin_lock(&adapter->stats_lock); | 1234 | spin_lock(&adapter->stats_lock); |
@@ -1205,7 +1296,8 @@ static inline void reg_block_dump(struct adapter *ap, void *buf, | |||
1205 | static void get_regs(struct net_device *dev, struct ethtool_regs *regs, | 1296 | static void get_regs(struct net_device *dev, struct ethtool_regs *regs, |
1206 | void *buf) | 1297 | void *buf) |
1207 | { | 1298 | { |
1208 | struct adapter *ap = dev->priv; | 1299 | struct port_info *pi = netdev_priv(dev); |
1300 | struct adapter *ap = pi->adapter; | ||
1209 | 1301 | ||
1210 | /* | 1302 | /* |
1211 | * Version scheme: | 1303 | * Version scheme: |
@@ -1246,8 +1338,9 @@ static int restart_autoneg(struct net_device *dev) | |||
1246 | 1338 | ||
1247 | static int cxgb3_phys_id(struct net_device *dev, u32 data) | 1339 | static int cxgb3_phys_id(struct net_device *dev, u32 data) |
1248 | { | 1340 | { |
1341 | struct port_info *pi = netdev_priv(dev); | ||
1342 | struct adapter *adapter = pi->adapter; | ||
1249 | int i; | 1343 | int i; |
1250 | struct adapter *adapter = dev->priv; | ||
1251 | 1344 | ||
1252 | if (data == 0) | 1345 | if (data == 0) |
1253 | data = 2; | 1346 | data = 2; |
@@ -1408,8 +1501,8 @@ static int set_rx_csum(struct net_device *dev, u32 data) | |||
1408 | 1501 | ||
1409 | static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) | 1502 | static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) |
1410 | { | 1503 | { |
1411 | const struct adapter *adapter = dev->priv; | 1504 | struct port_info *pi = netdev_priv(dev); |
1412 | const struct port_info *pi = netdev_priv(dev); | 1505 | struct adapter *adapter = pi->adapter; |
1413 | const struct qset_params *q = &adapter->params.sge.qset[pi->first_qset]; | 1506 | const struct qset_params *q = &adapter->params.sge.qset[pi->first_qset]; |
1414 | 1507 | ||
1415 | e->rx_max_pending = MAX_RX_BUFFERS; | 1508 | e->rx_max_pending = MAX_RX_BUFFERS; |
@@ -1425,10 +1518,10 @@ static void get_sge_param(struct net_device *dev, struct ethtool_ringparam *e) | |||
1425 | 1518 | ||
1426 | static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e) | 1519 | static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e) |
1427 | { | 1520 | { |
1428 | int i; | 1521 | struct port_info *pi = netdev_priv(dev); |
1522 | struct adapter *adapter = pi->adapter; | ||
1429 | struct qset_params *q; | 1523 | struct qset_params *q; |
1430 | struct adapter *adapter = dev->priv; | 1524 | int i; |
1431 | const struct port_info *pi = netdev_priv(dev); | ||
1432 | 1525 | ||
1433 | if (e->rx_pending > MAX_RX_BUFFERS || | 1526 | if (e->rx_pending > MAX_RX_BUFFERS || |
1434 | e->rx_jumbo_pending > MAX_RX_JUMBO_BUFFERS || | 1527 | e->rx_jumbo_pending > MAX_RX_JUMBO_BUFFERS || |
@@ -1457,7 +1550,8 @@ static int set_sge_param(struct net_device *dev, struct ethtool_ringparam *e) | |||
1457 | 1550 | ||
1458 | static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c) | 1551 | static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c) |
1459 | { | 1552 | { |
1460 | struct adapter *adapter = dev->priv; | 1553 | struct port_info *pi = netdev_priv(dev); |
1554 | struct adapter *adapter = pi->adapter; | ||
1461 | struct qset_params *qsp = &adapter->params.sge.qset[0]; | 1555 | struct qset_params *qsp = &adapter->params.sge.qset[0]; |
1462 | struct sge_qset *qs = &adapter->sge.qs[0]; | 1556 | struct sge_qset *qs = &adapter->sge.qs[0]; |
1463 | 1557 | ||
@@ -1471,7 +1565,8 @@ static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c) | |||
1471 | 1565 | ||
1472 | static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) | 1566 | static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) |
1473 | { | 1567 | { |
1474 | struct adapter *adapter = dev->priv; | 1568 | struct port_info *pi = netdev_priv(dev); |
1569 | struct adapter *adapter = pi->adapter; | ||
1475 | struct qset_params *q = adapter->params.sge.qset; | 1570 | struct qset_params *q = adapter->params.sge.qset; |
1476 | 1571 | ||
1477 | c->rx_coalesce_usecs = q->coalesce_usecs; | 1572 | c->rx_coalesce_usecs = q->coalesce_usecs; |
@@ -1481,8 +1576,9 @@ static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c) | |||
1481 | static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e, | 1576 | static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e, |
1482 | u8 * data) | 1577 | u8 * data) |
1483 | { | 1578 | { |
1579 | struct port_info *pi = netdev_priv(dev); | ||
1580 | struct adapter *adapter = pi->adapter; | ||
1484 | int i, err = 0; | 1581 | int i, err = 0; |
1485 | struct adapter *adapter = dev->priv; | ||
1486 | 1582 | ||
1487 | u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL); | 1583 | u8 *buf = kmalloc(EEPROMSIZE, GFP_KERNEL); |
1488 | if (!buf) | 1584 | if (!buf) |
@@ -1501,10 +1597,11 @@ static int get_eeprom(struct net_device *dev, struct ethtool_eeprom *e, | |||
1501 | static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | 1597 | static int set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, |
1502 | u8 * data) | 1598 | u8 * data) |
1503 | { | 1599 | { |
1600 | struct port_info *pi = netdev_priv(dev); | ||
1601 | struct adapter *adapter = pi->adapter; | ||
1602 | u32 aligned_offset, aligned_len, *p; | ||
1504 | u8 *buf; | 1603 | u8 *buf; |
1505 | int err = 0; | 1604 | int err = 0; |
1506 | u32 aligned_offset, aligned_len, *p; | ||
1507 | struct adapter *adapter = dev->priv; | ||
1508 | 1605 | ||
1509 | if (eeprom->magic != EEPROM_MAGIC) | 1606 | if (eeprom->magic != EEPROM_MAGIC) |
1510 | return -EINVAL; | 1607 | return -EINVAL; |
@@ -1592,9 +1689,10 @@ static int in_range(int val, int lo, int hi) | |||
1592 | 1689 | ||
1593 | static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | 1690 | static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) |
1594 | { | 1691 | { |
1595 | int ret; | 1692 | struct port_info *pi = netdev_priv(dev); |
1693 | struct adapter *adapter = pi->adapter; | ||
1596 | u32 cmd; | 1694 | u32 cmd; |
1597 | struct adapter *adapter = dev->priv; | 1695 | int ret; |
1598 | 1696 | ||
1599 | if (copy_from_user(&cmd, useraddr, sizeof(cmd))) | 1697 | if (copy_from_user(&cmd, useraddr, sizeof(cmd))) |
1600 | return -EFAULT; | 1698 | return -EFAULT; |
@@ -1923,10 +2021,10 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | |||
1923 | 2021 | ||
1924 | static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd) | 2022 | static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd) |
1925 | { | 2023 | { |
1926 | int ret, mmd; | ||
1927 | struct adapter *adapter = dev->priv; | ||
1928 | struct port_info *pi = netdev_priv(dev); | ||
1929 | struct mii_ioctl_data *data = if_mii(req); | 2024 | struct mii_ioctl_data *data = if_mii(req); |
2025 | struct port_info *pi = netdev_priv(dev); | ||
2026 | struct adapter *adapter = pi->adapter; | ||
2027 | int ret, mmd; | ||
1930 | 2028 | ||
1931 | switch (cmd) { | 2029 | switch (cmd) { |
1932 | case SIOCGMIIPHY: | 2030 | case SIOCGMIIPHY: |
@@ -1994,9 +2092,9 @@ static int cxgb_ioctl(struct net_device *dev, struct ifreq *req, int cmd) | |||
1994 | 2092 | ||
1995 | static int cxgb_change_mtu(struct net_device *dev, int new_mtu) | 2093 | static int cxgb_change_mtu(struct net_device *dev, int new_mtu) |
1996 | { | 2094 | { |
1997 | int ret; | ||
1998 | struct adapter *adapter = dev->priv; | ||
1999 | struct port_info *pi = netdev_priv(dev); | 2095 | struct port_info *pi = netdev_priv(dev); |
2096 | struct adapter *adapter = pi->adapter; | ||
2097 | int ret; | ||
2000 | 2098 | ||
2001 | if (new_mtu < 81) /* accommodate SACK */ | 2099 | if (new_mtu < 81) /* accommodate SACK */ |
2002 | return -EINVAL; | 2100 | return -EINVAL; |
@@ -2013,8 +2111,8 @@ static int cxgb_change_mtu(struct net_device *dev, int new_mtu) | |||
2013 | 2111 | ||
2014 | static int cxgb_set_mac_addr(struct net_device *dev, void *p) | 2112 | static int cxgb_set_mac_addr(struct net_device *dev, void *p) |
2015 | { | 2113 | { |
2016 | struct adapter *adapter = dev->priv; | ||
2017 | struct port_info *pi = netdev_priv(dev); | 2114 | struct port_info *pi = netdev_priv(dev); |
2115 | struct adapter *adapter = pi->adapter; | ||
2018 | struct sockaddr *addr = p; | 2116 | struct sockaddr *addr = p; |
2019 | 2117 | ||
2020 | if (!is_valid_ether_addr(addr->sa_data)) | 2118 | if (!is_valid_ether_addr(addr->sa_data)) |
@@ -2050,8 +2148,8 @@ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p) | |||
2050 | 2148 | ||
2051 | static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | 2149 | static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp) |
2052 | { | 2150 | { |
2053 | struct adapter *adapter = dev->priv; | ||
2054 | struct port_info *pi = netdev_priv(dev); | 2151 | struct port_info *pi = netdev_priv(dev); |
2152 | struct adapter *adapter = pi->adapter; | ||
2055 | 2153 | ||
2056 | pi->vlan_grp = grp; | 2154 | pi->vlan_grp = grp; |
2057 | if (adapter->params.rev > 0) | 2155 | if (adapter->params.rev > 0) |
@@ -2070,8 +2168,8 @@ static void vlan_rx_register(struct net_device *dev, struct vlan_group *grp) | |||
2070 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2168 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2071 | static void cxgb_netpoll(struct net_device *dev) | 2169 | static void cxgb_netpoll(struct net_device *dev) |
2072 | { | 2170 | { |
2073 | struct adapter *adapter = dev->priv; | ||
2074 | struct port_info *pi = netdev_priv(dev); | 2171 | struct port_info *pi = netdev_priv(dev); |
2172 | struct adapter *adapter = pi->adapter; | ||
2075 | int qidx; | 2173 | int qidx; |
2076 | 2174 | ||
2077 | for (qidx = pi->first_qset; qidx < pi->first_qset + pi->nqsets; qidx++) { | 2175 | for (qidx = pi->first_qset; qidx < pi->first_qset + pi->nqsets; qidx++) { |
@@ -2088,42 +2186,6 @@ static void cxgb_netpoll(struct net_device *dev) | |||
2088 | } | 2186 | } |
2089 | #endif | 2187 | #endif |
2090 | 2188 | ||
2091 | #define TPSRAM_NAME "t3%c_protocol_sram-%d.%d.%d.bin" | ||
2092 | int update_tpsram(struct adapter *adap) | ||
2093 | { | ||
2094 | const struct firmware *tpsram; | ||
2095 | char buf[64]; | ||
2096 | struct device *dev = &adap->pdev->dev; | ||
2097 | int ret; | ||
2098 | char rev; | ||
2099 | |||
2100 | rev = adap->params.rev == T3_REV_B2 ? 'b' : 'a'; | ||
2101 | |||
2102 | snprintf(buf, sizeof(buf), TPSRAM_NAME, rev, | ||
2103 | TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO); | ||
2104 | |||
2105 | ret = request_firmware(&tpsram, buf, dev); | ||
2106 | if (ret < 0) { | ||
2107 | dev_err(dev, "could not load TP SRAM: unable to load %s\n", | ||
2108 | buf); | ||
2109 | return ret; | ||
2110 | } | ||
2111 | |||
2112 | ret = t3_check_tpsram(adap, tpsram->data, tpsram->size); | ||
2113 | if (ret) | ||
2114 | goto release_tpsram; | ||
2115 | |||
2116 | ret = t3_set_proto_sram(adap, tpsram->data); | ||
2117 | if (ret) | ||
2118 | dev_err(dev, "loading protocol SRAM failed\n"); | ||
2119 | |||
2120 | release_tpsram: | ||
2121 | release_firmware(tpsram); | ||
2122 | |||
2123 | return ret; | ||
2124 | } | ||
2125 | |||
2126 | |||
2127 | /* | 2189 | /* |
2128 | * Periodic accumulation of MAC statistics. | 2190 | * Periodic accumulation of MAC statistics. |
2129 | */ | 2191 | */ |
@@ -2433,6 +2495,7 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
2433 | 2495 | ||
2434 | adapter->port[i] = netdev; | 2496 | adapter->port[i] = netdev; |
2435 | pi = netdev_priv(netdev); | 2497 | pi = netdev_priv(netdev); |
2498 | pi->adapter = adapter; | ||
2436 | pi->rx_csum_offload = 1; | 2499 | pi->rx_csum_offload = 1; |
2437 | pi->nqsets = 1; | 2500 | pi->nqsets = 1; |
2438 | pi->first_qset = i; | 2501 | pi->first_qset = i; |
@@ -2442,7 +2505,6 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
2442 | netdev->irq = pdev->irq; | 2505 | netdev->irq = pdev->irq; |
2443 | netdev->mem_start = mmio_start; | 2506 | netdev->mem_start = mmio_start; |
2444 | netdev->mem_end = mmio_start + mmio_len - 1; | 2507 | netdev->mem_end = mmio_start + mmio_len - 1; |
2445 | netdev->priv = adapter; | ||
2446 | netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; | 2508 | netdev->features |= NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; |
2447 | netdev->features |= NETIF_F_LLTX; | 2509 | netdev->features |= NETIF_F_LLTX; |
2448 | if (pci_using_dac) | 2510 | if (pci_using_dac) |
@@ -2467,18 +2529,11 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
2467 | SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops); | 2529 | SET_ETHTOOL_OPS(netdev, &cxgb_ethtool_ops); |
2468 | } | 2530 | } |
2469 | 2531 | ||
2470 | pci_set_drvdata(pdev, adapter->port[0]); | 2532 | pci_set_drvdata(pdev, adapter); |
2471 | if (t3_prep_adapter(adapter, ai, 1) < 0) { | 2533 | if (t3_prep_adapter(adapter, ai, 1) < 0) { |
2472 | err = -ENODEV; | 2534 | err = -ENODEV; |
2473 | goto out_free_dev; | 2535 | goto out_free_dev; |
2474 | } | 2536 | } |
2475 | |||
2476 | err = t3_check_tpsram_version(adapter); | ||
2477 | if (err == -EINVAL) | ||
2478 | err = update_tpsram(adapter); | ||
2479 | |||
2480 | if (err) | ||
2481 | goto out_free_dev; | ||
2482 | 2537 | ||
2483 | /* | 2538 | /* |
2484 | * The card is now ready to go. If any errors occur during device | 2539 | * The card is now ready to go. If any errors occur during device |
@@ -2547,11 +2602,10 @@ out_release_regions: | |||
2547 | 2602 | ||
2548 | static void __devexit remove_one(struct pci_dev *pdev) | 2603 | static void __devexit remove_one(struct pci_dev *pdev) |
2549 | { | 2604 | { |
2550 | struct net_device *dev = pci_get_drvdata(pdev); | 2605 | struct adapter *adapter = pci_get_drvdata(pdev); |
2551 | 2606 | ||
2552 | if (dev) { | 2607 | if (adapter) { |
2553 | int i; | 2608 | int i; |
2554 | struct adapter *adapter = dev->priv; | ||
2555 | 2609 | ||
2556 | t3_sge_stop(adapter); | 2610 | t3_sge_stop(adapter); |
2557 | sysfs_remove_group(&adapter->port[0]->dev.kobj, | 2611 | sysfs_remove_group(&adapter->port[0]->dev.kobj, |
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c index e620ed4c3ff0..bdff7baeb59d 100644 --- a/drivers/net/cxgb3/cxgb3_offload.c +++ b/drivers/net/cxgb3/cxgb3_offload.c | |||
@@ -593,6 +593,16 @@ int cxgb3_alloc_stid(struct t3cdev *tdev, struct cxgb3_client *client, | |||
593 | 593 | ||
594 | EXPORT_SYMBOL(cxgb3_alloc_stid); | 594 | EXPORT_SYMBOL(cxgb3_alloc_stid); |
595 | 595 | ||
596 | /* Get the t3cdev associated with a net_device */ | ||
597 | struct t3cdev *dev2t3cdev(struct net_device *dev) | ||
598 | { | ||
599 | const struct port_info *pi = netdev_priv(dev); | ||
600 | |||
601 | return (struct t3cdev *)pi->adapter; | ||
602 | } | ||
603 | |||
604 | EXPORT_SYMBOL(dev2t3cdev); | ||
605 | |||
596 | static int do_smt_write_rpl(struct t3cdev *dev, struct sk_buff *skb) | 606 | static int do_smt_write_rpl(struct t3cdev *dev, struct sk_buff *skb) |
597 | { | 607 | { |
598 | struct cpl_smt_write_rpl *rpl = cplhdr(skb); | 608 | struct cpl_smt_write_rpl *rpl = cplhdr(skb); |
@@ -925,7 +935,7 @@ void cxgb_neigh_update(struct neighbour *neigh) | |||
925 | struct net_device *dev = neigh->dev; | 935 | struct net_device *dev = neigh->dev; |
926 | 936 | ||
927 | if (dev && (is_offloading(dev))) { | 937 | if (dev && (is_offloading(dev))) { |
928 | struct t3cdev *tdev = T3CDEV(dev); | 938 | struct t3cdev *tdev = dev2t3cdev(dev); |
929 | 939 | ||
930 | BUG_ON(!tdev); | 940 | BUG_ON(!tdev); |
931 | t3_l2t_update(tdev, neigh); | 941 | t3_l2t_update(tdev, neigh); |
@@ -973,9 +983,9 @@ void cxgb_redirect(struct dst_entry *old, struct dst_entry *new) | |||
973 | "device ignored.\n", __FUNCTION__); | 983 | "device ignored.\n", __FUNCTION__); |
974 | return; | 984 | return; |
975 | } | 985 | } |
976 | tdev = T3CDEV(olddev); | 986 | tdev = dev2t3cdev(olddev); |
977 | BUG_ON(!tdev); | 987 | BUG_ON(!tdev); |
978 | if (tdev != T3CDEV(newdev)) { | 988 | if (tdev != dev2t3cdev(newdev)) { |
979 | printk(KERN_WARNING "%s: Redirect to different " | 989 | printk(KERN_WARNING "%s: Redirect to different " |
980 | "offload device ignored.\n", __FUNCTION__); | 990 | "offload device ignored.\n", __FUNCTION__); |
981 | return; | 991 | return; |
diff --git a/drivers/net/cxgb3/cxgb3_offload.h b/drivers/net/cxgb3/cxgb3_offload.h index f15446a32efc..7a379138b5a6 100644 --- a/drivers/net/cxgb3/cxgb3_offload.h +++ b/drivers/net/cxgb3/cxgb3_offload.h | |||
@@ -51,6 +51,8 @@ void cxgb3_offload_deactivate(struct adapter *adapter); | |||
51 | 51 | ||
52 | void cxgb3_set_dummy_ops(struct t3cdev *dev); | 52 | void cxgb3_set_dummy_ops(struct t3cdev *dev); |
53 | 53 | ||
54 | struct t3cdev *dev2t3cdev(struct net_device *dev); | ||
55 | |||
54 | /* | 56 | /* |
55 | * Client registration. Users of T3 driver must register themselves. | 57 | * Client registration. Users of T3 driver must register themselves. |
56 | * The T3 driver will call the add function of every client for each T3 | 58 | * The T3 driver will call the add function of every client for each T3 |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index a2cfd68ac757..58a5f60521ed 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -1073,7 +1073,7 @@ int t3_eth_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1073 | { | 1073 | { |
1074 | unsigned int ndesc, pidx, credits, gen, compl; | 1074 | unsigned int ndesc, pidx, credits, gen, compl; |
1075 | const struct port_info *pi = netdev_priv(dev); | 1075 | const struct port_info *pi = netdev_priv(dev); |
1076 | struct adapter *adap = dev->priv; | 1076 | struct adapter *adap = pi->adapter; |
1077 | struct sge_qset *qs = dev2qset(dev); | 1077 | struct sge_qset *qs = dev2qset(dev); |
1078 | struct sge_txq *q = &qs->txq[TXQ_ETH]; | 1078 | struct sge_txq *q = &qs->txq[TXQ_ETH]; |
1079 | 1079 | ||
@@ -1326,7 +1326,8 @@ static void restart_ctrlq(unsigned long data) | |||
1326 | struct sk_buff *skb; | 1326 | struct sk_buff *skb; |
1327 | struct sge_qset *qs = (struct sge_qset *)data; | 1327 | struct sge_qset *qs = (struct sge_qset *)data; |
1328 | struct sge_txq *q = &qs->txq[TXQ_CTRL]; | 1328 | struct sge_txq *q = &qs->txq[TXQ_CTRL]; |
1329 | struct adapter *adap = qs->netdev->priv; | 1329 | const struct port_info *pi = netdev_priv(qs->netdev); |
1330 | struct adapter *adap = pi->adapter; | ||
1330 | 1331 | ||
1331 | spin_lock(&q->lock); | 1332 | spin_lock(&q->lock); |
1332 | again:reclaim_completed_tx_imm(q); | 1333 | again:reclaim_completed_tx_imm(q); |
@@ -1531,7 +1532,8 @@ static void restart_offloadq(unsigned long data) | |||
1531 | struct sk_buff *skb; | 1532 | struct sk_buff *skb; |
1532 | struct sge_qset *qs = (struct sge_qset *)data; | 1533 | struct sge_qset *qs = (struct sge_qset *)data; |
1533 | struct sge_txq *q = &qs->txq[TXQ_OFLD]; | 1534 | struct sge_txq *q = &qs->txq[TXQ_OFLD]; |
1534 | struct adapter *adap = qs->netdev->priv; | 1535 | const struct port_info *pi = netdev_priv(qs->netdev); |
1536 | struct adapter *adap = pi->adapter; | ||
1535 | 1537 | ||
1536 | spin_lock(&q->lock); | 1538 | spin_lock(&q->lock); |
1537 | again:reclaim_completed_tx(adap, q); | 1539 | again:reclaim_completed_tx(adap, q); |
@@ -1675,7 +1677,8 @@ static inline void deliver_partial_bundle(struct t3cdev *tdev, | |||
1675 | */ | 1677 | */ |
1676 | static int ofld_poll(struct net_device *dev, int *budget) | 1678 | static int ofld_poll(struct net_device *dev, int *budget) |
1677 | { | 1679 | { |
1678 | struct adapter *adapter = dev->priv; | 1680 | const struct port_info *pi = netdev_priv(dev); |
1681 | struct adapter *adapter = pi->adapter; | ||
1679 | struct sge_qset *qs = dev2qset(dev); | 1682 | struct sge_qset *qs = dev2qset(dev); |
1680 | struct sge_rspq *q = &qs->rspq; | 1683 | struct sge_rspq *q = &qs->rspq; |
1681 | int work_done, limit = min(*budget, dev->quota), avail = limit; | 1684 | int work_done, limit = min(*budget, dev->quota), avail = limit; |
@@ -2075,7 +2078,8 @@ static inline int is_pure_response(const struct rsp_desc *r) | |||
2075 | */ | 2078 | */ |
2076 | static int napi_rx_handler(struct net_device *dev, int *budget) | 2079 | static int napi_rx_handler(struct net_device *dev, int *budget) |
2077 | { | 2080 | { |
2078 | struct adapter *adap = dev->priv; | 2081 | const struct port_info *pi = netdev_priv(dev); |
2082 | struct adapter *adap = pi->adapter; | ||
2079 | struct sge_qset *qs = dev2qset(dev); | 2083 | struct sge_qset *qs = dev2qset(dev); |
2080 | int effective_budget = min(*budget, dev->quota); | 2084 | int effective_budget = min(*budget, dev->quota); |
2081 | 2085 | ||
@@ -2205,7 +2209,8 @@ static inline int handle_responses(struct adapter *adap, struct sge_rspq *q) | |||
2205 | irqreturn_t t3_sge_intr_msix(int irq, void *cookie) | 2209 | irqreturn_t t3_sge_intr_msix(int irq, void *cookie) |
2206 | { | 2210 | { |
2207 | struct sge_qset *qs = cookie; | 2211 | struct sge_qset *qs = cookie; |
2208 | struct adapter *adap = qs->netdev->priv; | 2212 | const struct port_info *pi = netdev_priv(qs->netdev); |
2213 | struct adapter *adap = pi->adapter; | ||
2209 | struct sge_rspq *q = &qs->rspq; | 2214 | struct sge_rspq *q = &qs->rspq; |
2210 | 2215 | ||
2211 | spin_lock(&q->lock); | 2216 | spin_lock(&q->lock); |
@@ -2224,7 +2229,8 @@ irqreturn_t t3_sge_intr_msix(int irq, void *cookie) | |||
2224 | irqreturn_t t3_sge_intr_msix_napi(int irq, void *cookie) | 2229 | irqreturn_t t3_sge_intr_msix_napi(int irq, void *cookie) |
2225 | { | 2230 | { |
2226 | struct sge_qset *qs = cookie; | 2231 | struct sge_qset *qs = cookie; |
2227 | struct adapter *adap = qs->netdev->priv; | 2232 | const struct port_info *pi = netdev_priv(qs->netdev); |
2233 | struct adapter *adap = pi->adapter; | ||
2228 | struct sge_rspq *q = &qs->rspq; | 2234 | struct sge_rspq *q = &qs->rspq; |
2229 | 2235 | ||
2230 | spin_lock(&q->lock); | 2236 | spin_lock(&q->lock); |
@@ -2508,7 +2514,8 @@ static void sge_timer_cb(unsigned long data) | |||
2508 | { | 2514 | { |
2509 | spinlock_t *lock; | 2515 | spinlock_t *lock; |
2510 | struct sge_qset *qs = (struct sge_qset *)data; | 2516 | struct sge_qset *qs = (struct sge_qset *)data; |
2511 | struct adapter *adap = qs->netdev->priv; | 2517 | const struct port_info *pi = netdev_priv(qs->netdev); |
2518 | struct adapter *adap = pi->adapter; | ||
2512 | 2519 | ||
2513 | if (spin_trylock(&qs->txq[TXQ_ETH].lock)) { | 2520 | if (spin_trylock(&qs->txq[TXQ_ETH].lock)) { |
2514 | reclaim_completed_tx(adap, &qs->txq[TXQ_ETH]); | 2521 | reclaim_completed_tx(adap, &qs->txq[TXQ_ETH]); |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index dd3149d94ba8..b02d15daf5d9 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -848,16 +848,15 @@ static int t3_write_flash(struct adapter *adapter, unsigned int addr, | |||
848 | } | 848 | } |
849 | 849 | ||
850 | /** | 850 | /** |
851 | * t3_check_tpsram_version - read the tp sram version | 851 | * t3_get_tp_version - read the tp sram version |
852 | * @adapter: the adapter | 852 | * @adapter: the adapter |
853 | * @vers: where to place the version | ||
853 | * | 854 | * |
854 | * Reads the protocol sram version from serial eeprom. | 855 | * Reads the protocol sram version from sram. |
855 | */ | 856 | */ |
856 | int t3_check_tpsram_version(struct adapter *adapter) | 857 | int t3_get_tp_version(struct adapter *adapter, u32 *vers) |
857 | { | 858 | { |
858 | int ret; | 859 | int ret; |
859 | u32 vers; | ||
860 | unsigned int major, minor; | ||
861 | 860 | ||
862 | /* Get version loaded in SRAM */ | 861 | /* Get version loaded in SRAM */ |
863 | t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0); | 862 | t3_write_reg(adapter, A_TP_EMBED_OP_FIELD0, 0); |
@@ -866,7 +865,32 @@ int t3_check_tpsram_version(struct adapter *adapter) | |||
866 | if (ret) | 865 | if (ret) |
867 | return ret; | 866 | return ret; |
868 | 867 | ||
869 | vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1); | 868 | *vers = t3_read_reg(adapter, A_TP_EMBED_OP_FIELD1); |
869 | |||
870 | return 0; | ||
871 | } | ||
872 | |||
873 | /** | ||
874 | * t3_check_tpsram_version - read the tp sram version | ||
875 | * @adapter: the adapter | ||
876 | * @must_load: set to 1 if loading a new microcode image is required | ||
877 | * | ||
878 | * Reads the protocol sram version from flash. | ||
879 | */ | ||
880 | int t3_check_tpsram_version(struct adapter *adapter, int *must_load) | ||
881 | { | ||
882 | int ret; | ||
883 | u32 vers; | ||
884 | unsigned int major, minor; | ||
885 | |||
886 | if (adapter->params.rev == T3_REV_A) | ||
887 | return 0; | ||
888 | |||
889 | *must_load = 1; | ||
890 | |||
891 | ret = t3_get_tp_version(adapter, &vers); | ||
892 | if (ret) | ||
893 | return ret; | ||
870 | 894 | ||
871 | major = G_TP_VERSION_MAJOR(vers); | 895 | major = G_TP_VERSION_MAJOR(vers); |
872 | minor = G_TP_VERSION_MINOR(vers); | 896 | minor = G_TP_VERSION_MINOR(vers); |
@@ -874,6 +898,16 @@ int t3_check_tpsram_version(struct adapter *adapter) | |||
874 | if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) | 898 | if (major == TP_VERSION_MAJOR && minor == TP_VERSION_MINOR) |
875 | return 0; | 899 | return 0; |
876 | 900 | ||
901 | if (major != TP_VERSION_MAJOR) | ||
902 | CH_ERR(adapter, "found wrong TP version (%u.%u), " | ||
903 | "driver needs version %d.%d\n", major, minor, | ||
904 | TP_VERSION_MAJOR, TP_VERSION_MINOR); | ||
905 | else { | ||
906 | *must_load = 0; | ||
907 | CH_ERR(adapter, "found wrong TP version (%u.%u), " | ||
908 | "driver compiled for version %d.%d\n", major, minor, | ||
909 | TP_VERSION_MAJOR, TP_VERSION_MINOR); | ||
910 | } | ||
877 | return -EINVAL; | 911 | return -EINVAL; |
878 | } | 912 | } |
879 | 913 | ||
diff --git a/drivers/net/cxgb3/t3cdev.h b/drivers/net/cxgb3/t3cdev.h index fa4099bc0416..77fcc1a4984e 100644 --- a/drivers/net/cxgb3/t3cdev.h +++ b/drivers/net/cxgb3/t3cdev.h | |||
@@ -42,9 +42,6 @@ | |||
42 | 42 | ||
43 | #define T3CNAMSIZ 16 | 43 | #define T3CNAMSIZ 16 |
44 | 44 | ||
45 | /* Get the t3cdev associated with a net_device */ | ||
46 | #define T3CDEV(netdev) (struct t3cdev *)(netdev->priv) | ||
47 | |||
48 | struct cxgb3_client; | 45 | struct cxgb3_client; |
49 | 46 | ||
50 | enum t3ctype { | 47 | enum t3ctype { |
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index 3ca1e8ece548..0834ef0eddb4 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #ifdef CONFIG_SERIAL_8250 | 48 | #ifdef CONFIG_SERIAL_8250 |
49 | #include <linux/serial_core.h> | 49 | #include <linux/serial_core.h> |
50 | #include <linux/serial_8250.h> | 50 | #include <linux/serial_8250.h> |
51 | #include <linux/serial_reg.h> | ||
51 | #endif | 52 | #endif |
52 | 53 | ||
53 | #include <linux/netdevice.h> | 54 | #include <linux/netdevice.h> |
@@ -1151,13 +1152,41 @@ static int ioc3_is_menet(struct pci_dev *pdev) | |||
1151 | * Also look in ip27-pci.c:pci_fixup_ioc3() for some comments on working | 1152 | * Also look in ip27-pci.c:pci_fixup_ioc3() for some comments on working |
1152 | * around ioc3 oddities in this respect. | 1153 | * around ioc3 oddities in this respect. |
1153 | * | 1154 | * |
1154 | * The IOC3 serials use a 22MHz clock rate with an additional divider by 3. | 1155 | * The IOC3 serials use a 22MHz clock rate with an additional divider which |
1156 | * can be programmed in the SCR register if the DLAB bit is set. | ||
1157 | * | ||
1158 | * Register to interrupt zero because we share the interrupt with | ||
1159 | * the serial driver which we don't properly support yet. | ||
1160 | * | ||
1161 | * Can't use UPF_IOREMAP as the whole of IOC3 resources have already been | ||
1162 | * registered. | ||
1155 | */ | 1163 | */ |
1164 | static void __devinit ioc3_8250_register(struct ioc3_uartregs __iomem *uart) | ||
1165 | { | ||
1166 | #define COSMISC_CONSTANT 6 | ||
1167 | |||
1168 | struct uart_port port = { | ||
1169 | .irq = 0, | ||
1170 | .flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF, | ||
1171 | .iotype = UPIO_MEM, | ||
1172 | .regshift = 0, | ||
1173 | .uartclk = (22000000 << 1) / COSMISC_CONSTANT, | ||
1174 | |||
1175 | .membase = (unsigned char __iomem *) uart, | ||
1176 | .mapbase = (unsigned long) uart, | ||
1177 | }; | ||
1178 | unsigned char lcr; | ||
1179 | |||
1180 | lcr = uart->iu_lcr; | ||
1181 | uart->iu_lcr = lcr | UART_LCR_DLAB; | ||
1182 | uart->iu_scr = COSMISC_CONSTANT, | ||
1183 | uart->iu_lcr = lcr; | ||
1184 | uart->iu_lcr; | ||
1185 | serial8250_register_port(&port); | ||
1186 | } | ||
1156 | 1187 | ||
1157 | static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) | 1188 | static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) |
1158 | { | 1189 | { |
1159 | struct uart_port port; | ||
1160 | |||
1161 | /* | 1190 | /* |
1162 | * We need to recognice and treat the fourth MENET serial as it | 1191 | * We need to recognice and treat the fourth MENET serial as it |
1163 | * does not have an SuperIO chip attached to it, therefore attempting | 1192 | * does not have an SuperIO chip attached to it, therefore attempting |
@@ -1171,24 +1200,35 @@ static void __devinit ioc3_serial_probe(struct pci_dev *pdev, struct ioc3 *ioc3) | |||
1171 | return; | 1200 | return; |
1172 | 1201 | ||
1173 | /* | 1202 | /* |
1174 | * Register to interrupt zero because we share the interrupt with | 1203 | * Switch IOC3 to PIO mode. It probably already was but let's be |
1175 | * the serial driver which we don't properly support yet. | 1204 | * paranoid |
1176 | * | ||
1177 | * Can't use UPF_IOREMAP as the whole of IOC3 resources have already | ||
1178 | * been registered. | ||
1179 | */ | 1205 | */ |
1180 | memset(&port, 0, sizeof(port)); | 1206 | ioc3->gpcr_s = GPCR_UARTA_MODESEL | GPCR_UARTB_MODESEL; |
1181 | port.irq = 0; | 1207 | ioc3->gpcr_s; |
1182 | port.flags = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF; | 1208 | ioc3->gppr_6 = 0; |
1183 | port.iotype = UPIO_MEM; | 1209 | ioc3->gppr_6; |
1184 | port.regshift = 0; | 1210 | ioc3->gppr_7 = 0; |
1185 | port.uartclk = 22000000 / 3; | 1211 | ioc3->gppr_7; |
1186 | 1212 | ioc3->sscr_a = ioc3->sscr_a & ~SSCR_DMA_EN; | |
1187 | port.membase = (unsigned char *) &ioc3->sregs.uarta; | 1213 | ioc3->sscr_a; |
1188 | serial8250_register_port(&port); | 1214 | ioc3->sscr_b = ioc3->sscr_b & ~SSCR_DMA_EN; |
1189 | 1215 | ioc3->sscr_b; | |
1190 | port.membase = (unsigned char *) &ioc3->sregs.uartb; | 1216 | /* Disable all SA/B interrupts except for SA/B_INT in SIO_IEC. */ |
1191 | serial8250_register_port(&port); | 1217 | ioc3->sio_iec &= ~ (SIO_IR_SA_TX_MT | SIO_IR_SA_RX_FULL | |
1218 | SIO_IR_SA_RX_HIGH | SIO_IR_SA_RX_TIMER | | ||
1219 | SIO_IR_SA_DELTA_DCD | SIO_IR_SA_DELTA_CTS | | ||
1220 | SIO_IR_SA_TX_EXPLICIT | SIO_IR_SA_MEMERR); | ||
1221 | ioc3->sio_iec |= SIO_IR_SA_INT; | ||
1222 | ioc3->sscr_a = 0; | ||
1223 | ioc3->sio_iec &= ~ (SIO_IR_SB_TX_MT | SIO_IR_SB_RX_FULL | | ||
1224 | SIO_IR_SB_RX_HIGH | SIO_IR_SB_RX_TIMER | | ||
1225 | SIO_IR_SB_DELTA_DCD | SIO_IR_SB_DELTA_CTS | | ||
1226 | SIO_IR_SB_TX_EXPLICIT | SIO_IR_SB_MEMERR); | ||
1227 | ioc3->sio_iec |= SIO_IR_SB_INT; | ||
1228 | ioc3->sscr_b = 0; | ||
1229 | |||
1230 | ioc3_8250_register(&ioc3->sregs.uarta); | ||
1231 | ioc3_8250_register(&ioc3->sregs.uartb); | ||
1192 | } | 1232 | } |
1193 | #endif | 1233 | #endif |
1194 | 1234 | ||
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index 3276866b17e2..d72f8f8fcb50 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -649,9 +649,11 @@ enum { | |||
649 | #define PCIX_INT_VECTOR (0x10100) | 649 | #define PCIX_INT_VECTOR (0x10100) |
650 | #define PCIX_INT_MASK (0x10104) | 650 | #define PCIX_INT_MASK (0x10104) |
651 | 651 | ||
652 | #define PCIX_MN_WINDOW (0x10200) | 652 | #define PCIX_MN_WINDOW_F0 (0x10200) |
653 | #define PCIX_MN_WINDOW(_f) (PCIX_MN_WINDOW_F0 + (0x20 * (_f))) | ||
653 | #define PCIX_MS_WINDOW (0x10204) | 654 | #define PCIX_MS_WINDOW (0x10204) |
654 | #define PCIX_SN_WINDOW (0x10208) | 655 | #define PCIX_SN_WINDOW_F0 (0x10208) |
656 | #define PCIX_SN_WINDOW(_f) (PCIX_SN_WINDOW_F0 + (0x20 * (_f))) | ||
655 | #define PCIX_CRB_WINDOW (0x10210) | 657 | #define PCIX_CRB_WINDOW (0x10210) |
656 | #define PCIX_CRB_WINDOW_F0 (0x10210) | 658 | #define PCIX_CRB_WINDOW_F0 (0x10210) |
657 | #define PCIX_CRB_WINDOW_F1 (0x10230) | 659 | #define PCIX_CRB_WINDOW_F1 (0x10230) |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index aac15421bd1e..a7b8d7f23259 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -904,11 +904,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter, | |||
904 | ddr_mn_window = window; | 904 | ddr_mn_window = window; |
905 | writel(window, PCI_OFFSET_SECOND_RANGE(adapter, | 905 | writel(window, PCI_OFFSET_SECOND_RANGE(adapter, |
906 | NETXEN_PCIX_PH_REG | 906 | NETXEN_PCIX_PH_REG |
907 | (PCIX_MN_WINDOW))); | 907 | (PCIX_MN_WINDOW(adapter->ahw.pci_func)))); |
908 | /* MUST make sure window is set before we forge on... */ | 908 | /* MUST make sure window is set before we forge on... */ |
909 | readl(PCI_OFFSET_SECOND_RANGE(adapter, | 909 | readl(PCI_OFFSET_SECOND_RANGE(adapter, |
910 | NETXEN_PCIX_PH_REG | 910 | NETXEN_PCIX_PH_REG |
911 | (PCIX_MN_WINDOW))); | 911 | (PCIX_MN_WINDOW(adapter->ahw.pci_func)))); |
912 | } | 912 | } |
913 | addr -= (window * NETXEN_WINDOW_ONE); | 913 | addr -= (window * NETXEN_WINDOW_ONE); |
914 | addr += NETXEN_PCI_DDR_NET; | 914 | addr += NETXEN_PCI_DDR_NET; |
@@ -929,11 +929,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter, | |||
929 | writel((window << 22), | 929 | writel((window << 22), |
930 | PCI_OFFSET_SECOND_RANGE(adapter, | 930 | PCI_OFFSET_SECOND_RANGE(adapter, |
931 | NETXEN_PCIX_PH_REG | 931 | NETXEN_PCIX_PH_REG |
932 | (PCIX_SN_WINDOW))); | 932 | (PCIX_SN_WINDOW(adapter->ahw.pci_func)))); |
933 | /* MUST make sure window is set before we forge on... */ | 933 | /* MUST make sure window is set before we forge on... */ |
934 | readl(PCI_OFFSET_SECOND_RANGE(adapter, | 934 | readl(PCI_OFFSET_SECOND_RANGE(adapter, |
935 | NETXEN_PCIX_PH_REG | 935 | NETXEN_PCIX_PH_REG |
936 | (PCIX_SN_WINDOW))); | 936 | (PCIX_SN_WINDOW(adapter->ahw.pci_func)))); |
937 | } | 937 | } |
938 | addr -= (window * 0x400000); | 938 | addr -= (window * 0x400000); |
939 | addr += NETXEN_PCI_QDR_NET; | 939 | addr += NETXEN_PCI_QDR_NET; |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 08a62acde8bf..3122d0101638 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -639,10 +639,6 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
639 | NETXEN_CRB_NORMALIZE(adapter, | 639 | NETXEN_CRB_NORMALIZE(adapter, |
640 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE)); | 640 | NETXEN_ROMUSB_GLB_PEGTUNE_DONE)); |
641 | /* Handshake with the card before we register the devices. */ | 641 | /* Handshake with the card before we register the devices. */ |
642 | writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | ||
643 | netxen_pinit_from_rom(adapter, 0); | ||
644 | msleep(1); | ||
645 | netxen_load_firmware(adapter); | ||
646 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); | 642 | netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE); |
647 | } | 643 | } |
648 | 644 | ||
@@ -750,9 +746,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
750 | 746 | ||
751 | netxen_nic_disable_int(adapter); | 747 | netxen_nic_disable_int(adapter); |
752 | 748 | ||
753 | if (adapter->irq) | ||
754 | free_irq(adapter->irq, adapter); | ||
755 | |||
756 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { | 749 | if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { |
757 | init_firmware_done++; | 750 | init_firmware_done++; |
758 | netxen_free_hw_resources(adapter); | 751 | netxen_free_hw_resources(adapter); |
@@ -776,13 +769,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
776 | } | 769 | } |
777 | } | 770 | } |
778 | 771 | ||
779 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | ||
780 | pci_disable_msi(pdev); | ||
781 | |||
782 | vfree(adapter->cmd_buf_arr); | 772 | vfree(adapter->cmd_buf_arr); |
783 | 773 | ||
784 | pci_disable_device(pdev); | ||
785 | |||
786 | if (adapter->portnum == 0) { | 774 | if (adapter->portnum == 0) { |
787 | if (init_firmware_done) { | 775 | if (init_firmware_done) { |
788 | i = 100; | 776 | i = 100; |
@@ -833,12 +821,19 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) | |||
833 | } | 821 | } |
834 | } | 822 | } |
835 | 823 | ||
824 | if (adapter->irq) | ||
825 | free_irq(adapter->irq, adapter); | ||
826 | |||
827 | if (adapter->flags & NETXEN_NIC_MSI_ENABLED) | ||
828 | pci_disable_msi(pdev); | ||
829 | |||
836 | iounmap(adapter->ahw.db_base); | 830 | iounmap(adapter->ahw.db_base); |
837 | iounmap(adapter->ahw.pci_base0); | 831 | iounmap(adapter->ahw.pci_base0); |
838 | iounmap(adapter->ahw.pci_base1); | 832 | iounmap(adapter->ahw.pci_base1); |
839 | iounmap(adapter->ahw.pci_base2); | 833 | iounmap(adapter->ahw.pci_base2); |
840 | 834 | ||
841 | pci_release_regions(pdev); | 835 | pci_release_regions(pdev); |
836 | pci_disable_device(pdev); | ||
842 | pci_set_drvdata(pdev, NULL); | 837 | pci_set_drvdata(pdev, NULL); |
843 | 838 | ||
844 | free_netdev(netdev); | 839 | free_netdev(netdev); |
diff --git a/drivers/net/ps3_gelic_net.c b/drivers/net/ps3_gelic_net.c index 13d1c0a2a25f..e56503918436 100644 --- a/drivers/net/ps3_gelic_net.c +++ b/drivers/net/ps3_gelic_net.c | |||
@@ -556,7 +556,6 @@ static int gelic_net_stop(struct net_device *netdev) | |||
556 | { | 556 | { |
557 | struct gelic_net_card *card = netdev_priv(netdev); | 557 | struct gelic_net_card *card = netdev_priv(netdev); |
558 | 558 | ||
559 | netif_poll_disable(netdev); | ||
560 | netif_stop_queue(netdev); | 559 | netif_stop_queue(netdev); |
561 | 560 | ||
562 | /* turn off DMA, force end */ | 561 | /* turn off DMA, force end */ |
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index ec18bae05df0..6d4959807abc 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h | |||
@@ -1178,9 +1178,9 @@ qeth_ipaddr_to_string(enum qeth_prot_versions proto, const __u8 *addr, | |||
1178 | char *buf) | 1178 | char *buf) |
1179 | { | 1179 | { |
1180 | if (proto == QETH_PROT_IPV4) | 1180 | if (proto == QETH_PROT_IPV4) |
1181 | return qeth_ipaddr4_to_string(addr, buf); | 1181 | qeth_ipaddr4_to_string(addr, buf); |
1182 | else if (proto == QETH_PROT_IPV6) | 1182 | else if (proto == QETH_PROT_IPV6) |
1183 | return qeth_ipaddr6_to_string(addr, buf); | 1183 | qeth_ipaddr6_to_string(addr, buf); |
1184 | } | 1184 | } |
1185 | 1185 | ||
1186 | static inline int | 1186 | static inline int |
diff --git a/drivers/s390/net/qeth_main.c b/drivers/s390/net/qeth_main.c index 57f69434fbf9..f3e6fbeb2123 100644 --- a/drivers/s390/net/qeth_main.c +++ b/drivers/s390/net/qeth_main.c | |||
@@ -561,7 +561,7 @@ qeth_set_offline(struct ccwgroup_device *cgdev) | |||
561 | } | 561 | } |
562 | 562 | ||
563 | static int | 563 | static int |
564 | qeth_wait_for_threads(struct qeth_card *card, unsigned long threads); | 564 | qeth_threads_running(struct qeth_card *card, unsigned long threads); |
565 | 565 | ||
566 | 566 | ||
567 | static void | 567 | static void |
@@ -576,8 +576,7 @@ qeth_remove_device(struct ccwgroup_device *cgdev) | |||
576 | if (!card) | 576 | if (!card) |
577 | return; | 577 | return; |
578 | 578 | ||
579 | if (qeth_wait_for_threads(card, 0xffffffff)) | 579 | wait_event(card->wait_q, qeth_threads_running(card, 0xffffffff) == 0); |
580 | return; | ||
581 | 580 | ||
582 | if (cgdev->state == CCWGROUP_ONLINE){ | 581 | if (cgdev->state == CCWGROUP_ONLINE){ |
583 | card->use_hard_stop = 1; | 582 | card->use_hard_stop = 1; |
@@ -1542,16 +1541,21 @@ qeth_idx_write_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob) | |||
1542 | card = CARD_FROM_CDEV(channel->ccwdev); | 1541 | card = CARD_FROM_CDEV(channel->ccwdev); |
1543 | 1542 | ||
1544 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { | 1543 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { |
1545 | PRINT_ERR("IDX_ACTIVATE on write channel device %s: negative " | 1544 | if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == 0x19) |
1546 | "reply\n", CARD_WDEV_ID(card)); | 1545 | PRINT_ERR("IDX_ACTIVATE on write channel device %s: " |
1546 | "adapter exclusively used by another host\n", | ||
1547 | CARD_WDEV_ID(card)); | ||
1548 | else | ||
1549 | PRINT_ERR("IDX_ACTIVATE on write channel device %s: " | ||
1550 | "negative reply\n", CARD_WDEV_ID(card)); | ||
1547 | goto out; | 1551 | goto out; |
1548 | } | 1552 | } |
1549 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); | 1553 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); |
1550 | if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) { | 1554 | if ((temp & ~0x0100) != qeth_peer_func_level(card->info.func_level)) { |
1551 | PRINT_WARN("IDX_ACTIVATE on write channel device %s: " | 1555 | PRINT_WARN("IDX_ACTIVATE on write channel device %s: " |
1552 | "function level mismatch " | 1556 | "function level mismatch " |
1553 | "(sent: 0x%x, received: 0x%x)\n", | 1557 | "(sent: 0x%x, received: 0x%x)\n", |
1554 | CARD_WDEV_ID(card), card->info.func_level, temp); | 1558 | CARD_WDEV_ID(card), card->info.func_level, temp); |
1555 | goto out; | 1559 | goto out; |
1556 | } | 1560 | } |
1557 | channel->state = CH_STATE_UP; | 1561 | channel->state = CH_STATE_UP; |
@@ -1597,8 +1601,13 @@ qeth_idx_read_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob) | |||
1597 | goto out; | 1601 | goto out; |
1598 | } | 1602 | } |
1599 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { | 1603 | if (!(QETH_IS_IDX_ACT_POS_REPLY(iob->data))) { |
1600 | PRINT_ERR("IDX_ACTIVATE on read channel device %s: negative " | 1604 | if (QETH_IDX_ACT_CAUSE_CODE(iob->data) == 0x19) |
1601 | "reply\n", CARD_RDEV_ID(card)); | 1605 | PRINT_ERR("IDX_ACTIVATE on read channel device %s: " |
1606 | "adapter exclusively used by another host\n", | ||
1607 | CARD_RDEV_ID(card)); | ||
1608 | else | ||
1609 | PRINT_ERR("IDX_ACTIVATE on read channel device %s: " | ||
1610 | "negative reply\n", CARD_RDEV_ID(card)); | ||
1602 | goto out; | 1611 | goto out; |
1603 | } | 1612 | } |
1604 | 1613 | ||
@@ -1613,8 +1622,8 @@ qeth_idx_read_cb(struct qeth_channel *channel, struct qeth_cmd_buffer *iob) | |||
1613 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); | 1622 | memcpy(&temp, QETH_IDX_ACT_FUNC_LEVEL(iob->data), 2); |
1614 | if (temp != qeth_peer_func_level(card->info.func_level)) { | 1623 | if (temp != qeth_peer_func_level(card->info.func_level)) { |
1615 | PRINT_WARN("IDX_ACTIVATE on read channel device %s: function " | 1624 | PRINT_WARN("IDX_ACTIVATE on read channel device %s: function " |
1616 | "level mismatch (sent: 0x%x, received: 0x%x)\n", | 1625 | "level mismatch (sent: 0x%x, received: 0x%x)\n", |
1617 | CARD_RDEV_ID(card), card->info.func_level, temp); | 1626 | CARD_RDEV_ID(card), card->info.func_level, temp); |
1618 | goto out; | 1627 | goto out; |
1619 | } | 1628 | } |
1620 | memcpy(&card->token.issuer_rm_r, | 1629 | memcpy(&card->token.issuer_rm_r, |
@@ -2496,7 +2505,7 @@ qeth_rebuild_skb_fake_ll_tr(struct qeth_card *card, struct sk_buff *skb, | |||
2496 | struct iphdr *ip_hdr; | 2505 | struct iphdr *ip_hdr; |
2497 | 2506 | ||
2498 | QETH_DBF_TEXT(trace,5,"skbfktr"); | 2507 | QETH_DBF_TEXT(trace,5,"skbfktr"); |
2499 | skb_set_mac_header(skb, -QETH_FAKE_LL_LEN_TR); | 2508 | skb_set_mac_header(skb, (int)-QETH_FAKE_LL_LEN_TR); |
2500 | /* this is a fake ethernet header */ | 2509 | /* this is a fake ethernet header */ |
2501 | fake_hdr = tr_hdr(skb); | 2510 | fake_hdr = tr_hdr(skb); |
2502 | 2511 | ||
@@ -2804,13 +2813,16 @@ qeth_queue_input_buffer(struct qeth_card *card, int index) | |||
2804 | if (newcount < count) { | 2813 | if (newcount < count) { |
2805 | /* we are in memory shortage so we switch back to | 2814 | /* we are in memory shortage so we switch back to |
2806 | traditional skb allocation and drop packages */ | 2815 | traditional skb allocation and drop packages */ |
2807 | if (atomic_cmpxchg(&card->force_alloc_skb, 0, 1)) | 2816 | if (!atomic_read(&card->force_alloc_skb) && |
2808 | printk(KERN_WARNING | 2817 | net_ratelimit()) |
2809 | "qeth: switch to alloc skb\n"); | 2818 | PRINT_WARN("Switch to alloc skb\n"); |
2819 | atomic_set(&card->force_alloc_skb, 3); | ||
2810 | count = newcount; | 2820 | count = newcount; |
2811 | } else { | 2821 | } else { |
2812 | if (atomic_cmpxchg(&card->force_alloc_skb, 1, 0)) | 2822 | if ((atomic_read(&card->force_alloc_skb) == 1) && |
2813 | printk(KERN_WARNING "qeth: switch to sg\n"); | 2823 | net_ratelimit()) |
2824 | PRINT_WARN("Switch to sg\n"); | ||
2825 | atomic_add_unless(&card->force_alloc_skb, -1, 0); | ||
2814 | } | 2826 | } |
2815 | 2827 | ||
2816 | /* | 2828 | /* |
@@ -3354,10 +3366,12 @@ out_freeoutq: | |||
3354 | while (i > 0) | 3366 | while (i > 0) |
3355 | kfree(card->qdio.out_qs[--i]); | 3367 | kfree(card->qdio.out_qs[--i]); |
3356 | kfree(card->qdio.out_qs); | 3368 | kfree(card->qdio.out_qs); |
3369 | card->qdio.out_qs = NULL; | ||
3357 | out_freepool: | 3370 | out_freepool: |
3358 | qeth_free_buffer_pool(card); | 3371 | qeth_free_buffer_pool(card); |
3359 | out_freeinq: | 3372 | out_freeinq: |
3360 | kfree(card->qdio.in_q); | 3373 | kfree(card->qdio.in_q); |
3374 | card->qdio.in_q = NULL; | ||
3361 | out_nomem: | 3375 | out_nomem: |
3362 | atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); | 3376 | atomic_set(&card->qdio.state, QETH_QDIO_UNINITIALIZED); |
3363 | return -ENOMEM; | 3377 | return -ENOMEM; |
@@ -3373,16 +3387,20 @@ qeth_free_qdio_buffers(struct qeth_card *card) | |||
3373 | QETH_QDIO_UNINITIALIZED) | 3387 | QETH_QDIO_UNINITIALIZED) |
3374 | return; | 3388 | return; |
3375 | kfree(card->qdio.in_q); | 3389 | kfree(card->qdio.in_q); |
3390 | card->qdio.in_q = NULL; | ||
3376 | /* inbound buffer pool */ | 3391 | /* inbound buffer pool */ |
3377 | qeth_free_buffer_pool(card); | 3392 | qeth_free_buffer_pool(card); |
3378 | /* free outbound qdio_qs */ | 3393 | /* free outbound qdio_qs */ |
3379 | for (i = 0; i < card->qdio.no_out_queues; ++i){ | 3394 | if (card->qdio.out_qs) { |
3380 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) | 3395 | for (i = 0; i < card->qdio.no_out_queues; ++i) { |
3381 | qeth_clear_output_buffer(card->qdio.out_qs[i], | 3396 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) |
3382 | &card->qdio.out_qs[i]->bufs[j]); | 3397 | qeth_clear_output_buffer(card->qdio.out_qs[i], |
3383 | kfree(card->qdio.out_qs[i]); | 3398 | &card->qdio.out_qs[i]->bufs[j]); |
3399 | kfree(card->qdio.out_qs[i]); | ||
3400 | } | ||
3401 | kfree(card->qdio.out_qs); | ||
3402 | card->qdio.out_qs = NULL; | ||
3384 | } | 3403 | } |
3385 | kfree(card->qdio.out_qs); | ||
3386 | } | 3404 | } |
3387 | 3405 | ||
3388 | static void | 3406 | static void |
@@ -3393,7 +3411,7 @@ qeth_clear_qdio_buffers(struct qeth_card *card) | |||
3393 | QETH_DBF_TEXT(trace, 2, "clearqdbf"); | 3411 | QETH_DBF_TEXT(trace, 2, "clearqdbf"); |
3394 | /* clear outbound buffers to free skbs */ | 3412 | /* clear outbound buffers to free skbs */ |
3395 | for (i = 0; i < card->qdio.no_out_queues; ++i) | 3413 | for (i = 0; i < card->qdio.no_out_queues; ++i) |
3396 | if (card->qdio.out_qs[i]){ | 3414 | if (card->qdio.out_qs && card->qdio.out_qs[i]) { |
3397 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) | 3415 | for (j = 0; j < QDIO_MAX_BUFFERS_PER_Q; ++j) |
3398 | qeth_clear_output_buffer(card->qdio.out_qs[i], | 3416 | qeth_clear_output_buffer(card->qdio.out_qs[i], |
3399 | &card->qdio.out_qs[i]->bufs[j]); | 3417 | &card->qdio.out_qs[i]->bufs[j]); |
@@ -4553,6 +4571,53 @@ qeth_get_elements_no(struct qeth_card *card, void *hdr, | |||
4553 | return elements_needed; | 4571 | return elements_needed; |
4554 | } | 4572 | } |
4555 | 4573 | ||
4574 | static void qeth_tx_csum(struct sk_buff *skb) | ||
4575 | { | ||
4576 | int tlen; | ||
4577 | |||
4578 | if (skb->protocol == htons(ETH_P_IP)) { | ||
4579 | tlen = ntohs(ip_hdr(skb)->tot_len) - (ip_hdr(skb)->ihl << 2); | ||
4580 | switch (ip_hdr(skb)->protocol) { | ||
4581 | case IPPROTO_TCP: | ||
4582 | tcp_hdr(skb)->check = 0; | ||
4583 | tcp_hdr(skb)->check = csum_tcpudp_magic( | ||
4584 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | ||
4585 | tlen, ip_hdr(skb)->protocol, | ||
4586 | skb_checksum(skb, skb_transport_offset(skb), | ||
4587 | tlen, 0)); | ||
4588 | break; | ||
4589 | case IPPROTO_UDP: | ||
4590 | udp_hdr(skb)->check = 0; | ||
4591 | udp_hdr(skb)->check = csum_tcpudp_magic( | ||
4592 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | ||
4593 | tlen, ip_hdr(skb)->protocol, | ||
4594 | skb_checksum(skb, skb_transport_offset(skb), | ||
4595 | tlen, 0)); | ||
4596 | break; | ||
4597 | } | ||
4598 | } else if (skb->protocol == htons(ETH_P_IPV6)) { | ||
4599 | switch (ipv6_hdr(skb)->nexthdr) { | ||
4600 | case IPPROTO_TCP: | ||
4601 | tcp_hdr(skb)->check = 0; | ||
4602 | tcp_hdr(skb)->check = csum_ipv6_magic( | ||
4603 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, | ||
4604 | ipv6_hdr(skb)->payload_len, | ||
4605 | ipv6_hdr(skb)->nexthdr, | ||
4606 | skb_checksum(skb, skb_transport_offset(skb), | ||
4607 | ipv6_hdr(skb)->payload_len, 0)); | ||
4608 | break; | ||
4609 | case IPPROTO_UDP: | ||
4610 | udp_hdr(skb)->check = 0; | ||
4611 | udp_hdr(skb)->check = csum_ipv6_magic( | ||
4612 | &ipv6_hdr(skb)->saddr, &ipv6_hdr(skb)->daddr, | ||
4613 | ipv6_hdr(skb)->payload_len, | ||
4614 | ipv6_hdr(skb)->nexthdr, | ||
4615 | skb_checksum(skb, skb_transport_offset(skb), | ||
4616 | ipv6_hdr(skb)->payload_len, 0)); | ||
4617 | break; | ||
4618 | } | ||
4619 | } | ||
4620 | } | ||
4556 | 4621 | ||
4557 | static int | 4622 | static int |
4558 | qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) | 4623 | qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) |
@@ -4638,12 +4703,22 @@ qeth_send_packet(struct qeth_card *card, struct sk_buff *skb) | |||
4638 | elements_needed += elems; | 4703 | elements_needed += elems; |
4639 | } | 4704 | } |
4640 | 4705 | ||
4706 | if ((large_send == QETH_LARGE_SEND_NO) && | ||
4707 | (skb->ip_summed == CHECKSUM_PARTIAL)) | ||
4708 | qeth_tx_csum(new_skb); | ||
4709 | |||
4641 | if (card->info.type != QETH_CARD_TYPE_IQD) | 4710 | if (card->info.type != QETH_CARD_TYPE_IQD) |
4642 | rc = qeth_do_send_packet(card, queue, new_skb, hdr, | 4711 | rc = qeth_do_send_packet(card, queue, new_skb, hdr, |
4643 | elements_needed, ctx); | 4712 | elements_needed, ctx); |
4644 | else | 4713 | else { |
4714 | if ((skb->protocol == htons(ETH_P_ARP)) && | ||
4715 | (card->dev->flags & IFF_NOARP)) { | ||
4716 | __qeth_free_new_skb(skb, new_skb); | ||
4717 | return -EPERM; | ||
4718 | } | ||
4645 | rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, | 4719 | rc = qeth_do_send_packet_fast(card, queue, new_skb, hdr, |
4646 | elements_needed, ctx); | 4720 | elements_needed, ctx); |
4721 | } | ||
4647 | if (!rc) { | 4722 | if (!rc) { |
4648 | card->stats.tx_packets++; | 4723 | card->stats.tx_packets++; |
4649 | card->stats.tx_bytes += tx_bytes; | 4724 | card->stats.tx_bytes += tx_bytes; |
@@ -6385,20 +6460,18 @@ qeth_deregister_addr_entry(struct qeth_card *card, struct qeth_ipaddr *addr) | |||
6385 | static u32 | 6460 | static u32 |
6386 | qeth_ethtool_get_tx_csum(struct net_device *dev) | 6461 | qeth_ethtool_get_tx_csum(struct net_device *dev) |
6387 | { | 6462 | { |
6388 | /* We may need to say that we support tx csum offload if | 6463 | return (dev->features & NETIF_F_HW_CSUM) != 0; |
6389 | * we do EDDP or TSO. There are discussions going on to | ||
6390 | * enforce rules in the stack and in ethtool that make | ||
6391 | * SG and TSO depend on HW_CSUM. At the moment there are | ||
6392 | * no such rules.... | ||
6393 | * If we say yes here, we have to checksum outbound packets | ||
6394 | * any time. */ | ||
6395 | return 0; | ||
6396 | } | 6464 | } |
6397 | 6465 | ||
6398 | static int | 6466 | static int |
6399 | qeth_ethtool_set_tx_csum(struct net_device *dev, u32 data) | 6467 | qeth_ethtool_set_tx_csum(struct net_device *dev, u32 data) |
6400 | { | 6468 | { |
6401 | return -EINVAL; | 6469 | if (data) |
6470 | dev->features |= NETIF_F_HW_CSUM; | ||
6471 | else | ||
6472 | dev->features &= ~NETIF_F_HW_CSUM; | ||
6473 | |||
6474 | return 0; | ||
6402 | } | 6475 | } |
6403 | 6476 | ||
6404 | static u32 | 6477 | static u32 |
@@ -7412,7 +7485,8 @@ qeth_start_ipa_tso(struct qeth_card *card) | |||
7412 | } | 7485 | } |
7413 | if (rc && (card->options.large_send == QETH_LARGE_SEND_TSO)){ | 7486 | if (rc && (card->options.large_send == QETH_LARGE_SEND_TSO)){ |
7414 | card->options.large_send = QETH_LARGE_SEND_NO; | 7487 | card->options.large_send = QETH_LARGE_SEND_NO; |
7415 | card->dev->features &= ~ (NETIF_F_TSO | NETIF_F_SG); | 7488 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | |
7489 | NETIF_F_HW_CSUM); | ||
7416 | } | 7490 | } |
7417 | return rc; | 7491 | return rc; |
7418 | } | 7492 | } |
@@ -7552,22 +7626,26 @@ qeth_set_large_send(struct qeth_card *card, enum qeth_large_send_types type) | |||
7552 | card->options.large_send = type; | 7626 | card->options.large_send = type; |
7553 | switch (card->options.large_send) { | 7627 | switch (card->options.large_send) { |
7554 | case QETH_LARGE_SEND_EDDP: | 7628 | case QETH_LARGE_SEND_EDDP: |
7555 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG; | 7629 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG | |
7630 | NETIF_F_HW_CSUM; | ||
7556 | break; | 7631 | break; |
7557 | case QETH_LARGE_SEND_TSO: | 7632 | case QETH_LARGE_SEND_TSO: |
7558 | if (qeth_is_supported(card, IPA_OUTBOUND_TSO)){ | 7633 | if (qeth_is_supported(card, IPA_OUTBOUND_TSO)){ |
7559 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG; | 7634 | card->dev->features |= NETIF_F_TSO | NETIF_F_SG | |
7635 | NETIF_F_HW_CSUM; | ||
7560 | } else { | 7636 | } else { |
7561 | PRINT_WARN("TSO not supported on %s. " | 7637 | PRINT_WARN("TSO not supported on %s. " |
7562 | "large_send set to 'no'.\n", | 7638 | "large_send set to 'no'.\n", |
7563 | card->dev->name); | 7639 | card->dev->name); |
7564 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG); | 7640 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | |
7641 | NETIF_F_HW_CSUM); | ||
7565 | card->options.large_send = QETH_LARGE_SEND_NO; | 7642 | card->options.large_send = QETH_LARGE_SEND_NO; |
7566 | rc = -EOPNOTSUPP; | 7643 | rc = -EOPNOTSUPP; |
7567 | } | 7644 | } |
7568 | break; | 7645 | break; |
7569 | default: /* includes QETH_LARGE_SEND_NO */ | 7646 | default: /* includes QETH_LARGE_SEND_NO */ |
7570 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG); | 7647 | card->dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | |
7648 | NETIF_F_HW_CSUM); | ||
7571 | break; | 7649 | break; |
7572 | } | 7650 | } |
7573 | if (card->state == CARD_STATE_UP) | 7651 | if (card->state == CARD_STATE_UP) |
diff --git a/drivers/s390/net/qeth_mpc.h b/drivers/s390/net/qeth_mpc.h index 1d8083c91765..6de2da5ed5fd 100644 --- a/drivers/s390/net/qeth_mpc.h +++ b/drivers/s390/net/qeth_mpc.h | |||
@@ -565,6 +565,7 @@ extern unsigned char IDX_ACTIVATE_WRITE[]; | |||
565 | #define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20) | 565 | #define QETH_IDX_ACT_QDIO_DEV_REALADDR(buffer) (buffer+0x20) |
566 | #define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2) | 566 | #define QETH_IS_IDX_ACT_POS_REPLY(buffer) (((buffer)[0x08]&3)==2) |
567 | #define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12) | 567 | #define QETH_IDX_REPLY_LEVEL(buffer) (buffer+0x12) |
568 | #define QETH_IDX_ACT_CAUSE_CODE(buffer) (buffer)[0x09] | ||
568 | 569 | ||
569 | #define PDU_ENCAPSULATION(buffer) \ | 570 | #define PDU_ENCAPSULATION(buffer) \ |
570 | (buffer + *(buffer + (*(buffer+0x0b)) + \ | 571 | (buffer + *(buffer + (*(buffer+0x0b)) + \ |
diff --git a/drivers/s390/net/qeth_sys.c b/drivers/s390/net/qeth_sys.c index bb0287ad1aac..2cc3f3a0e393 100644 --- a/drivers/s390/net/qeth_sys.c +++ b/drivers/s390/net/qeth_sys.c | |||
@@ -1760,10 +1760,10 @@ qeth_remove_device_attributes(struct device *dev) | |||
1760 | { | 1760 | { |
1761 | struct qeth_card *card = dev->driver_data; | 1761 | struct qeth_card *card = dev->driver_data; |
1762 | 1762 | ||
1763 | if (card->info.type == QETH_CARD_TYPE_OSN) | 1763 | if (card->info.type == QETH_CARD_TYPE_OSN) { |
1764 | return sysfs_remove_group(&dev->kobj, | 1764 | sysfs_remove_group(&dev->kobj, &qeth_osn_device_attr_group); |
1765 | &qeth_osn_device_attr_group); | 1765 | return; |
1766 | 1766 | } | |
1767 | sysfs_remove_group(&dev->kobj, &qeth_device_attr_group); | 1767 | sysfs_remove_group(&dev->kobj, &qeth_device_attr_group); |
1768 | sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); | 1768 | sysfs_remove_group(&dev->kobj, &qeth_device_ipato_group); |
1769 | sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); | 1769 | sysfs_remove_group(&dev->kobj, &qeth_device_vipa_group); |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index b2a851c1b8cb..46139003ea0c 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -1303,34 +1303,6 @@ static void nfs_clone_super(struct super_block *sb, | |||
1303 | nfs_initialise_sb(sb); | 1303 | nfs_initialise_sb(sb); |
1304 | } | 1304 | } |
1305 | 1305 | ||
1306 | static int nfs_set_super(struct super_block *s, void *_server) | ||
1307 | { | ||
1308 | struct nfs_server *server = _server; | ||
1309 | int ret; | ||
1310 | |||
1311 | s->s_fs_info = server; | ||
1312 | ret = set_anon_super(s, server); | ||
1313 | if (ret == 0) | ||
1314 | server->s_dev = s->s_dev; | ||
1315 | return ret; | ||
1316 | } | ||
1317 | |||
1318 | static int nfs_compare_super(struct super_block *sb, void *data) | ||
1319 | { | ||
1320 | struct nfs_server *server = data, *old = NFS_SB(sb); | ||
1321 | |||
1322 | if (memcmp(&old->nfs_client->cl_addr, | ||
1323 | &server->nfs_client->cl_addr, | ||
1324 | sizeof(old->nfs_client->cl_addr)) != 0) | ||
1325 | return 0; | ||
1326 | /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */ | ||
1327 | if (old->flags & NFS_MOUNT_UNSHARED) | ||
1328 | return 0; | ||
1329 | if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0) | ||
1330 | return 0; | ||
1331 | return 1; | ||
1332 | } | ||
1333 | |||
1334 | #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) | 1306 | #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) |
1335 | 1307 | ||
1336 | static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) | 1308 | static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) |
@@ -1359,9 +1331,46 @@ static int nfs_compare_mount_options(const struct super_block *s, const struct n | |||
1359 | goto Ebusy; | 1331 | goto Ebusy; |
1360 | if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) | 1332 | if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) |
1361 | goto Ebusy; | 1333 | goto Ebusy; |
1362 | return 0; | 1334 | return 1; |
1363 | Ebusy: | 1335 | Ebusy: |
1364 | return -EBUSY; | 1336 | return 0; |
1337 | } | ||
1338 | |||
1339 | struct nfs_sb_mountdata { | ||
1340 | struct nfs_server *server; | ||
1341 | int mntflags; | ||
1342 | }; | ||
1343 | |||
1344 | static int nfs_set_super(struct super_block *s, void *data) | ||
1345 | { | ||
1346 | struct nfs_sb_mountdata *sb_mntdata = data; | ||
1347 | struct nfs_server *server = sb_mntdata->server; | ||
1348 | int ret; | ||
1349 | |||
1350 | s->s_flags = sb_mntdata->mntflags; | ||
1351 | s->s_fs_info = server; | ||
1352 | ret = set_anon_super(s, server); | ||
1353 | if (ret == 0) | ||
1354 | server->s_dev = s->s_dev; | ||
1355 | return ret; | ||
1356 | } | ||
1357 | |||
1358 | static int nfs_compare_super(struct super_block *sb, void *data) | ||
1359 | { | ||
1360 | struct nfs_sb_mountdata *sb_mntdata = data; | ||
1361 | struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb); | ||
1362 | int mntflags = sb_mntdata->mntflags; | ||
1363 | |||
1364 | if (memcmp(&old->nfs_client->cl_addr, | ||
1365 | &server->nfs_client->cl_addr, | ||
1366 | sizeof(old->nfs_client->cl_addr)) != 0) | ||
1367 | return 0; | ||
1368 | /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */ | ||
1369 | if (old->flags & NFS_MOUNT_UNSHARED) | ||
1370 | return 0; | ||
1371 | if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0) | ||
1372 | return 0; | ||
1373 | return nfs_compare_mount_options(sb, server, mntflags); | ||
1365 | } | 1374 | } |
1366 | 1375 | ||
1367 | static int nfs_get_sb(struct file_system_type *fs_type, | 1376 | static int nfs_get_sb(struct file_system_type *fs_type, |
@@ -1373,6 +1382,9 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
1373 | struct nfs_mount_data *data = raw_data; | 1382 | struct nfs_mount_data *data = raw_data; |
1374 | struct dentry *mntroot; | 1383 | struct dentry *mntroot; |
1375 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; | 1384 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; |
1385 | struct nfs_sb_mountdata sb_mntdata = { | ||
1386 | .mntflags = flags, | ||
1387 | }; | ||
1376 | int error; | 1388 | int error; |
1377 | 1389 | ||
1378 | /* Validate the mount data */ | 1390 | /* Validate the mount data */ |
@@ -1386,28 +1398,25 @@ static int nfs_get_sb(struct file_system_type *fs_type, | |||
1386 | error = PTR_ERR(server); | 1398 | error = PTR_ERR(server); |
1387 | goto out; | 1399 | goto out; |
1388 | } | 1400 | } |
1401 | sb_mntdata.server = server; | ||
1389 | 1402 | ||
1390 | if (server->flags & NFS_MOUNT_UNSHARED) | 1403 | if (server->flags & NFS_MOUNT_UNSHARED) |
1391 | compare_super = NULL; | 1404 | compare_super = NULL; |
1392 | 1405 | ||
1393 | /* Get a superblock - note that we may end up sharing one that already exists */ | 1406 | /* Get a superblock - note that we may end up sharing one that already exists */ |
1394 | s = sget(fs_type, compare_super, nfs_set_super, server); | 1407 | s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); |
1395 | if (IS_ERR(s)) { | 1408 | if (IS_ERR(s)) { |
1396 | error = PTR_ERR(s); | 1409 | error = PTR_ERR(s); |
1397 | goto out_err_nosb; | 1410 | goto out_err_nosb; |
1398 | } | 1411 | } |
1399 | 1412 | ||
1400 | if (s->s_fs_info != server) { | 1413 | if (s->s_fs_info != server) { |
1401 | error = nfs_compare_mount_options(s, server, flags); | ||
1402 | nfs_free_server(server); | 1414 | nfs_free_server(server); |
1403 | server = NULL; | 1415 | server = NULL; |
1404 | if (error < 0) | ||
1405 | goto error_splat_super; | ||
1406 | } | 1416 | } |
1407 | 1417 | ||
1408 | if (!s->s_root) { | 1418 | if (!s->s_root) { |
1409 | /* initial superblock/root creation */ | 1419 | /* initial superblock/root creation */ |
1410 | s->s_flags = flags; | ||
1411 | nfs_fill_super(s, data); | 1420 | nfs_fill_super(s, data); |
1412 | } | 1421 | } |
1413 | 1422 | ||
@@ -1460,6 +1469,9 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1460 | struct nfs_server *server; | 1469 | struct nfs_server *server; |
1461 | struct dentry *mntroot; | 1470 | struct dentry *mntroot; |
1462 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; | 1471 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; |
1472 | struct nfs_sb_mountdata sb_mntdata = { | ||
1473 | .mntflags = flags, | ||
1474 | }; | ||
1463 | int error; | 1475 | int error; |
1464 | 1476 | ||
1465 | dprintk("--> nfs_xdev_get_sb()\n"); | 1477 | dprintk("--> nfs_xdev_get_sb()\n"); |
@@ -1470,28 +1482,25 @@ static int nfs_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1470 | error = PTR_ERR(server); | 1482 | error = PTR_ERR(server); |
1471 | goto out_err_noserver; | 1483 | goto out_err_noserver; |
1472 | } | 1484 | } |
1485 | sb_mntdata.server = server; | ||
1473 | 1486 | ||
1474 | if (server->flags & NFS_MOUNT_UNSHARED) | 1487 | if (server->flags & NFS_MOUNT_UNSHARED) |
1475 | compare_super = NULL; | 1488 | compare_super = NULL; |
1476 | 1489 | ||
1477 | /* Get a superblock - note that we may end up sharing one that already exists */ | 1490 | /* Get a superblock - note that we may end up sharing one that already exists */ |
1478 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); | 1491 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); |
1479 | if (IS_ERR(s)) { | 1492 | if (IS_ERR(s)) { |
1480 | error = PTR_ERR(s); | 1493 | error = PTR_ERR(s); |
1481 | goto out_err_nosb; | 1494 | goto out_err_nosb; |
1482 | } | 1495 | } |
1483 | 1496 | ||
1484 | if (s->s_fs_info != server) { | 1497 | if (s->s_fs_info != server) { |
1485 | error = nfs_compare_mount_options(s, server, flags); | ||
1486 | nfs_free_server(server); | 1498 | nfs_free_server(server); |
1487 | server = NULL; | 1499 | server = NULL; |
1488 | if (error < 0) | ||
1489 | goto error_splat_super; | ||
1490 | } | 1500 | } |
1491 | 1501 | ||
1492 | if (!s->s_root) { | 1502 | if (!s->s_root) { |
1493 | /* initial superblock/root creation */ | 1503 | /* initial superblock/root creation */ |
1494 | s->s_flags = flags; | ||
1495 | nfs_clone_super(s, data->sb); | 1504 | nfs_clone_super(s, data->sb); |
1496 | } | 1505 | } |
1497 | 1506 | ||
@@ -1729,6 +1738,9 @@ static int nfs4_get_sb(struct file_system_type *fs_type, | |||
1729 | struct dentry *mntroot; | 1738 | struct dentry *mntroot; |
1730 | char *mntpath = NULL, *hostname = NULL, *ip_addr = NULL; | 1739 | char *mntpath = NULL, *hostname = NULL, *ip_addr = NULL; |
1731 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; | 1740 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; |
1741 | struct nfs_sb_mountdata sb_mntdata = { | ||
1742 | .mntflags = flags, | ||
1743 | }; | ||
1732 | int error; | 1744 | int error; |
1733 | 1745 | ||
1734 | /* Validate the mount data */ | 1746 | /* Validate the mount data */ |
@@ -1744,12 +1756,13 @@ static int nfs4_get_sb(struct file_system_type *fs_type, | |||
1744 | error = PTR_ERR(server); | 1756 | error = PTR_ERR(server); |
1745 | goto out; | 1757 | goto out; |
1746 | } | 1758 | } |
1759 | sb_mntdata.server = server; | ||
1747 | 1760 | ||
1748 | if (server->flags & NFS4_MOUNT_UNSHARED) | 1761 | if (server->flags & NFS4_MOUNT_UNSHARED) |
1749 | compare_super = NULL; | 1762 | compare_super = NULL; |
1750 | 1763 | ||
1751 | /* Get a superblock - note that we may end up sharing one that already exists */ | 1764 | /* Get a superblock - note that we may end up sharing one that already exists */ |
1752 | s = sget(fs_type, compare_super, nfs_set_super, server); | 1765 | s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); |
1753 | if (IS_ERR(s)) { | 1766 | if (IS_ERR(s)) { |
1754 | error = PTR_ERR(s); | 1767 | error = PTR_ERR(s); |
1755 | goto out_free; | 1768 | goto out_free; |
@@ -1762,7 +1775,6 @@ static int nfs4_get_sb(struct file_system_type *fs_type, | |||
1762 | 1775 | ||
1763 | if (!s->s_root) { | 1776 | if (!s->s_root) { |
1764 | /* initial superblock/root creation */ | 1777 | /* initial superblock/root creation */ |
1765 | s->s_flags = flags; | ||
1766 | nfs4_fill_super(s); | 1778 | nfs4_fill_super(s); |
1767 | } | 1779 | } |
1768 | 1780 | ||
@@ -1816,6 +1828,9 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1816 | struct nfs_server *server; | 1828 | struct nfs_server *server; |
1817 | struct dentry *mntroot; | 1829 | struct dentry *mntroot; |
1818 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; | 1830 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; |
1831 | struct nfs_sb_mountdata sb_mntdata = { | ||
1832 | .mntflags = flags, | ||
1833 | }; | ||
1819 | int error; | 1834 | int error; |
1820 | 1835 | ||
1821 | dprintk("--> nfs4_xdev_get_sb()\n"); | 1836 | dprintk("--> nfs4_xdev_get_sb()\n"); |
@@ -1826,12 +1841,13 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1826 | error = PTR_ERR(server); | 1841 | error = PTR_ERR(server); |
1827 | goto out_err_noserver; | 1842 | goto out_err_noserver; |
1828 | } | 1843 | } |
1844 | sb_mntdata.server = server; | ||
1829 | 1845 | ||
1830 | if (server->flags & NFS4_MOUNT_UNSHARED) | 1846 | if (server->flags & NFS4_MOUNT_UNSHARED) |
1831 | compare_super = NULL; | 1847 | compare_super = NULL; |
1832 | 1848 | ||
1833 | /* Get a superblock - note that we may end up sharing one that already exists */ | 1849 | /* Get a superblock - note that we may end up sharing one that already exists */ |
1834 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); | 1850 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); |
1835 | if (IS_ERR(s)) { | 1851 | if (IS_ERR(s)) { |
1836 | error = PTR_ERR(s); | 1852 | error = PTR_ERR(s); |
1837 | goto out_err_nosb; | 1853 | goto out_err_nosb; |
@@ -1844,7 +1860,6 @@ static int nfs4_xdev_get_sb(struct file_system_type *fs_type, int flags, | |||
1844 | 1860 | ||
1845 | if (!s->s_root) { | 1861 | if (!s->s_root) { |
1846 | /* initial superblock/root creation */ | 1862 | /* initial superblock/root creation */ |
1847 | s->s_flags = flags; | ||
1848 | nfs4_clone_super(s, data->sb); | 1863 | nfs4_clone_super(s, data->sb); |
1849 | } | 1864 | } |
1850 | 1865 | ||
@@ -1887,6 +1902,9 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags, | |||
1887 | struct dentry *mntroot; | 1902 | struct dentry *mntroot; |
1888 | struct nfs_fh mntfh; | 1903 | struct nfs_fh mntfh; |
1889 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; | 1904 | int (*compare_super)(struct super_block *, void *) = nfs_compare_super; |
1905 | struct nfs_sb_mountdata sb_mntdata = { | ||
1906 | .mntflags = flags, | ||
1907 | }; | ||
1890 | int error; | 1908 | int error; |
1891 | 1909 | ||
1892 | dprintk("--> nfs4_referral_get_sb()\n"); | 1910 | dprintk("--> nfs4_referral_get_sb()\n"); |
@@ -1897,12 +1915,13 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags, | |||
1897 | error = PTR_ERR(server); | 1915 | error = PTR_ERR(server); |
1898 | goto out_err_noserver; | 1916 | goto out_err_noserver; |
1899 | } | 1917 | } |
1918 | sb_mntdata.server = server; | ||
1900 | 1919 | ||
1901 | if (server->flags & NFS4_MOUNT_UNSHARED) | 1920 | if (server->flags & NFS4_MOUNT_UNSHARED) |
1902 | compare_super = NULL; | 1921 | compare_super = NULL; |
1903 | 1922 | ||
1904 | /* Get a superblock - note that we may end up sharing one that already exists */ | 1923 | /* Get a superblock - note that we may end up sharing one that already exists */ |
1905 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); | 1924 | s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); |
1906 | if (IS_ERR(s)) { | 1925 | if (IS_ERR(s)) { |
1907 | error = PTR_ERR(s); | 1926 | error = PTR_ERR(s); |
1908 | goto out_err_nosb; | 1927 | goto out_err_nosb; |
@@ -1915,7 +1934,6 @@ static int nfs4_referral_get_sb(struct file_system_type *fs_type, int flags, | |||
1915 | 1934 | ||
1916 | if (!s->s_root) { | 1935 | if (!s->s_root) { |
1917 | /* initial superblock/root creation */ | 1936 | /* initial superblock/root creation */ |
1918 | s->s_flags = flags; | ||
1919 | nfs4_fill_super(s); | 1937 | nfs4_fill_super(s); |
1920 | } | 1938 | } |
1921 | 1939 | ||
diff --git a/include/linux/ata.h b/include/linux/ata.h index 23a22df039d8..c043c1ccf1c5 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
@@ -73,6 +73,19 @@ enum { | |||
73 | ATA_PIO5 = ATA_PIO4 | (1 << 5), | 73 | ATA_PIO5 = ATA_PIO4 | (1 << 5), |
74 | ATA_PIO6 = ATA_PIO5 | (1 << 6), | 74 | ATA_PIO6 = ATA_PIO5 | (1 << 6), |
75 | 75 | ||
76 | ATA_SWDMA0 = (1 << 0), | ||
77 | ATA_SWDMA1 = ATA_SWDMA0 | (1 << 1), | ||
78 | ATA_SWDMA2 = ATA_SWDMA1 | (1 << 2), | ||
79 | |||
80 | ATA_SWDMA2_ONLY = (1 << 2), | ||
81 | |||
82 | ATA_MWDMA0 = (1 << 0), | ||
83 | ATA_MWDMA1 = ATA_MWDMA0 | (1 << 1), | ||
84 | ATA_MWDMA2 = ATA_MWDMA1 | (1 << 2), | ||
85 | |||
86 | ATA_MWDMA12_ONLY = (1 << 1) | (1 << 2), | ||
87 | ATA_MWDMA2_ONLY = (1 << 2), | ||
88 | |||
76 | ATA_UDMA0 = (1 << 0), | 89 | ATA_UDMA0 = (1 << 0), |
77 | ATA_UDMA1 = ATA_UDMA0 | (1 << 1), | 90 | ATA_UDMA1 = ATA_UDMA0 | (1 << 1), |
78 | ATA_UDMA2 = ATA_UDMA1 | (1 << 2), | 91 | ATA_UDMA2 = ATA_UDMA1 | (1 << 2), |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 41978a557318..a67bb9075e9b 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -303,6 +303,7 @@ enum { | |||
303 | ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ | 303 | ATA_HORKAGE_NODMA = (1 << 1), /* DMA problems */ |
304 | ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ | 304 | ATA_HORKAGE_NONCQ = (1 << 2), /* Don't use NCQ */ |
305 | ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ | 305 | ATA_HORKAGE_MAX_SEC_128 = (1 << 3), /* Limit max sects to 128 */ |
306 | ATA_HORKAGE_BROKEN_HPA = (1 << 4), /* Broken HPA */ | ||
306 | }; | 307 | }; |
307 | 308 | ||
308 | enum hsm_task_states { | 309 | enum hsm_task_states { |
diff --git a/include/linux/sched.h b/include/linux/sched.h index bd6a0320a770..f4e324ed2e44 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
@@ -904,6 +904,7 @@ struct sched_entity { | |||
904 | 904 | ||
905 | u64 exec_start; | 905 | u64 exec_start; |
906 | u64 sum_exec_runtime; | 906 | u64 sum_exec_runtime; |
907 | u64 prev_sum_exec_runtime; | ||
907 | u64 wait_start_fair; | 908 | u64 wait_start_fair; |
908 | u64 sleep_start_fair; | 909 | u64 sleep_start_fair; |
909 | 910 | ||
diff --git a/kernel/sched.c b/kernel/sched.c index 9fe473a190de..b533d6db78aa 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -1587,6 +1587,7 @@ static void __sched_fork(struct task_struct *p) | |||
1587 | p->se.wait_start_fair = 0; | 1587 | p->se.wait_start_fair = 0; |
1588 | p->se.exec_start = 0; | 1588 | p->se.exec_start = 0; |
1589 | p->se.sum_exec_runtime = 0; | 1589 | p->se.sum_exec_runtime = 0; |
1590 | p->se.prev_sum_exec_runtime = 0; | ||
1590 | p->se.delta_exec = 0; | 1591 | p->se.delta_exec = 0; |
1591 | p->se.delta_fair_run = 0; | 1592 | p->se.delta_fair_run = 0; |
1592 | p->se.delta_fair_sleep = 0; | 1593 | p->se.delta_fair_sleep = 0; |
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index ee3771850aaf..ce39282d9c0d 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -354,7 +354,7 @@ __update_curr(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
354 | delta_fair = calc_delta_fair(delta_exec, lw); | 354 | delta_fair = calc_delta_fair(delta_exec, lw); |
355 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); | 355 | delta_mine = calc_delta_mine(delta_exec, curr->load.weight, lw); |
356 | 356 | ||
357 | if (cfs_rq->sleeper_bonus > sysctl_sched_latency) { | 357 | if (cfs_rq->sleeper_bonus > sysctl_sched_min_granularity) { |
358 | delta = min((u64)delta_mine, cfs_rq->sleeper_bonus); | 358 | delta = min((u64)delta_mine, cfs_rq->sleeper_bonus); |
359 | delta = min(delta, (unsigned long)( | 359 | delta = min(delta, (unsigned long)( |
360 | (long)sysctl_sched_runtime_limit - curr->wait_runtime)); | 360 | (long)sysctl_sched_runtime_limit - curr->wait_runtime)); |
@@ -489,6 +489,9 @@ update_stats_wait_end(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
489 | { | 489 | { |
490 | unsigned long delta_fair; | 490 | unsigned long delta_fair; |
491 | 491 | ||
492 | if (unlikely(!se->wait_start_fair)) | ||
493 | return; | ||
494 | |||
492 | delta_fair = (unsigned long)min((u64)(2*sysctl_sched_runtime_limit), | 495 | delta_fair = (unsigned long)min((u64)(2*sysctl_sched_runtime_limit), |
493 | (u64)(cfs_rq->fair_clock - se->wait_start_fair)); | 496 | (u64)(cfs_rq->fair_clock - se->wait_start_fair)); |
494 | 497 | ||
@@ -668,7 +671,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep) | |||
668 | /* | 671 | /* |
669 | * Preempt the current task with a newly woken task if needed: | 672 | * Preempt the current task with a newly woken task if needed: |
670 | */ | 673 | */ |
671 | static void | 674 | static int |
672 | __check_preempt_curr_fair(struct cfs_rq *cfs_rq, struct sched_entity *se, | 675 | __check_preempt_curr_fair(struct cfs_rq *cfs_rq, struct sched_entity *se, |
673 | struct sched_entity *curr, unsigned long granularity) | 676 | struct sched_entity *curr, unsigned long granularity) |
674 | { | 677 | { |
@@ -679,8 +682,11 @@ __check_preempt_curr_fair(struct cfs_rq *cfs_rq, struct sched_entity *se, | |||
679 | * preempt the current task unless the best task has | 682 | * preempt the current task unless the best task has |
680 | * a larger than sched_granularity fairness advantage: | 683 | * a larger than sched_granularity fairness advantage: |
681 | */ | 684 | */ |
682 | if (__delta > niced_granularity(curr, granularity)) | 685 | if (__delta > niced_granularity(curr, granularity)) { |
683 | resched_task(rq_of(cfs_rq)->curr); | 686 | resched_task(rq_of(cfs_rq)->curr); |
687 | return 1; | ||
688 | } | ||
689 | return 0; | ||
684 | } | 690 | } |
685 | 691 | ||
686 | static inline void | 692 | static inline void |
@@ -725,6 +731,7 @@ static void put_prev_entity(struct cfs_rq *cfs_rq, struct sched_entity *prev) | |||
725 | 731 | ||
726 | static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) | 732 | static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) |
727 | { | 733 | { |
734 | unsigned long gran, ideal_runtime, delta_exec; | ||
728 | struct sched_entity *next; | 735 | struct sched_entity *next; |
729 | 736 | ||
730 | /* | 737 | /* |
@@ -741,8 +748,22 @@ static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
741 | if (next == curr) | 748 | if (next == curr) |
742 | return; | 749 | return; |
743 | 750 | ||
744 | __check_preempt_curr_fair(cfs_rq, next, curr, | 751 | gran = sched_granularity(cfs_rq); |
745 | sched_granularity(cfs_rq)); | 752 | ideal_runtime = niced_granularity(curr, |
753 | max(sysctl_sched_latency / cfs_rq->nr_running, | ||
754 | (unsigned long)sysctl_sched_min_granularity)); | ||
755 | /* | ||
756 | * If we executed more than what the latency constraint suggests, | ||
757 | * reduce the rescheduling granularity. This way the total latency | ||
758 | * of how much a task is not scheduled converges to | ||
759 | * sysctl_sched_latency: | ||
760 | */ | ||
761 | delta_exec = curr->sum_exec_runtime - curr->prev_sum_exec_runtime; | ||
762 | if (delta_exec > ideal_runtime) | ||
763 | gran = 0; | ||
764 | |||
765 | if (__check_preempt_curr_fair(cfs_rq, next, curr, gran)) | ||
766 | curr->prev_sum_exec_runtime = curr->sum_exec_runtime; | ||
746 | } | 767 | } |
747 | 768 | ||
748 | /************************************************** | 769 | /************************************************** |
@@ -1076,31 +1097,34 @@ static void task_tick_fair(struct rq *rq, struct task_struct *curr) | |||
1076 | static void task_new_fair(struct rq *rq, struct task_struct *p) | 1097 | static void task_new_fair(struct rq *rq, struct task_struct *p) |
1077 | { | 1098 | { |
1078 | struct cfs_rq *cfs_rq = task_cfs_rq(p); | 1099 | struct cfs_rq *cfs_rq = task_cfs_rq(p); |
1079 | struct sched_entity *se = &p->se; | 1100 | struct sched_entity *se = &p->se, *curr = cfs_rq_curr(cfs_rq); |
1080 | 1101 | ||
1081 | sched_info_queued(p); | 1102 | sched_info_queued(p); |
1082 | 1103 | ||
1104 | update_curr(cfs_rq); | ||
1083 | update_stats_enqueue(cfs_rq, se); | 1105 | update_stats_enqueue(cfs_rq, se); |
1084 | /* | 1106 | /* |
1085 | * Child runs first: we let it run before the parent | 1107 | * Child runs first: we let it run before the parent |
1086 | * until it reschedules once. We set up the key so that | 1108 | * until it reschedules once. We set up the key so that |
1087 | * it will preempt the parent: | 1109 | * it will preempt the parent: |
1088 | */ | 1110 | */ |
1089 | p->se.fair_key = current->se.fair_key - | 1111 | se->fair_key = curr->fair_key - |
1090 | niced_granularity(&rq->curr->se, sched_granularity(cfs_rq)) - 1; | 1112 | niced_granularity(curr, sched_granularity(cfs_rq)) - 1; |
1091 | /* | 1113 | /* |
1092 | * The first wait is dominated by the child-runs-first logic, | 1114 | * The first wait is dominated by the child-runs-first logic, |
1093 | * so do not credit it with that waiting time yet: | 1115 | * so do not credit it with that waiting time yet: |
1094 | */ | 1116 | */ |
1095 | if (sysctl_sched_features & SCHED_FEAT_SKIP_INITIAL) | 1117 | if (sysctl_sched_features & SCHED_FEAT_SKIP_INITIAL) |
1096 | p->se.wait_start_fair = 0; | 1118 | se->wait_start_fair = 0; |
1097 | 1119 | ||
1098 | /* | 1120 | /* |
1099 | * The statistical average of wait_runtime is about | 1121 | * The statistical average of wait_runtime is about |
1100 | * -granularity/2, so initialize the task with that: | 1122 | * -granularity/2, so initialize the task with that: |
1101 | */ | 1123 | */ |
1102 | if (sysctl_sched_features & SCHED_FEAT_START_DEBIT) | 1124 | if (sysctl_sched_features & SCHED_FEAT_START_DEBIT) { |
1103 | p->se.wait_runtime = -(sched_granularity(cfs_rq) / 2); | 1125 | se->wait_runtime = -(sched_granularity(cfs_rq) / 2); |
1126 | schedstat_add(cfs_rq, wait_runtime, se->wait_runtime); | ||
1127 | } | ||
1104 | 1128 | ||
1105 | __enqueue_entity(cfs_rq, se); | 1129 | __enqueue_entity(cfs_rq, se); |
1106 | } | 1130 | } |