diff options
Diffstat (limited to 'drivers')
220 files changed, 3025 insertions, 4829 deletions
diff --git a/drivers/acpi/acpica/acconfig.h b/drivers/acpi/acpica/acconfig.h index 8e679ef5b231..a4471e3d3853 100644 --- a/drivers/acpi/acpica/acconfig.h +++ b/drivers/acpi/acpica/acconfig.h | |||
@@ -103,9 +103,9 @@ | |||
103 | 103 | ||
104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 | 104 | #define ACPI_MAX_REFERENCE_COUNT 0x1000 |
105 | 105 | ||
106 | /* Size of cached memory mapping for system memory operation region */ | 106 | /* Default page size for use in mapping memory for operation regions */ |
107 | 107 | ||
108 | #define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096 | 108 | #define ACPI_DEFAULT_PAGE_SIZE 4096 /* Must be power of 2 */ |
109 | 109 | ||
110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ | 110 | /* owner_id tracking. 8 entries allows for 255 owner_ids */ |
111 | 111 | ||
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index 3a54b737d2da..2bd83ac57c3a 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
@@ -77,7 +77,8 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
77 | void *logical_addr_ptr = NULL; | 77 | void *logical_addr_ptr = NULL; |
78 | struct acpi_mem_space_context *mem_info = region_context; | 78 | struct acpi_mem_space_context *mem_info = region_context; |
79 | u32 length; | 79 | u32 length; |
80 | acpi_size window_size; | 80 | acpi_size map_length; |
81 | acpi_size page_boundary_map_length; | ||
81 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED | 82 | #ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED |
82 | u32 remainder; | 83 | u32 remainder; |
83 | #endif | 84 | #endif |
@@ -144,25 +145,39 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
144 | } | 145 | } |
145 | 146 | ||
146 | /* | 147 | /* |
147 | * Don't attempt to map memory beyond the end of the region, and | 148 | * Attempt to map from the requested address to the end of the region. |
148 | * constrain the maximum mapping size to something reasonable. | 149 | * However, we will never map more than one page, nor will we cross |
150 | * a page boundary. | ||
149 | */ | 151 | */ |
150 | window_size = (acpi_size) | 152 | map_length = (acpi_size) |
151 | ((mem_info->address + mem_info->length) - address); | 153 | ((mem_info->address + mem_info->length) - address); |
152 | 154 | ||
153 | if (window_size > ACPI_SYSMEM_REGION_WINDOW_SIZE) { | 155 | /* |
154 | window_size = ACPI_SYSMEM_REGION_WINDOW_SIZE; | 156 | * If mapping the entire remaining portion of the region will cross |
157 | * a page boundary, just map up to the page boundary, do not cross. | ||
158 | * On some systems, crossing a page boundary while mapping regions | ||
159 | * can cause warnings if the pages have different attributes | ||
160 | * due to resource management | ||
161 | */ | ||
162 | page_boundary_map_length = | ||
163 | ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address; | ||
164 | |||
165 | if (!page_boundary_map_length) { | ||
166 | page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE; | ||
167 | } | ||
168 | |||
169 | if (map_length > page_boundary_map_length) { | ||
170 | map_length = page_boundary_map_length; | ||
155 | } | 171 | } |
156 | 172 | ||
157 | /* Create a new mapping starting at the address given */ | 173 | /* Create a new mapping starting at the address given */ |
158 | 174 | ||
159 | mem_info->mapped_logical_address = | 175 | mem_info->mapped_logical_address = acpi_os_map_memory((acpi_physical_address) address, map_length); |
160 | acpi_os_map_memory((acpi_physical_address) address, window_size); | ||
161 | if (!mem_info->mapped_logical_address) { | 176 | if (!mem_info->mapped_logical_address) { |
162 | ACPI_ERROR((AE_INFO, | 177 | ACPI_ERROR((AE_INFO, |
163 | "Could not map memory at %8.8X%8.8X, size %X", | 178 | "Could not map memory at %8.8X%8.8X, size %X", |
164 | ACPI_FORMAT_NATIVE_UINT(address), | 179 | ACPI_FORMAT_NATIVE_UINT(address), |
165 | (u32) window_size)); | 180 | (u32) map_length)); |
166 | mem_info->mapped_length = 0; | 181 | mem_info->mapped_length = 0; |
167 | return_ACPI_STATUS(AE_NO_MEMORY); | 182 | return_ACPI_STATUS(AE_NO_MEMORY); |
168 | } | 183 | } |
@@ -170,7 +185,7 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
170 | /* Save the physical address and mapping size */ | 185 | /* Save the physical address and mapping size */ |
171 | 186 | ||
172 | mem_info->mapped_physical_address = address; | 187 | mem_info->mapped_physical_address = address; |
173 | mem_info->mapped_length = window_size; | 188 | mem_info->mapped_length = map_length; |
174 | } | 189 | } |
175 | 190 | ||
176 | /* | 191 | /* |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index b1a257746a19..a3241a1a710b 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -575,7 +575,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
575 | { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */ | 575 | { PCI_VDEVICE(ATI, 0x4395), board_ahci_sb700 }, /* ATI SB700/800 */ |
576 | 576 | ||
577 | /* AMD */ | 577 | /* AMD */ |
578 | { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD SB900 */ | 578 | { PCI_VDEVICE(AMD, 0x7800), board_ahci }, /* AMD Hudson-2 */ |
579 | /* AMD is using RAID class only for ahci controllers */ | 579 | /* AMD is using RAID class only for ahci controllers */ |
580 | { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, | 580 | { PCI_VENDOR_ID_AMD, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, |
581 | PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci }, | 581 | PCI_CLASS_STORAGE_RAID << 8, 0xffffff, board_ahci }, |
@@ -605,6 +605,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
605 | { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_yesncq }, /* MCP67 */ | 605 | { PCI_VDEVICE(NVIDIA, 0x0559), board_ahci_yesncq }, /* MCP67 */ |
606 | { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_yesncq }, /* MCP67 */ | 606 | { PCI_VDEVICE(NVIDIA, 0x055a), board_ahci_yesncq }, /* MCP67 */ |
607 | { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_yesncq }, /* MCP67 */ | 607 | { PCI_VDEVICE(NVIDIA, 0x055b), board_ahci_yesncq }, /* MCP67 */ |
608 | { PCI_VDEVICE(NVIDIA, 0x0580), board_ahci_yesncq }, /* Linux ID */ | ||
608 | { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_yesncq }, /* MCP73 */ | 609 | { PCI_VDEVICE(NVIDIA, 0x07f0), board_ahci_yesncq }, /* MCP73 */ |
609 | { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_yesncq }, /* MCP73 */ | 610 | { PCI_VDEVICE(NVIDIA, 0x07f1), board_ahci_yesncq }, /* MCP73 */ |
610 | { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_yesncq }, /* MCP73 */ | 611 | { PCI_VDEVICE(NVIDIA, 0x07f2), board_ahci_yesncq }, /* MCP73 */ |
@@ -2717,6 +2718,30 @@ static bool ahci_sb600_enable_64bit(struct pci_dev *pdev) | |||
2717 | }, | 2718 | }, |
2718 | .driver_data = "20071026", /* yyyymmdd */ | 2719 | .driver_data = "20071026", /* yyyymmdd */ |
2719 | }, | 2720 | }, |
2721 | /* | ||
2722 | * All BIOS versions for the MSI K9A2 Platinum (MS-7376) | ||
2723 | * support 64bit DMA. | ||
2724 | * | ||
2725 | * BIOS versions earlier than 1.5 had the Manufacturer DMI | ||
2726 | * fields as "MICRO-STAR INTERANTIONAL CO.,LTD". | ||
2727 | * This spelling mistake was fixed in BIOS version 1.5, so | ||
2728 | * 1.5 and later have the Manufacturer as | ||
2729 | * "MICRO-STAR INTERNATIONAL CO.,LTD". | ||
2730 | * So try to match on DMI_BOARD_VENDOR of "MICRO-STAR INTER". | ||
2731 | * | ||
2732 | * BIOS versions earlier than 1.9 had a Board Product Name | ||
2733 | * DMI field of "MS-7376". This was changed to be | ||
2734 | * "K9A2 Platinum (MS-7376)" in version 1.9, but we can still | ||
2735 | * match on DMI_BOARD_NAME of "MS-7376". | ||
2736 | */ | ||
2737 | { | ||
2738 | .ident = "MSI K9A2 Platinum", | ||
2739 | .matches = { | ||
2740 | DMI_MATCH(DMI_BOARD_VENDOR, | ||
2741 | "MICRO-STAR INTER"), | ||
2742 | DMI_MATCH(DMI_BOARD_NAME, "MS-7376"), | ||
2743 | }, | ||
2744 | }, | ||
2720 | { } | 2745 | { } |
2721 | }; | 2746 | }; |
2722 | const struct dmi_system_id *match; | 2747 | const struct dmi_system_id *match; |
@@ -2728,18 +2753,24 @@ static bool ahci_sb600_enable_64bit(struct pci_dev *pdev) | |||
2728 | !match) | 2753 | !match) |
2729 | return false; | 2754 | return false; |
2730 | 2755 | ||
2756 | if (!match->driver_data) | ||
2757 | goto enable_64bit; | ||
2758 | |||
2731 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); | 2759 | dmi_get_date(DMI_BIOS_DATE, &year, &month, &date); |
2732 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); | 2760 | snprintf(buf, sizeof(buf), "%04d%02d%02d", year, month, date); |
2733 | 2761 | ||
2734 | if (strcmp(buf, match->driver_data) >= 0) { | 2762 | if (strcmp(buf, match->driver_data) >= 0) |
2735 | dev_printk(KERN_WARNING, &pdev->dev, "%s: enabling 64bit DMA\n", | 2763 | goto enable_64bit; |
2736 | match->ident); | 2764 | else { |
2737 | return true; | ||
2738 | } else { | ||
2739 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " | 2765 | dev_printk(KERN_WARNING, &pdev->dev, "%s: BIOS too old, " |
2740 | "forcing 32bit DMA, update BIOS\n", match->ident); | 2766 | "forcing 32bit DMA, update BIOS\n", match->ident); |
2741 | return false; | 2767 | return false; |
2742 | } | 2768 | } |
2769 | |||
2770 | enable_64bit: | ||
2771 | dev_printk(KERN_WARNING, &pdev->dev, "%s: enabling 64bit DMA\n", | ||
2772 | match->ident); | ||
2773 | return true; | ||
2743 | } | 2774 | } |
2744 | 2775 | ||
2745 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) | 2776 | static bool ahci_broken_system_poweroff(struct pci_dev *pdev) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index b525a0981348..dc72690ed5db 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -4919,10 +4919,11 @@ struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev) | |||
4919 | */ | 4919 | */ |
4920 | void ata_qc_free(struct ata_queued_cmd *qc) | 4920 | void ata_qc_free(struct ata_queued_cmd *qc) |
4921 | { | 4921 | { |
4922 | struct ata_port *ap = qc->ap; | 4922 | struct ata_port *ap; |
4923 | unsigned int tag; | 4923 | unsigned int tag; |
4924 | 4924 | ||
4925 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ | 4925 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ |
4926 | ap = qc->ap; | ||
4926 | 4927 | ||
4927 | qc->flags = 0; | 4928 | qc->flags = 0; |
4928 | tag = qc->tag; | 4929 | tag = qc->tag; |
@@ -4934,11 +4935,13 @@ void ata_qc_free(struct ata_queued_cmd *qc) | |||
4934 | 4935 | ||
4935 | void __ata_qc_complete(struct ata_queued_cmd *qc) | 4936 | void __ata_qc_complete(struct ata_queued_cmd *qc) |
4936 | { | 4937 | { |
4937 | struct ata_port *ap = qc->ap; | 4938 | struct ata_port *ap; |
4938 | struct ata_link *link = qc->dev->link; | 4939 | struct ata_link *link; |
4939 | 4940 | ||
4940 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ | 4941 | WARN_ON_ONCE(qc == NULL); /* ata_qc_from_tag _might_ return NULL */ |
4941 | WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE)); | 4942 | WARN_ON_ONCE(!(qc->flags & ATA_QCFLAG_ACTIVE)); |
4943 | ap = qc->ap; | ||
4944 | link = qc->dev->link; | ||
4942 | 4945 | ||
4943 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) | 4946 | if (likely(qc->flags & ATA_QCFLAG_DMAMAP)) |
4944 | ata_sg_clean(qc); | 4947 | ata_sg_clean(qc); |
@@ -5028,12 +5031,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc) | |||
5028 | qc->flags |= ATA_QCFLAG_FAILED; | 5031 | qc->flags |= ATA_QCFLAG_FAILED; |
5029 | 5032 | ||
5030 | if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { | 5033 | if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) { |
5031 | if (!ata_tag_internal(qc->tag)) { | 5034 | /* always fill result TF for failed qc */ |
5032 | /* always fill result TF for failed qc */ | 5035 | fill_result_tf(qc); |
5033 | fill_result_tf(qc); | 5036 | |
5037 | if (!ata_tag_internal(qc->tag)) | ||
5034 | ata_qc_schedule_eh(qc); | 5038 | ata_qc_schedule_eh(qc); |
5035 | return; | 5039 | else |
5036 | } | 5040 | __ata_qc_complete(qc); |
5041 | return; | ||
5037 | } | 5042 | } |
5038 | 5043 | ||
5039 | WARN_ON_ONCE(ap->pflags & ATA_PFLAG_FROZEN); | 5044 | WARN_ON_ONCE(ap->pflags & ATA_PFLAG_FROZEN); |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 0a97822da211..bba2ae5df1c2 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2981,12 +2981,14 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2981 | * device detection messages backwards. | 2981 | * device detection messages backwards. |
2982 | */ | 2982 | */ |
2983 | ata_for_each_dev(dev, link, ALL) { | 2983 | ata_for_each_dev(dev, link, ALL) { |
2984 | if (!(new_mask & (1 << dev->devno)) || | 2984 | if (!(new_mask & (1 << dev->devno))) |
2985 | dev->class == ATA_DEV_PMP) | ||
2986 | continue; | 2985 | continue; |
2987 | 2986 | ||
2988 | dev->class = ehc->classes[dev->devno]; | 2987 | dev->class = ehc->classes[dev->devno]; |
2989 | 2988 | ||
2989 | if (dev->class == ATA_DEV_PMP) | ||
2990 | continue; | ||
2991 | |||
2990 | ehc->i.flags |= ATA_EHI_PRINTINFO; | 2992 | ehc->i.flags |= ATA_EHI_PRINTINFO; |
2991 | rc = ata_dev_configure(dev); | 2993 | rc = ata_dev_configure(dev); |
2992 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; | 2994 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; |
diff --git a/drivers/ata/pata_atiixp.c b/drivers/ata/pata_atiixp.c index aa4b3f6ae771..ae4454d4e955 100644 --- a/drivers/ata/pata_atiixp.c +++ b/drivers/ata/pata_atiixp.c | |||
@@ -246,7 +246,7 @@ static const struct pci_device_id atiixp[] = { | |||
246 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), }, | 246 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), }, |
247 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), }, | 247 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), }, |
248 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP700_IDE), }, | 248 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP700_IDE), }, |
249 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_SB900_IDE), }, | 249 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_HUDSON2_IDE), }, |
250 | 250 | ||
251 | { }, | 251 | { }, |
252 | }; | 252 | }; |
diff --git a/drivers/ata/pata_sc1200.c b/drivers/ata/pata_sc1200.c index f49814d6fd2e..3bbed8322ecf 100644 --- a/drivers/ata/pata_sc1200.c +++ b/drivers/ata/pata_sc1200.c | |||
@@ -235,8 +235,7 @@ static int sc1200_init_one(struct pci_dev *dev, const struct pci_device_id *id) | |||
235 | .udma_mask = ATA_UDMA2, | 235 | .udma_mask = ATA_UDMA2, |
236 | .port_ops = &sc1200_port_ops | 236 | .port_ops = &sc1200_port_ops |
237 | }; | 237 | }; |
238 | /* Can't enable port 2 yet, see top comments */ | 238 | const struct ata_port_info *ppi[] = { &info, NULL }; |
239 | const struct ata_port_info *ppi[] = { &info, }; | ||
240 | 239 | ||
241 | return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL); | 240 | return ata_pci_sff_init_one(dev, ppi, &sc1200_sht, NULL); |
242 | } | 241 | } |
diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c index 45657cacec43..88984b803d6d 100644 --- a/drivers/ata/pata_via.c +++ b/drivers/ata/pata_via.c | |||
@@ -111,7 +111,7 @@ static const struct via_isa_bridge { | |||
111 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 111 | { "vt8251", PCI_DEVICE_ID_VIA_8251, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
112 | { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, | 112 | { "cx700", PCI_DEVICE_ID_VIA_CX700, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA }, |
113 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, | 113 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, |
114 | { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, | 114 | { "vt6415", PCI_DEVICE_ID_VIA_6415, 0x00, 0xff, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES }, |
115 | { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 115 | { "vt8237a", PCI_DEVICE_ID_VIA_8237A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
116 | { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 116 | { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
117 | { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 117 | { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 17f9ff9067a2..6f5093b7c8c5 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -1382,6 +1382,25 @@ static int mv_qc_defer(struct ata_queued_cmd *qc) | |||
1382 | */ | 1382 | */ |
1383 | if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH) | 1383 | if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH) |
1384 | return ATA_DEFER_PORT; | 1384 | return ATA_DEFER_PORT; |
1385 | |||
1386 | /* PIO commands need exclusive link: no other commands [DMA or PIO] | ||
1387 | * can run concurrently. | ||
1388 | * set excl_link when we want to send a PIO command in DMA mode | ||
1389 | * or a non-NCQ command in NCQ mode. | ||
1390 | * When we receive a command from that link, and there are no | ||
1391 | * outstanding commands, mark a flag to clear excl_link and let | ||
1392 | * the command go through. | ||
1393 | */ | ||
1394 | if (unlikely(ap->excl_link)) { | ||
1395 | if (link == ap->excl_link) { | ||
1396 | if (ap->nr_active_links) | ||
1397 | return ATA_DEFER_PORT; | ||
1398 | qc->flags |= ATA_QCFLAG_CLEAR_EXCL; | ||
1399 | return 0; | ||
1400 | } else | ||
1401 | return ATA_DEFER_PORT; | ||
1402 | } | ||
1403 | |||
1385 | /* | 1404 | /* |
1386 | * If the port is completely idle, then allow the new qc. | 1405 | * If the port is completely idle, then allow the new qc. |
1387 | */ | 1406 | */ |
@@ -1395,8 +1414,14 @@ static int mv_qc_defer(struct ata_queued_cmd *qc) | |||
1395 | * doesn't allow it. | 1414 | * doesn't allow it. |
1396 | */ | 1415 | */ |
1397 | if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) && | 1416 | if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) && |
1398 | (pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol)) | 1417 | (pp->pp_flags & MV_PP_FLAG_NCQ_EN)) { |
1399 | return 0; | 1418 | if (ata_is_ncq(qc->tf.protocol)) |
1419 | return 0; | ||
1420 | else { | ||
1421 | ap->excl_link = link; | ||
1422 | return ATA_DEFER_PORT; | ||
1423 | } | ||
1424 | } | ||
1400 | 1425 | ||
1401 | return ATA_DEFER_PORT; | 1426 | return ATA_DEFER_PORT; |
1402 | } | 1427 | } |
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index 86a40582999c..1eb4e020eb5c 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c | |||
@@ -1594,9 +1594,21 @@ static int nv_hardreset(struct ata_link *link, unsigned int *class, | |||
1594 | !ata_dev_enabled(link->device)) | 1594 | !ata_dev_enabled(link->device)) |
1595 | sata_link_hardreset(link, sata_deb_timing_hotplug, deadline, | 1595 | sata_link_hardreset(link, sata_deb_timing_hotplug, deadline, |
1596 | NULL, NULL); | 1596 | NULL, NULL); |
1597 | else if (!(ehc->i.flags & ATA_EHI_QUIET)) | 1597 | else { |
1598 | ata_link_printk(link, KERN_INFO, | 1598 | const unsigned long *timing = sata_ehc_deb_timing(ehc); |
1599 | "nv: skipping hardreset on occupied port\n"); | 1599 | int rc; |
1600 | |||
1601 | if (!(ehc->i.flags & ATA_EHI_QUIET)) | ||
1602 | ata_link_printk(link, KERN_INFO, "nv: skipping " | ||
1603 | "hardreset on occupied port\n"); | ||
1604 | |||
1605 | /* make sure the link is online */ | ||
1606 | rc = sata_link_resume(link, timing, deadline); | ||
1607 | /* whine about phy resume failure but proceed */ | ||
1608 | if (rc && rc != -EOPNOTSUPP) | ||
1609 | ata_link_printk(link, KERN_WARNING, "failed to resume " | ||
1610 | "link (errno=%d)\n", rc); | ||
1611 | } | ||
1600 | 1612 | ||
1601 | /* device signature acquisition is unreliable */ | 1613 | /* device signature acquisition is unreliable */ |
1602 | return -EAGAIN; | 1614 | return -EAGAIN; |
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c index bdd43c7f432e..02efd9a83d26 100644 --- a/drivers/ata/sata_via.c +++ b/drivers/ata/sata_via.c | |||
@@ -93,7 +93,6 @@ static const struct pci_device_id svia_pci_tbl[] = { | |||
93 | { PCI_VDEVICE(VIA, 0x7372), vt6420 }, | 93 | { PCI_VDEVICE(VIA, 0x7372), vt6420 }, |
94 | { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */ | 94 | { PCI_VDEVICE(VIA, 0x5287), vt8251 }, /* 2 sata chnls (Master/Slave) */ |
95 | { PCI_VDEVICE(VIA, 0x9000), vt8251 }, | 95 | { PCI_VDEVICE(VIA, 0x9000), vt8251 }, |
96 | { PCI_VDEVICE(VIA, 0x9040), vt8251 }, | ||
97 | 96 | ||
98 | { } /* terminate list */ | 97 | { } /* terminate list */ |
99 | }; | 98 | }; |
diff --git a/drivers/base/bus.c b/drivers/base/bus.c index 973bf2ad4e0d..63c143e54a57 100644 --- a/drivers/base/bus.c +++ b/drivers/base/bus.c | |||
@@ -689,15 +689,19 @@ int bus_add_driver(struct device_driver *drv) | |||
689 | printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n", | 689 | printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n", |
690 | __func__, drv->name); | 690 | __func__, drv->name); |
691 | } | 691 | } |
692 | error = add_bind_files(drv); | 692 | |
693 | if (error) { | 693 | if (!drv->suppress_bind_attrs) { |
694 | /* Ditto */ | 694 | error = add_bind_files(drv); |
695 | printk(KERN_ERR "%s: add_bind_files(%s) failed\n", | 695 | if (error) { |
696 | __func__, drv->name); | 696 | /* Ditto */ |
697 | printk(KERN_ERR "%s: add_bind_files(%s) failed\n", | ||
698 | __func__, drv->name); | ||
699 | } | ||
697 | } | 700 | } |
698 | 701 | ||
699 | kobject_uevent(&priv->kobj, KOBJ_ADD); | 702 | kobject_uevent(&priv->kobj, KOBJ_ADD); |
700 | return 0; | 703 | return 0; |
704 | |||
701 | out_unregister: | 705 | out_unregister: |
702 | kfree(drv->p); | 706 | kfree(drv->p); |
703 | drv->p = NULL; | 707 | drv->p = NULL; |
@@ -720,7 +724,8 @@ void bus_remove_driver(struct device_driver *drv) | |||
720 | if (!drv->bus) | 724 | if (!drv->bus) |
721 | return; | 725 | return; |
722 | 726 | ||
723 | remove_bind_files(drv); | 727 | if (!drv->suppress_bind_attrs) |
728 | remove_bind_files(drv); | ||
724 | driver_remove_attrs(drv->bus, drv); | 729 | driver_remove_attrs(drv->bus, drv); |
725 | driver_remove_file(drv, &driver_attr_uevent); | 730 | driver_remove_file(drv, &driver_attr_uevent); |
726 | klist_remove(&drv->p->knode_bus); | 731 | klist_remove(&drv->p->knode_bus); |
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index ed2ebd3c287d..f367885a7646 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -236,7 +236,7 @@ int driver_register(struct device_driver *drv) | |||
236 | put_driver(other); | 236 | put_driver(other); |
237 | printk(KERN_ERR "Error: Driver '%s' is already registered, " | 237 | printk(KERN_ERR "Error: Driver '%s' is already registered, " |
238 | "aborting...\n", drv->name); | 238 | "aborting...\n", drv->name); |
239 | return -EEXIST; | 239 | return -EBUSY; |
240 | } | 240 | } |
241 | 241 | ||
242 | ret = bus_add_driver(drv); | 242 | ret = bus_add_driver(drv); |
diff --git a/drivers/base/platform.c b/drivers/base/platform.c index ed156a13aa40..4fa954b07ac4 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c | |||
@@ -521,11 +521,15 @@ int __init_or_module platform_driver_probe(struct platform_driver *drv, | |||
521 | { | 521 | { |
522 | int retval, code; | 522 | int retval, code; |
523 | 523 | ||
524 | /* make sure driver won't have bind/unbind attributes */ | ||
525 | drv->driver.suppress_bind_attrs = true; | ||
526 | |||
524 | /* temporary section violation during probe() */ | 527 | /* temporary section violation during probe() */ |
525 | drv->probe = probe; | 528 | drv->probe = probe; |
526 | retval = code = platform_driver_register(drv); | 529 | retval = code = platform_driver_register(drv); |
527 | 530 | ||
528 | /* Fixup that section violation, being paranoid about code scanning | 531 | /* |
532 | * Fixup that section violation, being paranoid about code scanning | ||
529 | * the list of drivers in order to probe new devices. Check to see | 533 | * the list of drivers in order to probe new devices. Check to see |
530 | * if the probe was successful, and make sure any forced probes of | 534 | * if the probe was successful, and make sure any forced probes of |
531 | * new devices fail. | 535 | * new devices fail. |
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index e0dc4071e088..8aa2443182d5 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
@@ -511,6 +511,7 @@ static void dpm_complete(pm_message_t state) | |||
511 | 511 | ||
512 | INIT_LIST_HEAD(&list); | 512 | INIT_LIST_HEAD(&list); |
513 | mutex_lock(&dpm_list_mtx); | 513 | mutex_lock(&dpm_list_mtx); |
514 | transition_started = false; | ||
514 | while (!list_empty(&dpm_list)) { | 515 | while (!list_empty(&dpm_list)) { |
515 | struct device *dev = to_device(dpm_list.prev); | 516 | struct device *dev = to_device(dpm_list.prev); |
516 | 517 | ||
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 38556f6cc22d..a770498a74ec 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
@@ -51,8 +51,6 @@ static int __pm_runtime_idle(struct device *dev) | |||
51 | { | 51 | { |
52 | int retval = 0; | 52 | int retval = 0; |
53 | 53 | ||
54 | dev_dbg(dev, "__pm_runtime_idle()!\n"); | ||
55 | |||
56 | if (dev->power.runtime_error) | 54 | if (dev->power.runtime_error) |
57 | retval = -EINVAL; | 55 | retval = -EINVAL; |
58 | else if (dev->power.idle_notification) | 56 | else if (dev->power.idle_notification) |
@@ -93,8 +91,6 @@ static int __pm_runtime_idle(struct device *dev) | |||
93 | wake_up_all(&dev->power.wait_queue); | 91 | wake_up_all(&dev->power.wait_queue); |
94 | 92 | ||
95 | out: | 93 | out: |
96 | dev_dbg(dev, "__pm_runtime_idle() returns %d!\n", retval); | ||
97 | |||
98 | return retval; | 94 | return retval; |
99 | } | 95 | } |
100 | 96 | ||
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index edda9ea7c626..bd112c8c7bcd 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c | |||
@@ -949,7 +949,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev) | |||
949 | lo->lo_state = Lo_unbound; | 949 | lo->lo_state = Lo_unbound; |
950 | /* This is safe: open() is still holding a reference. */ | 950 | /* This is safe: open() is still holding a reference. */ |
951 | module_put(THIS_MODULE); | 951 | module_put(THIS_MODULE); |
952 | if (max_part > 0) | 952 | if (max_part > 0 && bdev) |
953 | ioctl_by_bdev(bdev, BLKRRPART, 0); | 953 | ioctl_by_bdev(bdev, BLKRRPART, 0); |
954 | mutex_unlock(&lo->lo_ctl_mutex); | 954 | mutex_unlock(&lo->lo_ctl_mutex); |
955 | /* | 955 | /* |
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c index 43f19389647a..51042f0ba7e1 100644 --- a/drivers/block/virtio_blk.c +++ b/drivers/block/virtio_blk.c | |||
@@ -3,7 +3,6 @@ | |||
3 | #include <linux/blkdev.h> | 3 | #include <linux/blkdev.h> |
4 | #include <linux/hdreg.h> | 4 | #include <linux/hdreg.h> |
5 | #include <linux/virtio.h> | 5 | #include <linux/virtio.h> |
6 | #include <linux/virtio_ids.h> | ||
7 | #include <linux/virtio_blk.h> | 6 | #include <linux/virtio_blk.h> |
8 | #include <linux/scatterlist.h> | 7 | #include <linux/scatterlist.h> |
9 | 8 | ||
@@ -183,34 +182,6 @@ static void do_virtblk_request(struct request_queue *q) | |||
183 | vblk->vq->vq_ops->kick(vblk->vq); | 182 | vblk->vq->vq_ops->kick(vblk->vq); |
184 | } | 183 | } |
185 | 184 | ||
186 | /* return ATA identify data | ||
187 | */ | ||
188 | static int virtblk_identify(struct gendisk *disk, void *argp) | ||
189 | { | ||
190 | struct virtio_blk *vblk = disk->private_data; | ||
191 | void *opaque; | ||
192 | int err = -ENOMEM; | ||
193 | |||
194 | opaque = kmalloc(VIRTIO_BLK_ID_BYTES, GFP_KERNEL); | ||
195 | if (!opaque) | ||
196 | goto out; | ||
197 | |||
198 | err = virtio_config_buf(vblk->vdev, VIRTIO_BLK_F_IDENTIFY, | ||
199 | offsetof(struct virtio_blk_config, identify), opaque, | ||
200 | VIRTIO_BLK_ID_BYTES); | ||
201 | |||
202 | if (err) | ||
203 | goto out_kfree; | ||
204 | |||
205 | if (copy_to_user(argp, opaque, VIRTIO_BLK_ID_BYTES)) | ||
206 | err = -EFAULT; | ||
207 | |||
208 | out_kfree: | ||
209 | kfree(opaque); | ||
210 | out: | ||
211 | return err; | ||
212 | } | ||
213 | |||
214 | static void virtblk_prepare_flush(struct request_queue *q, struct request *req) | 185 | static void virtblk_prepare_flush(struct request_queue *q, struct request *req) |
215 | { | 186 | { |
216 | req->cmd_type = REQ_TYPE_LINUX_BLOCK; | 187 | req->cmd_type = REQ_TYPE_LINUX_BLOCK; |
@@ -222,10 +193,6 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | |||
222 | { | 193 | { |
223 | struct gendisk *disk = bdev->bd_disk; | 194 | struct gendisk *disk = bdev->bd_disk; |
224 | struct virtio_blk *vblk = disk->private_data; | 195 | struct virtio_blk *vblk = disk->private_data; |
225 | void __user *argp = (void __user *)data; | ||
226 | |||
227 | if (cmd == HDIO_GET_IDENTITY) | ||
228 | return virtblk_identify(disk, argp); | ||
229 | 196 | ||
230 | /* | 197 | /* |
231 | * Only allow the generic SCSI ioctls if the host can support it. | 198 | * Only allow the generic SCSI ioctls if the host can support it. |
@@ -233,7 +200,8 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, | |||
233 | if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI)) | 200 | if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI)) |
234 | return -ENOTTY; | 201 | return -ENOTTY; |
235 | 202 | ||
236 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp); | 203 | return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, |
204 | (void __user *)data); | ||
237 | } | 205 | } |
238 | 206 | ||
239 | /* We provide getgeo only to please some old bootloader/partitioning tools */ | 207 | /* We provide getgeo only to please some old bootloader/partitioning tools */ |
@@ -332,7 +300,6 @@ static int __devinit virtblk_probe(struct virtio_device *vdev) | |||
332 | } | 300 | } |
333 | 301 | ||
334 | vblk->disk->queue->queuedata = vblk; | 302 | vblk->disk->queue->queuedata = vblk; |
335 | queue_flag_set_unlocked(QUEUE_FLAG_VIRT, vblk->disk->queue); | ||
336 | 303 | ||
337 | if (index < 26) { | 304 | if (index < 26) { |
338 | sprintf(vblk->disk->disk_name, "vd%c", 'a' + index % 26); | 305 | sprintf(vblk->disk->disk_name, "vd%c", 'a' + index % 26); |
@@ -445,7 +412,7 @@ static struct virtio_device_id id_table[] = { | |||
445 | static unsigned int features[] = { | 412 | static unsigned int features[] = { |
446 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, | 413 | VIRTIO_BLK_F_BARRIER, VIRTIO_BLK_F_SEG_MAX, VIRTIO_BLK_F_SIZE_MAX, |
447 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, | 414 | VIRTIO_BLK_F_GEOMETRY, VIRTIO_BLK_F_RO, VIRTIO_BLK_F_BLK_SIZE, |
448 | VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_IDENTIFY, VIRTIO_BLK_F_FLUSH | 415 | VIRTIO_BLK_F_SCSI, VIRTIO_BLK_F_FLUSH |
449 | }; | 416 | }; |
450 | 417 | ||
451 | /* | 418 | /* |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 08a6f50ae791..6aad99ec4e0f 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -323,7 +323,7 @@ config SPECIALIX | |||
323 | 323 | ||
324 | config SX | 324 | config SX |
325 | tristate "Specialix SX (and SI) card support" | 325 | tristate "Specialix SX (and SI) card support" |
326 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) | 326 | depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN |
327 | help | 327 | help |
328 | This is a driver for the SX and SI multiport serial cards. | 328 | This is a driver for the SX and SI multiport serial cards. |
329 | Please read the file <file:Documentation/serial/sx.txt> for details. | 329 | Please read the file <file:Documentation/serial/sx.txt> for details. |
@@ -334,7 +334,7 @@ config SX | |||
334 | 334 | ||
335 | config RIO | 335 | config RIO |
336 | tristate "Specialix RIO system support" | 336 | tristate "Specialix RIO system support" |
337 | depends on SERIAL_NONSTANDARD | 337 | depends on SERIAL_NONSTANDARD && BROKEN |
338 | help | 338 | help |
339 | This is a driver for the Specialix RIO, a smart serial card which | 339 | This is a driver for the Specialix RIO, a smart serial card which |
340 | drives an outboard box that can support up to 128 ports. Product | 340 | drives an outboard box that can support up to 128 ports. Product |
@@ -395,7 +395,7 @@ config NOZOMI | |||
395 | 395 | ||
396 | config A2232 | 396 | config A2232 |
397 | tristate "Commodore A2232 serial support (EXPERIMENTAL)" | 397 | tristate "Commodore A2232 serial support (EXPERIMENTAL)" |
398 | depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP | 398 | depends on EXPERIMENTAL && ZORRO && BROKEN |
399 | ---help--- | 399 | ---help--- |
400 | This option supports the 2232 7-port serial card shipped with the | 400 | This option supports the 2232 7-port serial card shipped with the |
401 | Amiga 2000 and other Zorro-bus machines, dating from 1989. At | 401 | Amiga 2000 and other Zorro-bus machines, dating from 1989. At |
diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c index 962968f05b94..915157fcff98 100644 --- a/drivers/char/hw_random/virtio-rng.c +++ b/drivers/char/hw_random/virtio-rng.c | |||
@@ -21,7 +21,6 @@ | |||
21 | #include <linux/scatterlist.h> | 21 | #include <linux/scatterlist.h> |
22 | #include <linux/spinlock.h> | 22 | #include <linux/spinlock.h> |
23 | #include <linux/virtio.h> | 23 | #include <linux/virtio.h> |
24 | #include <linux/virtio_ids.h> | ||
25 | #include <linux/virtio_rng.h> | 24 | #include <linux/virtio_rng.h> |
26 | 25 | ||
27 | /* The host will fill any buffer we give it with sweet, sweet randomness. We | 26 | /* The host will fill any buffer we give it with sweet, sweet randomness. We |
@@ -117,7 +116,7 @@ static int virtrng_probe(struct virtio_device *vdev) | |||
117 | return 0; | 116 | return 0; |
118 | } | 117 | } |
119 | 118 | ||
120 | static void virtrng_remove(struct virtio_device *vdev) | 119 | static void __devexit virtrng_remove(struct virtio_device *vdev) |
121 | { | 120 | { |
122 | vdev->config->reset(vdev); | 121 | vdev->config->reset(vdev); |
123 | hwrng_unregister(&virtio_hwrng); | 122 | hwrng_unregister(&virtio_hwrng); |
diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c index 0d328b59568d..a035ae39a359 100644 --- a/drivers/char/virtio_console.c +++ b/drivers/char/virtio_console.c | |||
@@ -31,7 +31,6 @@ | |||
31 | #include <linux/err.h> | 31 | #include <linux/err.h> |
32 | #include <linux/init.h> | 32 | #include <linux/init.h> |
33 | #include <linux/virtio.h> | 33 | #include <linux/virtio.h> |
34 | #include <linux/virtio_ids.h> | ||
35 | #include <linux/virtio_console.h> | 34 | #include <linux/virtio_console.h> |
36 | #include "hvc_console.h" | 35 | #include "hvc_console.h" |
37 | 36 | ||
diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c index ad41f19b8e3f..12fdd3987a36 100644 --- a/drivers/cpuidle/cpuidle.c +++ b/drivers/cpuidle/cpuidle.c | |||
@@ -76,8 +76,11 @@ static void cpuidle_idle_call(void) | |||
76 | #endif | 76 | #endif |
77 | /* ask the governor for the next state */ | 77 | /* ask the governor for the next state */ |
78 | next_state = cpuidle_curr_governor->select(dev); | 78 | next_state = cpuidle_curr_governor->select(dev); |
79 | if (need_resched()) | 79 | if (need_resched()) { |
80 | local_irq_enable(); | ||
80 | return; | 81 | return; |
82 | } | ||
83 | |||
81 | target_state = &dev->states[next_state]; | 84 | target_state = &dev->states[next_state]; |
82 | 85 | ||
83 | /* enter the state and update stats */ | 86 | /* enter the state and update stats */ |
diff --git a/drivers/crypto/padlock-sha.c b/drivers/crypto/padlock-sha.c index 76cb6b345e7b..0af80577dc7b 100644 --- a/drivers/crypto/padlock-sha.c +++ b/drivers/crypto/padlock-sha.c | |||
@@ -24,6 +24,12 @@ | |||
24 | #include <asm/i387.h> | 24 | #include <asm/i387.h> |
25 | #include "padlock.h" | 25 | #include "padlock.h" |
26 | 26 | ||
27 | #ifdef CONFIG_64BIT | ||
28 | #define STACK_ALIGN 16 | ||
29 | #else | ||
30 | #define STACK_ALIGN 4 | ||
31 | #endif | ||
32 | |||
27 | struct padlock_sha_desc { | 33 | struct padlock_sha_desc { |
28 | struct shash_desc fallback; | 34 | struct shash_desc fallback; |
29 | }; | 35 | }; |
@@ -64,7 +70,9 @@ static int padlock_sha1_finup(struct shash_desc *desc, const u8 *in, | |||
64 | /* We can't store directly to *out as it may be unaligned. */ | 70 | /* We can't store directly to *out as it may be unaligned. */ |
65 | /* BTW Don't reduce the buffer size below 128 Bytes! | 71 | /* BTW Don't reduce the buffer size below 128 Bytes! |
66 | * PadLock microcode needs it that big. */ | 72 | * PadLock microcode needs it that big. */ |
67 | char result[128] __attribute__ ((aligned(PADLOCK_ALIGNMENT))); | 73 | char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN] __attribute__ |
74 | ((aligned(STACK_ALIGN))); | ||
75 | char *result = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT); | ||
68 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); | 76 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); |
69 | struct sha1_state state; | 77 | struct sha1_state state; |
70 | unsigned int space; | 78 | unsigned int space; |
@@ -128,7 +136,9 @@ static int padlock_sha256_finup(struct shash_desc *desc, const u8 *in, | |||
128 | /* We can't store directly to *out as it may be unaligned. */ | 136 | /* We can't store directly to *out as it may be unaligned. */ |
129 | /* BTW Don't reduce the buffer size below 128 Bytes! | 137 | /* BTW Don't reduce the buffer size below 128 Bytes! |
130 | * PadLock microcode needs it that big. */ | 138 | * PadLock microcode needs it that big. */ |
131 | char result[128] __attribute__ ((aligned(PADLOCK_ALIGNMENT))); | 139 | char buf[128 + PADLOCK_ALIGNMENT - STACK_ALIGN] __attribute__ |
140 | ((aligned(STACK_ALIGN))); | ||
141 | char *result = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT); | ||
132 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); | 142 | struct padlock_sha_desc *dctx = shash_desc_ctx(desc); |
133 | struct sha256_state state; | 143 | struct sha256_state state; |
134 | unsigned int space; | 144 | unsigned int space; |
diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c index 4f4ac82382f7..d4560d9d5a83 100644 --- a/drivers/edac/amd64_edac.c +++ b/drivers/edac/amd64_edac.c | |||
@@ -1122,7 +1122,7 @@ static void k8_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1122 | debugf0("Reading K8_DRAM_BASE_LOW failed\n"); | 1122 | debugf0("Reading K8_DRAM_BASE_LOW failed\n"); |
1123 | 1123 | ||
1124 | /* Extract parts into separate data entries */ | 1124 | /* Extract parts into separate data entries */ |
1125 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 24; | 1125 | pvt->dram_base[dram] = ((u64) low & 0xFFFF0000) << 8; |
1126 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; | 1126 | pvt->dram_IntlvEn[dram] = (low >> 8) & 0x7; |
1127 | pvt->dram_rw_en[dram] = (low & 0x3); | 1127 | pvt->dram_rw_en[dram] = (low & 0x3); |
1128 | 1128 | ||
@@ -1135,7 +1135,7 @@ static void k8_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1135 | * Extract parts into separate data entries. Limit is the HIGHEST memory | 1135 | * Extract parts into separate data entries. Limit is the HIGHEST memory |
1136 | * location of the region, so lower 24 bits need to be all ones | 1136 | * location of the region, so lower 24 bits need to be all ones |
1137 | */ | 1137 | */ |
1138 | pvt->dram_limit[dram] = (((u64) low & 0xFFFF0000) << 24) | 0x00FFFFFF; | 1138 | pvt->dram_limit[dram] = (((u64) low & 0xFFFF0000) << 8) | 0x00FFFFFF; |
1139 | pvt->dram_IntlvSel[dram] = (low >> 8) & 0x7; | 1139 | pvt->dram_IntlvSel[dram] = (low >> 8) & 0x7; |
1140 | pvt->dram_DstNode[dram] = (low & 0x7); | 1140 | pvt->dram_DstNode[dram] = (low & 0x7); |
1141 | } | 1141 | } |
@@ -1369,7 +1369,7 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1369 | pvt->dram_IntlvEn[dram] = (low_base >> 8) & 0x7; | 1369 | pvt->dram_IntlvEn[dram] = (low_base >> 8) & 0x7; |
1370 | 1370 | ||
1371 | pvt->dram_base[dram] = (((u64)high_base & 0x000000FF) << 40) | | 1371 | pvt->dram_base[dram] = (((u64)high_base & 0x000000FF) << 40) | |
1372 | (((u64)low_base & 0xFFFF0000) << 24); | 1372 | (((u64)low_base & 0xFFFF0000) << 8); |
1373 | 1373 | ||
1374 | low_offset = K8_DRAM_LIMIT_LOW + (dram << 3); | 1374 | low_offset = K8_DRAM_LIMIT_LOW + (dram << 3); |
1375 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); | 1375 | high_offset = F10_DRAM_LIMIT_HIGH + (dram << 3); |
@@ -1391,7 +1391,7 @@ static void f10_read_dram_base_limit(struct amd64_pvt *pvt, int dram) | |||
1391 | * memory location of the region, so low 24 bits need to be all ones. | 1391 | * memory location of the region, so low 24 bits need to be all ones. |
1392 | */ | 1392 | */ |
1393 | pvt->dram_limit[dram] = (((u64)high_limit & 0x000000FF) << 40) | | 1393 | pvt->dram_limit[dram] = (((u64)high_limit & 0x000000FF) << 40) | |
1394 | (((u64) low_limit & 0xFFFF0000) << 24) | | 1394 | (((u64) low_limit & 0xFFFF0000) << 8) | |
1395 | 0x00FFFFFF; | 1395 | 0x00FFFFFF; |
1396 | } | 1396 | } |
1397 | 1397 | ||
diff --git a/drivers/edac/i5000_edac.c b/drivers/edac/i5000_edac.c index d335086f4a26..77a9579d7167 100644 --- a/drivers/edac/i5000_edac.c +++ b/drivers/edac/i5000_edac.c | |||
@@ -1173,7 +1173,7 @@ static void i5000_get_mc_regs(struct mem_ctl_info *mci) | |||
1173 | pci_read_config_word(pvt->branch_1, where, | 1173 | pci_read_config_word(pvt->branch_1, where, |
1174 | &pvt->b1_mtr[slot_row]); | 1174 | &pvt->b1_mtr[slot_row]); |
1175 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, | 1175 | debugf2("MTR%d where=0x%x B1 value=0x%x\n", slot_row, |
1176 | where, pvt->b0_mtr[slot_row]); | 1176 | where, pvt->b1_mtr[slot_row]); |
1177 | } else { | 1177 | } else { |
1178 | pvt->b1_mtr[slot_row] = 0; | 1178 | pvt->b1_mtr[slot_row] = 0; |
1179 | } | 1179 | } |
@@ -1232,7 +1232,7 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) | |||
1232 | struct csrow_info *p_csrow; | 1232 | struct csrow_info *p_csrow; |
1233 | int empty, channel_count; | 1233 | int empty, channel_count; |
1234 | int max_csrows; | 1234 | int max_csrows; |
1235 | int mtr; | 1235 | int mtr, mtr1; |
1236 | int csrow_megs; | 1236 | int csrow_megs; |
1237 | int channel; | 1237 | int channel; |
1238 | int csrow; | 1238 | int csrow; |
@@ -1251,9 +1251,10 @@ static int i5000_init_csrows(struct mem_ctl_info *mci) | |||
1251 | 1251 | ||
1252 | /* use branch 0 for the basis */ | 1252 | /* use branch 0 for the basis */ |
1253 | mtr = pvt->b0_mtr[csrow >> 1]; | 1253 | mtr = pvt->b0_mtr[csrow >> 1]; |
1254 | mtr1 = pvt->b1_mtr[csrow >> 1]; | ||
1254 | 1255 | ||
1255 | /* if no DIMMS on this row, continue */ | 1256 | /* if no DIMMS on this row, continue */ |
1256 | if (!MTR_DIMMS_PRESENT(mtr)) | 1257 | if (!MTR_DIMMS_PRESENT(mtr) && !MTR_DIMMS_PRESENT(mtr1)) |
1257 | continue; | 1258 | continue; |
1258 | 1259 | ||
1259 | /* FAKE OUT VALUES, FIXME */ | 1260 | /* FAKE OUT VALUES, FIXME */ |
diff --git a/drivers/edac/i5400_edac.c b/drivers/edac/i5400_edac.c index b08b6d8e2dc7..f99d10655ed4 100644 --- a/drivers/edac/i5400_edac.c +++ b/drivers/edac/i5400_edac.c | |||
@@ -46,9 +46,10 @@ | |||
46 | /* Limits for i5400 */ | 46 | /* Limits for i5400 */ |
47 | #define NUM_MTRS_PER_BRANCH 4 | 47 | #define NUM_MTRS_PER_BRANCH 4 |
48 | #define CHANNELS_PER_BRANCH 2 | 48 | #define CHANNELS_PER_BRANCH 2 |
49 | #define MAX_DIMMS_PER_CHANNEL NUM_MTRS_PER_BRANCH | ||
49 | #define MAX_CHANNELS 4 | 50 | #define MAX_CHANNELS 4 |
50 | #define MAX_DIMMS (MAX_CHANNELS * 4) /* Up to 4 DIMM's per channel */ | 51 | /* max possible csrows per channel */ |
51 | #define MAX_CSROWS (MAX_DIMMS * 2) /* max possible csrows per channel */ | 52 | #define MAX_CSROWS (MAX_DIMMS_PER_CHANNEL) |
52 | 53 | ||
53 | /* Device 16, | 54 | /* Device 16, |
54 | * Function 0: System Address | 55 | * Function 0: System Address |
@@ -331,7 +332,6 @@ static const struct i5400_dev_info i5400_devs[] = { | |||
331 | 332 | ||
332 | struct i5400_dimm_info { | 333 | struct i5400_dimm_info { |
333 | int megabytes; /* size, 0 means not present */ | 334 | int megabytes; /* size, 0 means not present */ |
334 | int dual_rank; | ||
335 | }; | 335 | }; |
336 | 336 | ||
337 | /* driver private data structure */ | 337 | /* driver private data structure */ |
@@ -849,11 +849,9 @@ static int determine_mtr(struct i5400_pvt *pvt, int csrow, int channel) | |||
849 | int n; | 849 | int n; |
850 | 850 | ||
851 | /* There is one MTR for each slot pair of FB-DIMMs, | 851 | /* There is one MTR for each slot pair of FB-DIMMs, |
852 | Each slot may have one or two ranks (2 csrows), | ||
853 | Each slot pair may be at branch 0 or branch 1. | 852 | Each slot pair may be at branch 0 or branch 1. |
854 | So, csrow should be divided by eight | ||
855 | */ | 853 | */ |
856 | n = csrow >> 3; | 854 | n = csrow; |
857 | 855 | ||
858 | if (n >= NUM_MTRS_PER_BRANCH) { | 856 | if (n >= NUM_MTRS_PER_BRANCH) { |
859 | debugf0("ERROR: trying to access an invalid csrow: %d\n", | 857 | debugf0("ERROR: trying to access an invalid csrow: %d\n", |
@@ -905,25 +903,22 @@ static void handle_channel(struct i5400_pvt *pvt, int csrow, int channel, | |||
905 | amb_present_reg = determine_amb_present_reg(pvt, channel); | 903 | amb_present_reg = determine_amb_present_reg(pvt, channel); |
906 | 904 | ||
907 | /* Determine if there is a DIMM present in this DIMM slot */ | 905 | /* Determine if there is a DIMM present in this DIMM slot */ |
908 | if (amb_present_reg & (1 << (csrow >> 1))) { | 906 | if (amb_present_reg & (1 << csrow)) { |
909 | dinfo->dual_rank = MTR_DIMM_RANK(mtr); | 907 | /* Start with the number of bits for a Bank |
910 | 908 | * on the DRAM */ | |
911 | if (!((dinfo->dual_rank == 0) && | 909 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); |
912 | ((csrow & 0x1) == 0x1))) { | 910 | /* Add thenumber of ROW bits */ |
913 | /* Start with the number of bits for a Bank | 911 | addrBits += MTR_DIMM_ROWS_ADDR_BITS(mtr); |
914 | * on the DRAM */ | 912 | /* add the number of COLUMN bits */ |
915 | addrBits = MTR_DRAM_BANKS_ADDR_BITS(mtr); | 913 | addrBits += MTR_DIMM_COLS_ADDR_BITS(mtr); |
916 | /* Add thenumber of ROW bits */ | 914 | /* add the number of RANK bits */ |
917 | addrBits += MTR_DIMM_ROWS_ADDR_BITS(mtr); | 915 | addrBits += MTR_DIMM_RANK(mtr); |
918 | /* add the number of COLUMN bits */ | 916 | |
919 | addrBits += MTR_DIMM_COLS_ADDR_BITS(mtr); | 917 | addrBits += 6; /* add 64 bits per DIMM */ |
920 | 918 | addrBits -= 20; /* divide by 2^^20 */ | |
921 | addrBits += 6; /* add 64 bits per DIMM */ | 919 | addrBits -= 3; /* 8 bits per bytes */ |
922 | addrBits -= 20; /* divide by 2^^20 */ | 920 | |
923 | addrBits -= 3; /* 8 bits per bytes */ | 921 | dinfo->megabytes = 1 << addrBits; |
924 | |||
925 | dinfo->megabytes = 1 << addrBits; | ||
926 | } | ||
927 | } | 922 | } |
928 | } | 923 | } |
929 | } | 924 | } |
@@ -951,12 +946,12 @@ static void calculate_dimm_size(struct i5400_pvt *pvt) | |||
951 | return; | 946 | return; |
952 | } | 947 | } |
953 | 948 | ||
954 | /* Scan all the actual CSROWS (which is # of DIMMS * 2) | 949 | /* Scan all the actual CSROWS |
955 | * and calculate the information for each DIMM | 950 | * and calculate the information for each DIMM |
956 | * Start with the highest csrow first, to display it first | 951 | * Start with the highest csrow first, to display it first |
957 | * and work toward the 0th csrow | 952 | * and work toward the 0th csrow |
958 | */ | 953 | */ |
959 | max_csrows = pvt->maxdimmperch * 2; | 954 | max_csrows = pvt->maxdimmperch; |
960 | for (csrow = max_csrows - 1; csrow >= 0; csrow--) { | 955 | for (csrow = max_csrows - 1; csrow >= 0; csrow--) { |
961 | 956 | ||
962 | /* on an odd csrow, first output a 'boundary' marker, | 957 | /* on an odd csrow, first output a 'boundary' marker, |
@@ -1064,7 +1059,7 @@ static void i5400_get_mc_regs(struct mem_ctl_info *mci) | |||
1064 | 1059 | ||
1065 | /* Get the set of MTR[0-3] regs by each branch */ | 1060 | /* Get the set of MTR[0-3] regs by each branch */ |
1066 | for (slot_row = 0; slot_row < NUM_MTRS_PER_BRANCH; slot_row++) { | 1061 | for (slot_row = 0; slot_row < NUM_MTRS_PER_BRANCH; slot_row++) { |
1067 | int where = MTR0 + (slot_row * sizeof(u32)); | 1062 | int where = MTR0 + (slot_row * sizeof(u16)); |
1068 | 1063 | ||
1069 | /* Branch 0 set of MTR registers */ | 1064 | /* Branch 0 set of MTR registers */ |
1070 | pci_read_config_word(pvt->branch_0, where, | 1065 | pci_read_config_word(pvt->branch_0, where, |
@@ -1146,7 +1141,7 @@ static int i5400_init_csrows(struct mem_ctl_info *mci) | |||
1146 | pvt = mci->pvt_info; | 1141 | pvt = mci->pvt_info; |
1147 | 1142 | ||
1148 | channel_count = pvt->maxch; | 1143 | channel_count = pvt->maxch; |
1149 | max_csrows = pvt->maxdimmperch * 2; | 1144 | max_csrows = pvt->maxdimmperch; |
1150 | 1145 | ||
1151 | empty = 1; /* Assume NO memory */ | 1146 | empty = 1; /* Assume NO memory */ |
1152 | 1147 | ||
@@ -1215,28 +1210,6 @@ static void i5400_enable_error_reporting(struct mem_ctl_info *mci) | |||
1215 | } | 1210 | } |
1216 | 1211 | ||
1217 | /* | 1212 | /* |
1218 | * i5400_get_dimm_and_channel_counts(pdev, &num_csrows, &num_channels) | ||
1219 | * | ||
1220 | * ask the device how many channels are present and how many CSROWS | ||
1221 | * as well | ||
1222 | */ | ||
1223 | static void i5400_get_dimm_and_channel_counts(struct pci_dev *pdev, | ||
1224 | int *num_dimms_per_channel, | ||
1225 | int *num_channels) | ||
1226 | { | ||
1227 | u8 value; | ||
1228 | |||
1229 | /* Need to retrieve just how many channels and dimms per channel are | ||
1230 | * supported on this memory controller | ||
1231 | */ | ||
1232 | pci_read_config_byte(pdev, MAXDIMMPERCH, &value); | ||
1233 | *num_dimms_per_channel = (int)value * 2; | ||
1234 | |||
1235 | pci_read_config_byte(pdev, MAXCH, &value); | ||
1236 | *num_channels = (int)value; | ||
1237 | } | ||
1238 | |||
1239 | /* | ||
1240 | * i5400_probe1 Probe for ONE instance of device to see if it is | 1213 | * i5400_probe1 Probe for ONE instance of device to see if it is |
1241 | * present. | 1214 | * present. |
1242 | * return: | 1215 | * return: |
@@ -1263,22 +1236,16 @@ static int i5400_probe1(struct pci_dev *pdev, int dev_idx) | |||
1263 | if (PCI_FUNC(pdev->devfn) != 0) | 1236 | if (PCI_FUNC(pdev->devfn) != 0) |
1264 | return -ENODEV; | 1237 | return -ENODEV; |
1265 | 1238 | ||
1266 | /* Ask the devices for the number of CSROWS and CHANNELS so | 1239 | /* As we don't have a motherboard identification routine to determine |
1267 | * that we can calculate the memory resources, etc | ||
1268 | * | ||
1269 | * The Chipset will report what it can handle which will be greater | ||
1270 | * or equal to what the motherboard manufacturer will implement. | ||
1271 | * | ||
1272 | * As we don't have a motherboard identification routine to determine | ||
1273 | * actual number of slots/dimms per channel, we thus utilize the | 1240 | * actual number of slots/dimms per channel, we thus utilize the |
1274 | * resource as specified by the chipset. Thus, we might have | 1241 | * resource as specified by the chipset. Thus, we might have |
1275 | * have more DIMMs per channel than actually on the mobo, but this | 1242 | * have more DIMMs per channel than actually on the mobo, but this |
1276 | * allows the driver to support upto the chipset max, without | 1243 | * allows the driver to support upto the chipset max, without |
1277 | * some fancy mobo determination. | 1244 | * some fancy mobo determination. |
1278 | */ | 1245 | */ |
1279 | i5400_get_dimm_and_channel_counts(pdev, &num_dimms_per_channel, | 1246 | num_dimms_per_channel = MAX_DIMMS_PER_CHANNEL; |
1280 | &num_channels); | 1247 | num_channels = MAX_CHANNELS; |
1281 | num_csrows = num_dimms_per_channel * 2; | 1248 | num_csrows = num_dimms_per_channel; |
1282 | 1249 | ||
1283 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", | 1250 | debugf0("MC: %s(): Number of - Channels= %d DIMMS= %d CSROWS= %d\n", |
1284 | __func__, num_channels, num_dimms_per_channel, num_csrows); | 1251 | __func__, num_channels, num_dimms_per_channel, num_csrows); |
diff --git a/drivers/edac/mpc85xx_edac.c b/drivers/edac/mpc85xx_edac.c index 157f6504f25e..cf27402af97b 100644 --- a/drivers/edac/mpc85xx_edac.c +++ b/drivers/edac/mpc85xx_edac.c | |||
@@ -26,7 +26,9 @@ | |||
26 | #include "mpc85xx_edac.h" | 26 | #include "mpc85xx_edac.h" |
27 | 27 | ||
28 | static int edac_dev_idx; | 28 | static int edac_dev_idx; |
29 | #ifdef CONFIG_PCI | ||
29 | static int edac_pci_idx; | 30 | static int edac_pci_idx; |
31 | #endif | ||
30 | static int edac_mc_idx; | 32 | static int edac_mc_idx; |
31 | 33 | ||
32 | static u32 orig_ddr_err_disable; | 34 | static u32 orig_ddr_err_disable; |
diff --git a/drivers/gpio/twl4030-gpio.c b/drivers/gpio/twl4030-gpio.c index afad14792141..49384a7c5492 100644 --- a/drivers/gpio/twl4030-gpio.c +++ b/drivers/gpio/twl4030-gpio.c | |||
@@ -460,7 +460,8 @@ no_irqs: | |||
460 | return ret; | 460 | return ret; |
461 | } | 461 | } |
462 | 462 | ||
463 | static int __devexit gpio_twl4030_remove(struct platform_device *pdev) | 463 | /* Cannot use __devexit as gpio_twl4030_probe() calls us */ |
464 | static int gpio_twl4030_remove(struct platform_device *pdev) | ||
464 | { | 465 | { |
465 | struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data; | 466 | struct twl4030_gpio_platform_data *pdata = pdev->dev.platform_data; |
466 | int status; | 467 | int status; |
@@ -493,7 +494,7 @@ static struct platform_driver gpio_twl4030_driver = { | |||
493 | .driver.name = "twl4030_gpio", | 494 | .driver.name = "twl4030_gpio", |
494 | .driver.owner = THIS_MODULE, | 495 | .driver.owner = THIS_MODULE, |
495 | .probe = gpio_twl4030_probe, | 496 | .probe = gpio_twl4030_probe, |
496 | .remove = __devexit_p(gpio_twl4030_remove), | 497 | .remove = gpio_twl4030_remove, |
497 | }; | 498 | }; |
498 | 499 | ||
499 | static int __init gpio_twl4030_init(void) | 500 | static int __init gpio_twl4030_init(void) |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 3c0d2b3aed76..cea665d86dd3 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -626,6 +626,12 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
626 | return NULL; | 626 | return NULL; |
627 | } | 627 | } |
628 | 628 | ||
629 | /* it is incorrect if hsync/vsync width is zero */ | ||
630 | if (!hsync_pulse_width || !vsync_pulse_width) { | ||
631 | DRM_DEBUG_KMS("Incorrect Detailed timing. " | ||
632 | "Wrong Hsync/Vsync pulse width\n"); | ||
633 | return NULL; | ||
634 | } | ||
629 | mode = drm_mode_create(dev); | 635 | mode = drm_mode_create(dev); |
630 | if (!mode) | 636 | if (!mode) |
631 | return NULL; | 637 | return NULL; |
@@ -647,6 +653,15 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev, | |||
647 | mode->vsync_end = mode->vsync_start + vsync_pulse_width; | 653 | mode->vsync_end = mode->vsync_start + vsync_pulse_width; |
648 | mode->vtotal = mode->vdisplay + vblank; | 654 | mode->vtotal = mode->vdisplay + vblank; |
649 | 655 | ||
656 | /* perform the basic check for the detailed timing */ | ||
657 | if (mode->hsync_end > mode->htotal || | ||
658 | mode->vsync_end > mode->vtotal) { | ||
659 | drm_mode_destroy(dev, mode); | ||
660 | DRM_DEBUG_KMS("Incorrect detailed timing. " | ||
661 | "Sync is beyond the blank.\n"); | ||
662 | return NULL; | ||
663 | } | ||
664 | |||
650 | drm_mode_set_name(mode); | 665 | drm_mode_set_name(mode); |
651 | 666 | ||
652 | if (pt->misc & DRM_EDID_PT_INTERLACED) | 667 | if (pt->misc & DRM_EDID_PT_INTERLACED) |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 23dc9c115fd9..9c924614c418 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
@@ -454,22 +454,39 @@ out_free: | |||
454 | } | 454 | } |
455 | EXPORT_SYMBOL(drm_fb_helper_init_crtc_count); | 455 | EXPORT_SYMBOL(drm_fb_helper_init_crtc_count); |
456 | 456 | ||
457 | static void setcolreg(struct drm_crtc *crtc, u16 red, u16 green, | 457 | static int setcolreg(struct drm_crtc *crtc, u16 red, u16 green, |
458 | u16 blue, u16 regno, struct fb_info *info) | 458 | u16 blue, u16 regno, struct fb_info *info) |
459 | { | 459 | { |
460 | struct drm_fb_helper *fb_helper = info->par; | 460 | struct drm_fb_helper *fb_helper = info->par; |
461 | struct drm_framebuffer *fb = fb_helper->fb; | 461 | struct drm_framebuffer *fb = fb_helper->fb; |
462 | int pindex; | 462 | int pindex; |
463 | 463 | ||
464 | if (info->fix.visual == FB_VISUAL_TRUECOLOR) { | ||
465 | u32 *palette; | ||
466 | u32 value; | ||
467 | /* place color in psuedopalette */ | ||
468 | if (regno > 16) | ||
469 | return -EINVAL; | ||
470 | palette = (u32 *)info->pseudo_palette; | ||
471 | red >>= (16 - info->var.red.length); | ||
472 | green >>= (16 - info->var.green.length); | ||
473 | blue >>= (16 - info->var.blue.length); | ||
474 | value = (red << info->var.red.offset) | | ||
475 | (green << info->var.green.offset) | | ||
476 | (blue << info->var.blue.offset); | ||
477 | palette[regno] = value; | ||
478 | return 0; | ||
479 | } | ||
480 | |||
464 | pindex = regno; | 481 | pindex = regno; |
465 | 482 | ||
466 | if (fb->bits_per_pixel == 16) { | 483 | if (fb->bits_per_pixel == 16) { |
467 | pindex = regno << 3; | 484 | pindex = regno << 3; |
468 | 485 | ||
469 | if (fb->depth == 16 && regno > 63) | 486 | if (fb->depth == 16 && regno > 63) |
470 | return; | 487 | return -EINVAL; |
471 | if (fb->depth == 15 && regno > 31) | 488 | if (fb->depth == 15 && regno > 31) |
472 | return; | 489 | return -EINVAL; |
473 | 490 | ||
474 | if (fb->depth == 16) { | 491 | if (fb->depth == 16) { |
475 | u16 r, g, b; | 492 | u16 r, g, b; |
@@ -493,13 +510,7 @@ static void setcolreg(struct drm_crtc *crtc, u16 red, u16 green, | |||
493 | 510 | ||
494 | if (fb->depth != 16) | 511 | if (fb->depth != 16) |
495 | fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); | 512 | fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex); |
496 | 513 | return 0; | |
497 | if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) { | ||
498 | ((u32 *) fb->pseudo_palette)[regno] = | ||
499 | (regno << info->var.red.offset) | | ||
500 | (regno << info->var.green.offset) | | ||
501 | (regno << info->var.blue.offset); | ||
502 | } | ||
503 | } | 514 | } |
504 | 515 | ||
505 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | 516 | int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) |
@@ -536,7 +547,9 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) | |||
536 | if (transp) | 547 | if (transp) |
537 | htransp = *transp++; | 548 | htransp = *transp++; |
538 | 549 | ||
539 | setcolreg(crtc, hred, hgreen, hblue, start++, info); | 550 | rc = setcolreg(crtc, hred, hgreen, hblue, start++, info); |
551 | if (rc) | ||
552 | return rc; | ||
540 | } | 553 | } |
541 | crtc_funcs->load_lut(crtc); | 554 | crtc_funcs->load_lut(crtc); |
542 | } | 555 | } |
@@ -555,6 +568,7 @@ int drm_fb_helper_setcolreg(unsigned regno, | |||
555 | struct drm_device *dev = fb_helper->dev; | 568 | struct drm_device *dev = fb_helper->dev; |
556 | struct drm_crtc *crtc; | 569 | struct drm_crtc *crtc; |
557 | int i; | 570 | int i; |
571 | int ret; | ||
558 | 572 | ||
559 | if (regno > 255) | 573 | if (regno > 255) |
560 | return 1; | 574 | return 1; |
@@ -568,8 +582,10 @@ int drm_fb_helper_setcolreg(unsigned regno, | |||
568 | if (i == fb_helper->crtc_count) | 582 | if (i == fb_helper->crtc_count) |
569 | continue; | 583 | continue; |
570 | 584 | ||
585 | ret = setcolreg(crtc, red, green, blue, regno, info); | ||
586 | if (ret) | ||
587 | return ret; | ||
571 | 588 | ||
572 | setcolreg(crtc, red, green, blue, regno, info); | ||
573 | crtc_funcs->load_lut(crtc); | 589 | crtc_funcs->load_lut(crtc); |
574 | } | 590 | } |
575 | return 0; | 591 | return 0; |
@@ -928,7 +944,7 @@ void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch, | |||
928 | { | 944 | { |
929 | info->fix.type = FB_TYPE_PACKED_PIXELS; | 945 | info->fix.type = FB_TYPE_PACKED_PIXELS; |
930 | info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : | 946 | info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR : |
931 | FB_VISUAL_DIRECTCOLOR; | 947 | FB_VISUAL_TRUECOLOR; |
932 | info->fix.type_aux = 0; | 948 | info->fix.type_aux = 0; |
933 | info->fix.xpanstep = 1; /* doing it in hw */ | 949 | info->fix.xpanstep = 1; /* doing it in hw */ |
934 | info->fix.ypanstep = 1; /* doing it in hw */ | 950 | info->fix.ypanstep = 1; /* doing it in hw */ |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 92aeb918e0c0..e5b138be45fa 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
@@ -1227,8 +1227,7 @@ static int i915_load_modeset_init(struct drm_device *dev, | |||
1227 | goto out; | 1227 | goto out; |
1228 | 1228 | ||
1229 | /* Try to set up FBC with a reasonable compressed buffer size */ | 1229 | /* Try to set up FBC with a reasonable compressed buffer size */ |
1230 | if (IS_MOBILE(dev) && (IS_I9XX(dev) || IS_I965G(dev) || IS_GM45(dev)) && | 1230 | if (I915_HAS_FBC(dev) && i915_powersave) { |
1231 | i915_powersave) { | ||
1232 | int cfb_size; | 1231 | int cfb_size; |
1233 | 1232 | ||
1234 | /* Try to get an 8M buffer... */ | 1233 | /* Try to get an 8M buffer... */ |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index b93814c0d3e2..7f436ec075f6 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -89,7 +89,8 @@ static int i915_suspend(struct drm_device *dev, pm_message_t state) | |||
89 | pci_set_power_state(dev->pdev, PCI_D3hot); | 89 | pci_set_power_state(dev->pdev, PCI_D3hot); |
90 | } | 90 | } |
91 | 91 | ||
92 | dev_priv->suspended = 1; | 92 | /* Modeset on resume, not lid events */ |
93 | dev_priv->modeset_on_lid = 0; | ||
93 | 94 | ||
94 | return 0; | 95 | return 0; |
95 | } | 96 | } |
@@ -124,7 +125,7 @@ static int i915_resume(struct drm_device *dev) | |||
124 | drm_helper_resume_force_mode(dev); | 125 | drm_helper_resume_force_mode(dev); |
125 | } | 126 | } |
126 | 127 | ||
127 | dev_priv->suspended = 0; | 128 | dev_priv->modeset_on_lid = 0; |
128 | 129 | ||
129 | return ret; | 130 | return ret; |
130 | } | 131 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6035d3dae851..57204e298975 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -274,7 +274,7 @@ typedef struct drm_i915_private { | |||
274 | struct drm_i915_display_funcs display; | 274 | struct drm_i915_display_funcs display; |
275 | 275 | ||
276 | /* Register state */ | 276 | /* Register state */ |
277 | bool suspended; | 277 | bool modeset_on_lid; |
278 | u8 saveLBB; | 278 | u8 saveLBB; |
279 | u32 saveDSPACNTR; | 279 | u32 saveDSPACNTR; |
280 | u32 saveDSPBCNTR; | 280 | u32 saveDSPBCNTR; |
@@ -296,6 +296,12 @@ typedef struct drm_i915_private { | |||
296 | u32 saveVBLANK_A; | 296 | u32 saveVBLANK_A; |
297 | u32 saveVSYNC_A; | 297 | u32 saveVSYNC_A; |
298 | u32 saveBCLRPAT_A; | 298 | u32 saveBCLRPAT_A; |
299 | u32 saveTRANS_HTOTAL_A; | ||
300 | u32 saveTRANS_HBLANK_A; | ||
301 | u32 saveTRANS_HSYNC_A; | ||
302 | u32 saveTRANS_VTOTAL_A; | ||
303 | u32 saveTRANS_VBLANK_A; | ||
304 | u32 saveTRANS_VSYNC_A; | ||
299 | u32 savePIPEASTAT; | 305 | u32 savePIPEASTAT; |
300 | u32 saveDSPASTRIDE; | 306 | u32 saveDSPASTRIDE; |
301 | u32 saveDSPASIZE; | 307 | u32 saveDSPASIZE; |
@@ -304,8 +310,11 @@ typedef struct drm_i915_private { | |||
304 | u32 saveDSPASURF; | 310 | u32 saveDSPASURF; |
305 | u32 saveDSPATILEOFF; | 311 | u32 saveDSPATILEOFF; |
306 | u32 savePFIT_PGM_RATIOS; | 312 | u32 savePFIT_PGM_RATIOS; |
313 | u32 saveBLC_HIST_CTL; | ||
307 | u32 saveBLC_PWM_CTL; | 314 | u32 saveBLC_PWM_CTL; |
308 | u32 saveBLC_PWM_CTL2; | 315 | u32 saveBLC_PWM_CTL2; |
316 | u32 saveBLC_CPU_PWM_CTL; | ||
317 | u32 saveBLC_CPU_PWM_CTL2; | ||
309 | u32 saveFPB0; | 318 | u32 saveFPB0; |
310 | u32 saveFPB1; | 319 | u32 saveFPB1; |
311 | u32 saveDPLL_B; | 320 | u32 saveDPLL_B; |
@@ -317,6 +326,12 @@ typedef struct drm_i915_private { | |||
317 | u32 saveVBLANK_B; | 326 | u32 saveVBLANK_B; |
318 | u32 saveVSYNC_B; | 327 | u32 saveVSYNC_B; |
319 | u32 saveBCLRPAT_B; | 328 | u32 saveBCLRPAT_B; |
329 | u32 saveTRANS_HTOTAL_B; | ||
330 | u32 saveTRANS_HBLANK_B; | ||
331 | u32 saveTRANS_HSYNC_B; | ||
332 | u32 saveTRANS_VTOTAL_B; | ||
333 | u32 saveTRANS_VBLANK_B; | ||
334 | u32 saveTRANS_VSYNC_B; | ||
320 | u32 savePIPEBSTAT; | 335 | u32 savePIPEBSTAT; |
321 | u32 saveDSPBSTRIDE; | 336 | u32 saveDSPBSTRIDE; |
322 | u32 saveDSPBSIZE; | 337 | u32 saveDSPBSIZE; |
@@ -342,6 +357,7 @@ typedef struct drm_i915_private { | |||
342 | u32 savePFIT_CONTROL; | 357 | u32 savePFIT_CONTROL; |
343 | u32 save_palette_a[256]; | 358 | u32 save_palette_a[256]; |
344 | u32 save_palette_b[256]; | 359 | u32 save_palette_b[256]; |
360 | u32 saveDPFC_CB_BASE; | ||
345 | u32 saveFBC_CFB_BASE; | 361 | u32 saveFBC_CFB_BASE; |
346 | u32 saveFBC_LL_BASE; | 362 | u32 saveFBC_LL_BASE; |
347 | u32 saveFBC_CONTROL; | 363 | u32 saveFBC_CONTROL; |
@@ -349,6 +365,12 @@ typedef struct drm_i915_private { | |||
349 | u32 saveIER; | 365 | u32 saveIER; |
350 | u32 saveIIR; | 366 | u32 saveIIR; |
351 | u32 saveIMR; | 367 | u32 saveIMR; |
368 | u32 saveDEIER; | ||
369 | u32 saveDEIMR; | ||
370 | u32 saveGTIER; | ||
371 | u32 saveGTIMR; | ||
372 | u32 saveFDI_RXA_IMR; | ||
373 | u32 saveFDI_RXB_IMR; | ||
352 | u32 saveCACHE_MODE_0; | 374 | u32 saveCACHE_MODE_0; |
353 | u32 saveD_STATE; | 375 | u32 saveD_STATE; |
354 | u32 saveDSPCLK_GATE_D; | 376 | u32 saveDSPCLK_GATE_D; |
@@ -382,6 +404,16 @@ typedef struct drm_i915_private { | |||
382 | u32 savePIPEB_DP_LINK_M; | 404 | u32 savePIPEB_DP_LINK_M; |
383 | u32 savePIPEA_DP_LINK_N; | 405 | u32 savePIPEA_DP_LINK_N; |
384 | u32 savePIPEB_DP_LINK_N; | 406 | u32 savePIPEB_DP_LINK_N; |
407 | u32 saveFDI_RXA_CTL; | ||
408 | u32 saveFDI_TXA_CTL; | ||
409 | u32 saveFDI_RXB_CTL; | ||
410 | u32 saveFDI_TXB_CTL; | ||
411 | u32 savePFA_CTL_1; | ||
412 | u32 savePFB_CTL_1; | ||
413 | u32 savePFA_WIN_SZ; | ||
414 | u32 savePFB_WIN_SZ; | ||
415 | u32 savePFA_WIN_POS; | ||
416 | u32 savePFB_WIN_POS; | ||
385 | 417 | ||
386 | struct { | 418 | struct { |
387 | struct drm_mm gtt_space; | 419 | struct drm_mm gtt_space; |
@@ -492,6 +524,8 @@ typedef struct drm_i915_private { | |||
492 | struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; | 524 | struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT]; |
493 | } mm; | 525 | } mm; |
494 | struct sdvo_device_mapping sdvo_mappings[2]; | 526 | struct sdvo_device_mapping sdvo_mappings[2]; |
527 | /* indicate whether the LVDS_BORDER should be enabled or not */ | ||
528 | unsigned int lvds_border_bits; | ||
495 | 529 | ||
496 | /* Reclocking support */ | 530 | /* Reclocking support */ |
497 | bool render_reclock_avail; | 531 | bool render_reclock_avail; |
@@ -981,7 +1015,10 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller); | |||
981 | 1015 | ||
982 | #define HAS_FW_BLC(dev) (IS_I9XX(dev) || IS_G4X(dev) || IS_IGDNG(dev)) | 1016 | #define HAS_FW_BLC(dev) (IS_I9XX(dev) || IS_G4X(dev) || IS_IGDNG(dev)) |
983 | #define HAS_PIPE_CXSR(dev) (IS_G4X(dev) || IS_IGDNG(dev)) | 1017 | #define HAS_PIPE_CXSR(dev) (IS_G4X(dev) || IS_IGDNG(dev)) |
984 | #define I915_HAS_FBC(dev) (IS_MOBILE(dev) && (IS_I9XX(dev) || IS_I965G(dev))) | 1018 | #define I915_HAS_FBC(dev) (IS_MOBILE(dev) && \ |
1019 | (IS_I9XX(dev) || IS_GM45(dev)) && \ | ||
1020 | !IS_IGD(dev) && \ | ||
1021 | !IS_IGDNG(dev)) | ||
985 | 1022 | ||
986 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) | 1023 | #define PRIMARY_RINGBUFFER_SIZE (128*1024) |
987 | 1024 | ||
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 0466ddbeba32..1687edf68795 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -968,6 +968,8 @@ | |||
968 | #define LVDS_PORT_EN (1 << 31) | 968 | #define LVDS_PORT_EN (1 << 31) |
969 | /* Selects pipe B for LVDS data. Must be set on pre-965. */ | 969 | /* Selects pipe B for LVDS data. Must be set on pre-965. */ |
970 | #define LVDS_PIPEB_SELECT (1 << 30) | 970 | #define LVDS_PIPEB_SELECT (1 << 30) |
971 | /* Enable border for unscaled (or aspect-scaled) display */ | ||
972 | #define LVDS_BORDER_ENABLE (1 << 15) | ||
971 | /* | 973 | /* |
972 | * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per | 974 | * Enables the A0-A2 data pairs and CLKA, containing 18 bits of color data per |
973 | * pixel. | 975 | * pixel. |
@@ -1078,6 +1080,8 @@ | |||
1078 | #define BACKLIGHT_DUTY_CYCLE_SHIFT (0) | 1080 | #define BACKLIGHT_DUTY_CYCLE_SHIFT (0) |
1079 | #define BACKLIGHT_DUTY_CYCLE_MASK (0xffff) | 1081 | #define BACKLIGHT_DUTY_CYCLE_MASK (0xffff) |
1080 | 1082 | ||
1083 | #define BLC_HIST_CTL 0x61260 | ||
1084 | |||
1081 | /* TV port control */ | 1085 | /* TV port control */ |
1082 | #define TV_CTL 0x68000 | 1086 | #define TV_CTL 0x68000 |
1083 | /** Enables the TV encoder */ | 1087 | /** Enables the TV encoder */ |
@@ -1780,6 +1784,11 @@ | |||
1780 | #define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */ | 1784 | #define PIPE_START_VBLANK_INTERRUPT_STATUS (1UL<<2) /* 965 or later */ |
1781 | #define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1) | 1785 | #define PIPE_VBLANK_INTERRUPT_STATUS (1UL<<1) |
1782 | #define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0) | 1786 | #define PIPE_OVERLAY_UPDATED_STATUS (1UL<<0) |
1787 | #define PIPE_BPC_MASK (7 << 5) /* Ironlake */ | ||
1788 | #define PIPE_8BPC (0 << 5) | ||
1789 | #define PIPE_10BPC (1 << 5) | ||
1790 | #define PIPE_6BPC (2 << 5) | ||
1791 | #define PIPE_12BPC (3 << 5) | ||
1783 | 1792 | ||
1784 | #define DSPARB 0x70030 | 1793 | #define DSPARB 0x70030 |
1785 | #define DSPARB_CSTART_MASK (0x7f << 7) | 1794 | #define DSPARB_CSTART_MASK (0x7f << 7) |
@@ -1790,17 +1799,29 @@ | |||
1790 | #define DSPARB_AEND_SHIFT 0 | 1799 | #define DSPARB_AEND_SHIFT 0 |
1791 | 1800 | ||
1792 | #define DSPFW1 0x70034 | 1801 | #define DSPFW1 0x70034 |
1802 | #define DSPFW_SR_SHIFT 23 | ||
1803 | #define DSPFW_CURSORB_SHIFT 16 | ||
1804 | #define DSPFW_PLANEB_SHIFT 8 | ||
1793 | #define DSPFW2 0x70038 | 1805 | #define DSPFW2 0x70038 |
1806 | #define DSPFW_CURSORA_MASK 0x00003f00 | ||
1807 | #define DSPFW_CURSORA_SHIFT 16 | ||
1794 | #define DSPFW3 0x7003c | 1808 | #define DSPFW3 0x7003c |
1809 | #define DSPFW_HPLL_SR_EN (1<<31) | ||
1810 | #define DSPFW_CURSOR_SR_SHIFT 24 | ||
1795 | #define IGD_SELF_REFRESH_EN (1<<30) | 1811 | #define IGD_SELF_REFRESH_EN (1<<30) |
1796 | 1812 | ||
1797 | /* FIFO watermark sizes etc */ | 1813 | /* FIFO watermark sizes etc */ |
1814 | #define G4X_FIFO_LINE_SIZE 64 | ||
1798 | #define I915_FIFO_LINE_SIZE 64 | 1815 | #define I915_FIFO_LINE_SIZE 64 |
1799 | #define I830_FIFO_LINE_SIZE 32 | 1816 | #define I830_FIFO_LINE_SIZE 32 |
1817 | |||
1818 | #define G4X_FIFO_SIZE 127 | ||
1800 | #define I945_FIFO_SIZE 127 /* 945 & 965 */ | 1819 | #define I945_FIFO_SIZE 127 /* 945 & 965 */ |
1801 | #define I915_FIFO_SIZE 95 | 1820 | #define I915_FIFO_SIZE 95 |
1802 | #define I855GM_FIFO_SIZE 127 /* In cachelines */ | 1821 | #define I855GM_FIFO_SIZE 127 /* In cachelines */ |
1803 | #define I830_FIFO_SIZE 95 | 1822 | #define I830_FIFO_SIZE 95 |
1823 | |||
1824 | #define G4X_MAX_WM 0x3f | ||
1804 | #define I915_MAX_WM 0x3f | 1825 | #define I915_MAX_WM 0x3f |
1805 | 1826 | ||
1806 | #define IGD_DISPLAY_FIFO 512 /* in 64byte unit */ | 1827 | #define IGD_DISPLAY_FIFO 512 /* in 64byte unit */ |
@@ -2030,6 +2051,11 @@ | |||
2030 | #define PFA_CTL_1 0x68080 | 2051 | #define PFA_CTL_1 0x68080 |
2031 | #define PFB_CTL_1 0x68880 | 2052 | #define PFB_CTL_1 0x68880 |
2032 | #define PF_ENABLE (1<<31) | 2053 | #define PF_ENABLE (1<<31) |
2054 | #define PF_FILTER_MASK (3<<23) | ||
2055 | #define PF_FILTER_PROGRAMMED (0<<23) | ||
2056 | #define PF_FILTER_MED_3x3 (1<<23) | ||
2057 | #define PF_FILTER_EDGE_ENHANCE (2<<23) | ||
2058 | #define PF_FILTER_EDGE_SOFTEN (3<<23) | ||
2033 | #define PFA_WIN_SZ 0x68074 | 2059 | #define PFA_WIN_SZ 0x68074 |
2034 | #define PFB_WIN_SZ 0x68874 | 2060 | #define PFB_WIN_SZ 0x68874 |
2035 | #define PFA_WIN_POS 0x68070 | 2061 | #define PFA_WIN_POS 0x68070 |
@@ -2149,11 +2175,11 @@ | |||
2149 | #define DREF_CPU_SOURCE_OUTPUT_MASK (3<<13) | 2175 | #define DREF_CPU_SOURCE_OUTPUT_MASK (3<<13) |
2150 | #define DREF_SSC_SOURCE_DISABLE (0<<11) | 2176 | #define DREF_SSC_SOURCE_DISABLE (0<<11) |
2151 | #define DREF_SSC_SOURCE_ENABLE (2<<11) | 2177 | #define DREF_SSC_SOURCE_ENABLE (2<<11) |
2152 | #define DREF_SSC_SOURCE_MASK (2<<11) | 2178 | #define DREF_SSC_SOURCE_MASK (3<<11) |
2153 | #define DREF_NONSPREAD_SOURCE_DISABLE (0<<9) | 2179 | #define DREF_NONSPREAD_SOURCE_DISABLE (0<<9) |
2154 | #define DREF_NONSPREAD_CK505_ENABLE (1<<9) | 2180 | #define DREF_NONSPREAD_CK505_ENABLE (1<<9) |
2155 | #define DREF_NONSPREAD_SOURCE_ENABLE (2<<9) | 2181 | #define DREF_NONSPREAD_SOURCE_ENABLE (2<<9) |
2156 | #define DREF_NONSPREAD_SOURCE_MASK (2<<9) | 2182 | #define DREF_NONSPREAD_SOURCE_MASK (3<<9) |
2157 | #define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) | 2183 | #define DREF_SUPERSPREAD_SOURCE_DISABLE (0<<7) |
2158 | #define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) | 2184 | #define DREF_SUPERSPREAD_SOURCE_ENABLE (2<<7) |
2159 | #define DREF_SSC4_DOWNSPREAD (0<<6) | 2185 | #define DREF_SSC4_DOWNSPREAD (0<<6) |
diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c index bd6d8d91ca9f..992d5617e798 100644 --- a/drivers/gpu/drm/i915/i915_suspend.c +++ b/drivers/gpu/drm/i915/i915_suspend.c | |||
@@ -32,11 +32,15 @@ | |||
32 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) | 32 | static bool i915_pipe_enabled(struct drm_device *dev, enum pipe pipe) |
33 | { | 33 | { |
34 | struct drm_i915_private *dev_priv = dev->dev_private; | 34 | struct drm_i915_private *dev_priv = dev->dev_private; |
35 | u32 dpll_reg; | ||
35 | 36 | ||
36 | if (pipe == PIPE_A) | 37 | if (IS_IGDNG(dev)) { |
37 | return (I915_READ(DPLL_A) & DPLL_VCO_ENABLE); | 38 | dpll_reg = (pipe == PIPE_A) ? PCH_DPLL_A: PCH_DPLL_B; |
38 | else | 39 | } else { |
39 | return (I915_READ(DPLL_B) & DPLL_VCO_ENABLE); | 40 | dpll_reg = (pipe == PIPE_A) ? DPLL_A: DPLL_B; |
41 | } | ||
42 | |||
43 | return (I915_READ(dpll_reg) & DPLL_VCO_ENABLE); | ||
40 | } | 44 | } |
41 | 45 | ||
42 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | 46 | static void i915_save_palette(struct drm_device *dev, enum pipe pipe) |
@@ -49,6 +53,9 @@ static void i915_save_palette(struct drm_device *dev, enum pipe pipe) | |||
49 | if (!i915_pipe_enabled(dev, pipe)) | 53 | if (!i915_pipe_enabled(dev, pipe)) |
50 | return; | 54 | return; |
51 | 55 | ||
56 | if (IS_IGDNG(dev)) | ||
57 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | ||
58 | |||
52 | if (pipe == PIPE_A) | 59 | if (pipe == PIPE_A) |
53 | array = dev_priv->save_palette_a; | 60 | array = dev_priv->save_palette_a; |
54 | else | 61 | else |
@@ -68,6 +75,9 @@ static void i915_restore_palette(struct drm_device *dev, enum pipe pipe) | |||
68 | if (!i915_pipe_enabled(dev, pipe)) | 75 | if (!i915_pipe_enabled(dev, pipe)) |
69 | return; | 76 | return; |
70 | 77 | ||
78 | if (IS_IGDNG(dev)) | ||
79 | reg = (pipe == PIPE_A) ? LGC_PALETTE_A : LGC_PALETTE_B; | ||
80 | |||
71 | if (pipe == PIPE_A) | 81 | if (pipe == PIPE_A) |
72 | array = dev_priv->save_palette_a; | 82 | array = dev_priv->save_palette_a; |
73 | else | 83 | else |
@@ -232,10 +242,16 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
232 | /* Pipe & plane A info */ | 242 | /* Pipe & plane A info */ |
233 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); | 243 | dev_priv->savePIPEACONF = I915_READ(PIPEACONF); |
234 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); | 244 | dev_priv->savePIPEASRC = I915_READ(PIPEASRC); |
235 | dev_priv->saveFPA0 = I915_READ(FPA0); | 245 | if (IS_IGDNG(dev)) { |
236 | dev_priv->saveFPA1 = I915_READ(FPA1); | 246 | dev_priv->saveFPA0 = I915_READ(PCH_FPA0); |
237 | dev_priv->saveDPLL_A = I915_READ(DPLL_A); | 247 | dev_priv->saveFPA1 = I915_READ(PCH_FPA1); |
238 | if (IS_I965G(dev)) | 248 | dev_priv->saveDPLL_A = I915_READ(PCH_DPLL_A); |
249 | } else { | ||
250 | dev_priv->saveFPA0 = I915_READ(FPA0); | ||
251 | dev_priv->saveFPA1 = I915_READ(FPA1); | ||
252 | dev_priv->saveDPLL_A = I915_READ(DPLL_A); | ||
253 | } | ||
254 | if (IS_I965G(dev) && !IS_IGDNG(dev)) | ||
239 | dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); | 255 | dev_priv->saveDPLL_A_MD = I915_READ(DPLL_A_MD); |
240 | dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); | 256 | dev_priv->saveHTOTAL_A = I915_READ(HTOTAL_A); |
241 | dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); | 257 | dev_priv->saveHBLANK_A = I915_READ(HBLANK_A); |
@@ -243,7 +259,24 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
243 | dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); | 259 | dev_priv->saveVTOTAL_A = I915_READ(VTOTAL_A); |
244 | dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); | 260 | dev_priv->saveVBLANK_A = I915_READ(VBLANK_A); |
245 | dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); | 261 | dev_priv->saveVSYNC_A = I915_READ(VSYNC_A); |
246 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 262 | if (!IS_IGDNG(dev)) |
263 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | ||
264 | |||
265 | if (IS_IGDNG(dev)) { | ||
266 | dev_priv->saveFDI_TXA_CTL = I915_READ(FDI_TXA_CTL); | ||
267 | dev_priv->saveFDI_RXA_CTL = I915_READ(FDI_RXA_CTL); | ||
268 | |||
269 | dev_priv->savePFA_CTL_1 = I915_READ(PFA_CTL_1); | ||
270 | dev_priv->savePFA_WIN_SZ = I915_READ(PFA_WIN_SZ); | ||
271 | dev_priv->savePFA_WIN_POS = I915_READ(PFA_WIN_POS); | ||
272 | |||
273 | dev_priv->saveTRANS_HTOTAL_A = I915_READ(TRANS_HTOTAL_A); | ||
274 | dev_priv->saveTRANS_HBLANK_A = I915_READ(TRANS_HBLANK_A); | ||
275 | dev_priv->saveTRANS_HSYNC_A = I915_READ(TRANS_HSYNC_A); | ||
276 | dev_priv->saveTRANS_VTOTAL_A = I915_READ(TRANS_VTOTAL_A); | ||
277 | dev_priv->saveTRANS_VBLANK_A = I915_READ(TRANS_VBLANK_A); | ||
278 | dev_priv->saveTRANS_VSYNC_A = I915_READ(TRANS_VSYNC_A); | ||
279 | } | ||
247 | 280 | ||
248 | dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); | 281 | dev_priv->saveDSPACNTR = I915_READ(DSPACNTR); |
249 | dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); | 282 | dev_priv->saveDSPASTRIDE = I915_READ(DSPASTRIDE); |
@@ -260,10 +293,16 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
260 | /* Pipe & plane B info */ | 293 | /* Pipe & plane B info */ |
261 | dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); | 294 | dev_priv->savePIPEBCONF = I915_READ(PIPEBCONF); |
262 | dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); | 295 | dev_priv->savePIPEBSRC = I915_READ(PIPEBSRC); |
263 | dev_priv->saveFPB0 = I915_READ(FPB0); | 296 | if (IS_IGDNG(dev)) { |
264 | dev_priv->saveFPB1 = I915_READ(FPB1); | 297 | dev_priv->saveFPB0 = I915_READ(PCH_FPB0); |
265 | dev_priv->saveDPLL_B = I915_READ(DPLL_B); | 298 | dev_priv->saveFPB1 = I915_READ(PCH_FPB1); |
266 | if (IS_I965G(dev)) | 299 | dev_priv->saveDPLL_B = I915_READ(PCH_DPLL_B); |
300 | } else { | ||
301 | dev_priv->saveFPB0 = I915_READ(FPB0); | ||
302 | dev_priv->saveFPB1 = I915_READ(FPB1); | ||
303 | dev_priv->saveDPLL_B = I915_READ(DPLL_B); | ||
304 | } | ||
305 | if (IS_I965G(dev) && !IS_IGDNG(dev)) | ||
267 | dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); | 306 | dev_priv->saveDPLL_B_MD = I915_READ(DPLL_B_MD); |
268 | dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); | 307 | dev_priv->saveHTOTAL_B = I915_READ(HTOTAL_B); |
269 | dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); | 308 | dev_priv->saveHBLANK_B = I915_READ(HBLANK_B); |
@@ -271,7 +310,24 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
271 | dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); | 310 | dev_priv->saveVTOTAL_B = I915_READ(VTOTAL_B); |
272 | dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); | 311 | dev_priv->saveVBLANK_B = I915_READ(VBLANK_B); |
273 | dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); | 312 | dev_priv->saveVSYNC_B = I915_READ(VSYNC_B); |
274 | dev_priv->saveBCLRPAT_A = I915_READ(BCLRPAT_A); | 313 | if (!IS_IGDNG(dev)) |
314 | dev_priv->saveBCLRPAT_B = I915_READ(BCLRPAT_B); | ||
315 | |||
316 | if (IS_IGDNG(dev)) { | ||
317 | dev_priv->saveFDI_TXB_CTL = I915_READ(FDI_TXB_CTL); | ||
318 | dev_priv->saveFDI_RXB_CTL = I915_READ(FDI_RXB_CTL); | ||
319 | |||
320 | dev_priv->savePFB_CTL_1 = I915_READ(PFB_CTL_1); | ||
321 | dev_priv->savePFB_WIN_SZ = I915_READ(PFB_WIN_SZ); | ||
322 | dev_priv->savePFB_WIN_POS = I915_READ(PFB_WIN_POS); | ||
323 | |||
324 | dev_priv->saveTRANS_HTOTAL_B = I915_READ(TRANS_HTOTAL_B); | ||
325 | dev_priv->saveTRANS_HBLANK_B = I915_READ(TRANS_HBLANK_B); | ||
326 | dev_priv->saveTRANS_HSYNC_B = I915_READ(TRANS_HSYNC_B); | ||
327 | dev_priv->saveTRANS_VTOTAL_B = I915_READ(TRANS_VTOTAL_B); | ||
328 | dev_priv->saveTRANS_VBLANK_B = I915_READ(TRANS_VBLANK_B); | ||
329 | dev_priv->saveTRANS_VSYNC_B = I915_READ(TRANS_VSYNC_B); | ||
330 | } | ||
275 | 331 | ||
276 | dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); | 332 | dev_priv->saveDSPBCNTR = I915_READ(DSPBCNTR); |
277 | dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); | 333 | dev_priv->saveDSPBSTRIDE = I915_READ(DSPBSTRIDE); |
@@ -290,23 +346,41 @@ static void i915_save_modeset_reg(struct drm_device *dev) | |||
290 | static void i915_restore_modeset_reg(struct drm_device *dev) | 346 | static void i915_restore_modeset_reg(struct drm_device *dev) |
291 | { | 347 | { |
292 | struct drm_i915_private *dev_priv = dev->dev_private; | 348 | struct drm_i915_private *dev_priv = dev->dev_private; |
349 | int dpll_a_reg, fpa0_reg, fpa1_reg; | ||
350 | int dpll_b_reg, fpb0_reg, fpb1_reg; | ||
293 | 351 | ||
294 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 352 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
295 | return; | 353 | return; |
296 | 354 | ||
355 | if (IS_IGDNG(dev)) { | ||
356 | dpll_a_reg = PCH_DPLL_A; | ||
357 | dpll_b_reg = PCH_DPLL_B; | ||
358 | fpa0_reg = PCH_FPA0; | ||
359 | fpb0_reg = PCH_FPB0; | ||
360 | fpa1_reg = PCH_FPA1; | ||
361 | fpb1_reg = PCH_FPB1; | ||
362 | } else { | ||
363 | dpll_a_reg = DPLL_A; | ||
364 | dpll_b_reg = DPLL_B; | ||
365 | fpa0_reg = FPA0; | ||
366 | fpb0_reg = FPB0; | ||
367 | fpa1_reg = FPA1; | ||
368 | fpb1_reg = FPB1; | ||
369 | } | ||
370 | |||
297 | /* Pipe & plane A info */ | 371 | /* Pipe & plane A info */ |
298 | /* Prime the clock */ | 372 | /* Prime the clock */ |
299 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { | 373 | if (dev_priv->saveDPLL_A & DPLL_VCO_ENABLE) { |
300 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A & | 374 | I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A & |
301 | ~DPLL_VCO_ENABLE); | 375 | ~DPLL_VCO_ENABLE); |
302 | DRM_UDELAY(150); | 376 | DRM_UDELAY(150); |
303 | } | 377 | } |
304 | I915_WRITE(FPA0, dev_priv->saveFPA0); | 378 | I915_WRITE(fpa0_reg, dev_priv->saveFPA0); |
305 | I915_WRITE(FPA1, dev_priv->saveFPA1); | 379 | I915_WRITE(fpa1_reg, dev_priv->saveFPA1); |
306 | /* Actually enable it */ | 380 | /* Actually enable it */ |
307 | I915_WRITE(DPLL_A, dev_priv->saveDPLL_A); | 381 | I915_WRITE(dpll_a_reg, dev_priv->saveDPLL_A); |
308 | DRM_UDELAY(150); | 382 | DRM_UDELAY(150); |
309 | if (IS_I965G(dev)) | 383 | if (IS_I965G(dev) && !IS_IGDNG(dev)) |
310 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); | 384 | I915_WRITE(DPLL_A_MD, dev_priv->saveDPLL_A_MD); |
311 | DRM_UDELAY(150); | 385 | DRM_UDELAY(150); |
312 | 386 | ||
@@ -317,7 +391,24 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
317 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); | 391 | I915_WRITE(VTOTAL_A, dev_priv->saveVTOTAL_A); |
318 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); | 392 | I915_WRITE(VBLANK_A, dev_priv->saveVBLANK_A); |
319 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); | 393 | I915_WRITE(VSYNC_A, dev_priv->saveVSYNC_A); |
320 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | 394 | if (!IS_IGDNG(dev)) |
395 | I915_WRITE(BCLRPAT_A, dev_priv->saveBCLRPAT_A); | ||
396 | |||
397 | if (IS_IGDNG(dev)) { | ||
398 | I915_WRITE(FDI_RXA_CTL, dev_priv->saveFDI_RXA_CTL); | ||
399 | I915_WRITE(FDI_TXA_CTL, dev_priv->saveFDI_TXA_CTL); | ||
400 | |||
401 | I915_WRITE(PFA_CTL_1, dev_priv->savePFA_CTL_1); | ||
402 | I915_WRITE(PFA_WIN_SZ, dev_priv->savePFA_WIN_SZ); | ||
403 | I915_WRITE(PFA_WIN_POS, dev_priv->savePFA_WIN_POS); | ||
404 | |||
405 | I915_WRITE(TRANS_HTOTAL_A, dev_priv->saveTRANS_HTOTAL_A); | ||
406 | I915_WRITE(TRANS_HBLANK_A, dev_priv->saveTRANS_HBLANK_A); | ||
407 | I915_WRITE(TRANS_HSYNC_A, dev_priv->saveTRANS_HSYNC_A); | ||
408 | I915_WRITE(TRANS_VTOTAL_A, dev_priv->saveTRANS_VTOTAL_A); | ||
409 | I915_WRITE(TRANS_VBLANK_A, dev_priv->saveTRANS_VBLANK_A); | ||
410 | I915_WRITE(TRANS_VSYNC_A, dev_priv->saveTRANS_VSYNC_A); | ||
411 | } | ||
321 | 412 | ||
322 | /* Restore plane info */ | 413 | /* Restore plane info */ |
323 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); | 414 | I915_WRITE(DSPASIZE, dev_priv->saveDSPASIZE); |
@@ -339,14 +430,14 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
339 | 430 | ||
340 | /* Pipe & plane B info */ | 431 | /* Pipe & plane B info */ |
341 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { | 432 | if (dev_priv->saveDPLL_B & DPLL_VCO_ENABLE) { |
342 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B & | 433 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B & |
343 | ~DPLL_VCO_ENABLE); | 434 | ~DPLL_VCO_ENABLE); |
344 | DRM_UDELAY(150); | 435 | DRM_UDELAY(150); |
345 | } | 436 | } |
346 | I915_WRITE(FPB0, dev_priv->saveFPB0); | 437 | I915_WRITE(fpb0_reg, dev_priv->saveFPB0); |
347 | I915_WRITE(FPB1, dev_priv->saveFPB1); | 438 | I915_WRITE(fpb1_reg, dev_priv->saveFPB1); |
348 | /* Actually enable it */ | 439 | /* Actually enable it */ |
349 | I915_WRITE(DPLL_B, dev_priv->saveDPLL_B); | 440 | I915_WRITE(dpll_b_reg, dev_priv->saveDPLL_B); |
350 | DRM_UDELAY(150); | 441 | DRM_UDELAY(150); |
351 | if (IS_I965G(dev)) | 442 | if (IS_I965G(dev)) |
352 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); | 443 | I915_WRITE(DPLL_B_MD, dev_priv->saveDPLL_B_MD); |
@@ -359,7 +450,24 @@ static void i915_restore_modeset_reg(struct drm_device *dev) | |||
359 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); | 450 | I915_WRITE(VTOTAL_B, dev_priv->saveVTOTAL_B); |
360 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); | 451 | I915_WRITE(VBLANK_B, dev_priv->saveVBLANK_B); |
361 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); | 452 | I915_WRITE(VSYNC_B, dev_priv->saveVSYNC_B); |
362 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | 453 | if (!IS_IGDNG(dev)) |
454 | I915_WRITE(BCLRPAT_B, dev_priv->saveBCLRPAT_B); | ||
455 | |||
456 | if (IS_IGDNG(dev)) { | ||
457 | I915_WRITE(FDI_RXB_CTL, dev_priv->saveFDI_RXB_CTL); | ||
458 | I915_WRITE(FDI_TXB_CTL, dev_priv->saveFDI_TXB_CTL); | ||
459 | |||
460 | I915_WRITE(PFB_CTL_1, dev_priv->savePFB_CTL_1); | ||
461 | I915_WRITE(PFB_WIN_SZ, dev_priv->savePFB_WIN_SZ); | ||
462 | I915_WRITE(PFB_WIN_POS, dev_priv->savePFB_WIN_POS); | ||
463 | |||
464 | I915_WRITE(TRANS_HTOTAL_B, dev_priv->saveTRANS_HTOTAL_B); | ||
465 | I915_WRITE(TRANS_HBLANK_B, dev_priv->saveTRANS_HBLANK_B); | ||
466 | I915_WRITE(TRANS_HSYNC_B, dev_priv->saveTRANS_HSYNC_B); | ||
467 | I915_WRITE(TRANS_VTOTAL_B, dev_priv->saveTRANS_VTOTAL_B); | ||
468 | I915_WRITE(TRANS_VBLANK_B, dev_priv->saveTRANS_VBLANK_B); | ||
469 | I915_WRITE(TRANS_VSYNC_B, dev_priv->saveTRANS_VSYNC_B); | ||
470 | } | ||
363 | 471 | ||
364 | /* Restore plane info */ | 472 | /* Restore plane info */ |
365 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); | 473 | I915_WRITE(DSPBSIZE, dev_priv->saveDSPBSIZE); |
@@ -404,21 +512,43 @@ void i915_save_display(struct drm_device *dev) | |||
404 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); | 512 | dev_priv->saveCURSIZE = I915_READ(CURSIZE); |
405 | 513 | ||
406 | /* CRT state */ | 514 | /* CRT state */ |
407 | dev_priv->saveADPA = I915_READ(ADPA); | 515 | if (IS_IGDNG(dev)) { |
516 | dev_priv->saveADPA = I915_READ(PCH_ADPA); | ||
517 | } else { | ||
518 | dev_priv->saveADPA = I915_READ(ADPA); | ||
519 | } | ||
408 | 520 | ||
409 | /* LVDS state */ | 521 | /* LVDS state */ |
410 | dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); | 522 | if (IS_IGDNG(dev)) { |
411 | dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | 523 | dev_priv->savePP_CONTROL = I915_READ(PCH_PP_CONTROL); |
412 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); | 524 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_PCH_CTL1); |
413 | if (IS_I965G(dev)) | 525 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_PCH_CTL2); |
414 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); | 526 | dev_priv->saveBLC_CPU_PWM_CTL = I915_READ(BLC_PWM_CPU_CTL); |
415 | if (IS_MOBILE(dev) && !IS_I830(dev)) | 527 | dev_priv->saveBLC_CPU_PWM_CTL2 = I915_READ(BLC_PWM_CPU_CTL2); |
416 | dev_priv->saveLVDS = I915_READ(LVDS); | 528 | dev_priv->saveLVDS = I915_READ(PCH_LVDS); |
417 | if (!IS_I830(dev) && !IS_845G(dev)) | 529 | } else { |
530 | dev_priv->savePP_CONTROL = I915_READ(PP_CONTROL); | ||
531 | dev_priv->savePFIT_PGM_RATIOS = I915_READ(PFIT_PGM_RATIOS); | ||
532 | dev_priv->saveBLC_PWM_CTL = I915_READ(BLC_PWM_CTL); | ||
533 | dev_priv->saveBLC_HIST_CTL = I915_READ(BLC_HIST_CTL); | ||
534 | if (IS_I965G(dev)) | ||
535 | dev_priv->saveBLC_PWM_CTL2 = I915_READ(BLC_PWM_CTL2); | ||
536 | if (IS_MOBILE(dev) && !IS_I830(dev)) | ||
537 | dev_priv->saveLVDS = I915_READ(LVDS); | ||
538 | } | ||
539 | |||
540 | if (!IS_I830(dev) && !IS_845G(dev) && !IS_IGDNG(dev)) | ||
418 | dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); | 541 | dev_priv->savePFIT_CONTROL = I915_READ(PFIT_CONTROL); |
419 | dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); | 542 | |
420 | dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); | 543 | if (IS_IGDNG(dev)) { |
421 | dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); | 544 | dev_priv->savePP_ON_DELAYS = I915_READ(PCH_PP_ON_DELAYS); |
545 | dev_priv->savePP_OFF_DELAYS = I915_READ(PCH_PP_OFF_DELAYS); | ||
546 | dev_priv->savePP_DIVISOR = I915_READ(PCH_PP_DIVISOR); | ||
547 | } else { | ||
548 | dev_priv->savePP_ON_DELAYS = I915_READ(PP_ON_DELAYS); | ||
549 | dev_priv->savePP_OFF_DELAYS = I915_READ(PP_OFF_DELAYS); | ||
550 | dev_priv->savePP_DIVISOR = I915_READ(PP_DIVISOR); | ||
551 | } | ||
422 | 552 | ||
423 | /* Display Port state */ | 553 | /* Display Port state */ |
424 | if (SUPPORTS_INTEGRATED_DP(dev)) { | 554 | if (SUPPORTS_INTEGRATED_DP(dev)) { |
@@ -437,16 +567,23 @@ void i915_save_display(struct drm_device *dev) | |||
437 | /* FIXME: save TV & SDVO state */ | 567 | /* FIXME: save TV & SDVO state */ |
438 | 568 | ||
439 | /* FBC state */ | 569 | /* FBC state */ |
440 | dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); | 570 | if (IS_GM45(dev)) { |
441 | dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); | 571 | dev_priv->saveDPFC_CB_BASE = I915_READ(DPFC_CB_BASE); |
442 | dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); | 572 | } else { |
443 | dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); | 573 | dev_priv->saveFBC_CFB_BASE = I915_READ(FBC_CFB_BASE); |
574 | dev_priv->saveFBC_LL_BASE = I915_READ(FBC_LL_BASE); | ||
575 | dev_priv->saveFBC_CONTROL2 = I915_READ(FBC_CONTROL2); | ||
576 | dev_priv->saveFBC_CONTROL = I915_READ(FBC_CONTROL); | ||
577 | } | ||
444 | 578 | ||
445 | /* VGA state */ | 579 | /* VGA state */ |
446 | dev_priv->saveVGA0 = I915_READ(VGA0); | 580 | dev_priv->saveVGA0 = I915_READ(VGA0); |
447 | dev_priv->saveVGA1 = I915_READ(VGA1); | 581 | dev_priv->saveVGA1 = I915_READ(VGA1); |
448 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); | 582 | dev_priv->saveVGA_PD = I915_READ(VGA_PD); |
449 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | 583 | if (IS_IGDNG(dev)) |
584 | dev_priv->saveVGACNTRL = I915_READ(CPU_VGACNTRL); | ||
585 | else | ||
586 | dev_priv->saveVGACNTRL = I915_READ(VGACNTRL); | ||
450 | 587 | ||
451 | i915_save_vga(dev); | 588 | i915_save_vga(dev); |
452 | } | 589 | } |
@@ -485,22 +622,41 @@ void i915_restore_display(struct drm_device *dev) | |||
485 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); | 622 | I915_WRITE(CURSIZE, dev_priv->saveCURSIZE); |
486 | 623 | ||
487 | /* CRT state */ | 624 | /* CRT state */ |
488 | I915_WRITE(ADPA, dev_priv->saveADPA); | 625 | if (IS_IGDNG(dev)) |
626 | I915_WRITE(PCH_ADPA, dev_priv->saveADPA); | ||
627 | else | ||
628 | I915_WRITE(ADPA, dev_priv->saveADPA); | ||
489 | 629 | ||
490 | /* LVDS state */ | 630 | /* LVDS state */ |
491 | if (IS_I965G(dev)) | 631 | if (IS_I965G(dev) && !IS_IGDNG(dev)) |
492 | I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); | 632 | I915_WRITE(BLC_PWM_CTL2, dev_priv->saveBLC_PWM_CTL2); |
493 | if (IS_MOBILE(dev) && !IS_I830(dev)) | 633 | |
634 | if (IS_IGDNG(dev)) { | ||
635 | I915_WRITE(PCH_LVDS, dev_priv->saveLVDS); | ||
636 | } else if (IS_MOBILE(dev) && !IS_I830(dev)) | ||
494 | I915_WRITE(LVDS, dev_priv->saveLVDS); | 637 | I915_WRITE(LVDS, dev_priv->saveLVDS); |
495 | if (!IS_I830(dev) && !IS_845G(dev)) | 638 | |
639 | if (!IS_I830(dev) && !IS_845G(dev) && !IS_IGDNG(dev)) | ||
496 | I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); | 640 | I915_WRITE(PFIT_CONTROL, dev_priv->savePFIT_CONTROL); |
497 | 641 | ||
498 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); | 642 | if (IS_IGDNG(dev)) { |
499 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); | 643 | I915_WRITE(BLC_PWM_PCH_CTL1, dev_priv->saveBLC_PWM_CTL); |
500 | I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); | 644 | I915_WRITE(BLC_PWM_PCH_CTL2, dev_priv->saveBLC_PWM_CTL2); |
501 | I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | 645 | I915_WRITE(BLC_PWM_CPU_CTL, dev_priv->saveBLC_CPU_PWM_CTL); |
502 | I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); | 646 | I915_WRITE(BLC_PWM_CPU_CTL2, dev_priv->saveBLC_CPU_PWM_CTL2); |
503 | I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); | 647 | I915_WRITE(PCH_PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); |
648 | I915_WRITE(PCH_PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | ||
649 | I915_WRITE(PCH_PP_DIVISOR, dev_priv->savePP_DIVISOR); | ||
650 | I915_WRITE(PCH_PP_CONTROL, dev_priv->savePP_CONTROL); | ||
651 | } else { | ||
652 | I915_WRITE(PFIT_PGM_RATIOS, dev_priv->savePFIT_PGM_RATIOS); | ||
653 | I915_WRITE(BLC_PWM_CTL, dev_priv->saveBLC_PWM_CTL); | ||
654 | I915_WRITE(BLC_HIST_CTL, dev_priv->saveBLC_HIST_CTL); | ||
655 | I915_WRITE(PP_ON_DELAYS, dev_priv->savePP_ON_DELAYS); | ||
656 | I915_WRITE(PP_OFF_DELAYS, dev_priv->savePP_OFF_DELAYS); | ||
657 | I915_WRITE(PP_DIVISOR, dev_priv->savePP_DIVISOR); | ||
658 | I915_WRITE(PP_CONTROL, dev_priv->savePP_CONTROL); | ||
659 | } | ||
504 | 660 | ||
505 | /* Display Port state */ | 661 | /* Display Port state */ |
506 | if (SUPPORTS_INTEGRATED_DP(dev)) { | 662 | if (SUPPORTS_INTEGRATED_DP(dev)) { |
@@ -511,13 +667,22 @@ void i915_restore_display(struct drm_device *dev) | |||
511 | /* FIXME: restore TV & SDVO state */ | 667 | /* FIXME: restore TV & SDVO state */ |
512 | 668 | ||
513 | /* FBC info */ | 669 | /* FBC info */ |
514 | I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); | 670 | if (IS_GM45(dev)) { |
515 | I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); | 671 | g4x_disable_fbc(dev); |
516 | I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); | 672 | I915_WRITE(DPFC_CB_BASE, dev_priv->saveDPFC_CB_BASE); |
517 | I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); | 673 | } else { |
674 | i8xx_disable_fbc(dev); | ||
675 | I915_WRITE(FBC_CFB_BASE, dev_priv->saveFBC_CFB_BASE); | ||
676 | I915_WRITE(FBC_LL_BASE, dev_priv->saveFBC_LL_BASE); | ||
677 | I915_WRITE(FBC_CONTROL2, dev_priv->saveFBC_CONTROL2); | ||
678 | I915_WRITE(FBC_CONTROL, dev_priv->saveFBC_CONTROL); | ||
679 | } | ||
518 | 680 | ||
519 | /* VGA state */ | 681 | /* VGA state */ |
520 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | 682 | if (IS_IGDNG(dev)) |
683 | I915_WRITE(CPU_VGACNTRL, dev_priv->saveVGACNTRL); | ||
684 | else | ||
685 | I915_WRITE(VGACNTRL, dev_priv->saveVGACNTRL); | ||
521 | I915_WRITE(VGA0, dev_priv->saveVGA0); | 686 | I915_WRITE(VGA0, dev_priv->saveVGA0); |
522 | I915_WRITE(VGA1, dev_priv->saveVGA1); | 687 | I915_WRITE(VGA1, dev_priv->saveVGA1); |
523 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); | 688 | I915_WRITE(VGA_PD, dev_priv->saveVGA_PD); |
@@ -543,8 +708,17 @@ int i915_save_state(struct drm_device *dev) | |||
543 | i915_save_display(dev); | 708 | i915_save_display(dev); |
544 | 709 | ||
545 | /* Interrupt state */ | 710 | /* Interrupt state */ |
546 | dev_priv->saveIER = I915_READ(IER); | 711 | if (IS_IGDNG(dev)) { |
547 | dev_priv->saveIMR = I915_READ(IMR); | 712 | dev_priv->saveDEIER = I915_READ(DEIER); |
713 | dev_priv->saveDEIMR = I915_READ(DEIMR); | ||
714 | dev_priv->saveGTIER = I915_READ(GTIER); | ||
715 | dev_priv->saveGTIMR = I915_READ(GTIMR); | ||
716 | dev_priv->saveFDI_RXA_IMR = I915_READ(FDI_RXA_IMR); | ||
717 | dev_priv->saveFDI_RXB_IMR = I915_READ(FDI_RXB_IMR); | ||
718 | } else { | ||
719 | dev_priv->saveIER = I915_READ(IER); | ||
720 | dev_priv->saveIMR = I915_READ(IMR); | ||
721 | } | ||
548 | 722 | ||
549 | /* Clock gating state */ | 723 | /* Clock gating state */ |
550 | dev_priv->saveD_STATE = I915_READ(D_STATE); | 724 | dev_priv->saveD_STATE = I915_READ(D_STATE); |
@@ -609,8 +783,17 @@ int i915_restore_state(struct drm_device *dev) | |||
609 | i915_restore_display(dev); | 783 | i915_restore_display(dev); |
610 | 784 | ||
611 | /* Interrupt state */ | 785 | /* Interrupt state */ |
612 | I915_WRITE (IER, dev_priv->saveIER); | 786 | if (IS_IGDNG(dev)) { |
613 | I915_WRITE (IMR, dev_priv->saveIMR); | 787 | I915_WRITE(DEIER, dev_priv->saveDEIER); |
788 | I915_WRITE(DEIMR, dev_priv->saveDEIMR); | ||
789 | I915_WRITE(GTIER, dev_priv->saveGTIER); | ||
790 | I915_WRITE(GTIMR, dev_priv->saveGTIMR); | ||
791 | I915_WRITE(FDI_RXA_IMR, dev_priv->saveFDI_RXA_IMR); | ||
792 | I915_WRITE(FDI_RXB_IMR, dev_priv->saveFDI_RXB_IMR); | ||
793 | } else { | ||
794 | I915_WRITE (IER, dev_priv->saveIER); | ||
795 | I915_WRITE (IMR, dev_priv->saveIMR); | ||
796 | } | ||
614 | 797 | ||
615 | /* Clock gating state */ | 798 | /* Clock gating state */ |
616 | I915_WRITE (D_STATE, dev_priv->saveD_STATE); | 799 | I915_WRITE (D_STATE, dev_priv->saveD_STATE); |
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c index 4337414846b6..96cd256e60e6 100644 --- a/drivers/gpu/drm/i915/intel_bios.c +++ b/drivers/gpu/drm/i915/intel_bios.c | |||
@@ -351,20 +351,18 @@ parse_driver_features(struct drm_i915_private *dev_priv, | |||
351 | struct drm_device *dev = dev_priv->dev; | 351 | struct drm_device *dev = dev_priv->dev; |
352 | struct bdb_driver_features *driver; | 352 | struct bdb_driver_features *driver; |
353 | 353 | ||
354 | /* set default for chips without eDP */ | ||
355 | if (!SUPPORTS_EDP(dev)) { | ||
356 | dev_priv->edp_support = 0; | ||
357 | return; | ||
358 | } | ||
359 | |||
360 | driver = find_section(bdb, BDB_DRIVER_FEATURES); | 354 | driver = find_section(bdb, BDB_DRIVER_FEATURES); |
361 | if (!driver) | 355 | if (!driver) |
362 | return; | 356 | return; |
363 | 357 | ||
364 | if (driver->lvds_config == BDB_DRIVER_FEATURE_EDP) | 358 | if (driver && SUPPORTS_EDP(dev) && |
359 | driver->lvds_config == BDB_DRIVER_FEATURE_EDP) { | ||
365 | dev_priv->edp_support = 1; | 360 | dev_priv->edp_support = 1; |
361 | } else { | ||
362 | dev_priv->edp_support = 0; | ||
363 | } | ||
366 | 364 | ||
367 | if (driver->dual_frequency) | 365 | if (driver && driver->dual_frequency) |
368 | dev_priv->render_reclock_avail = true; | 366 | dev_priv->render_reclock_avail = true; |
369 | } | 367 | } |
370 | 368 | ||
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3c14240cc002..3ba6546b7c7f 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -943,6 +943,7 @@ intel_find_pll_g4x_dp(const intel_limit_t *limit, struct drm_crtc *crtc, | |||
943 | clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2); | 943 | clock.m = 5 * (clock.m1 + 2) + (clock.m2 + 2); |
944 | clock.p = (clock.p1 * clock.p2); | 944 | clock.p = (clock.p1 * clock.p2); |
945 | clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p; | 945 | clock.dot = 96000 * clock.m / (clock.n + 2) / clock.p; |
946 | clock.vco = 0; | ||
946 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); | 947 | memcpy(best_clock, &clock, sizeof(intel_clock_t)); |
947 | return true; | 948 | return true; |
948 | } | 949 | } |
@@ -1260,9 +1261,11 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y, | |||
1260 | return ret; | 1261 | return ret; |
1261 | } | 1262 | } |
1262 | 1263 | ||
1263 | /* Pre-i965 needs to install a fence for tiled scan-out */ | 1264 | /* Install a fence for tiled scan-out. Pre-i965 always needs a fence, |
1264 | if (!IS_I965G(dev) && | 1265 | * whereas 965+ only requires a fence if using framebuffer compression. |
1265 | obj_priv->fence_reg == I915_FENCE_REG_NONE && | 1266 | * For simplicity, we always install a fence as the cost is not that onerous. |
1267 | */ | ||
1268 | if (obj_priv->fence_reg == I915_FENCE_REG_NONE && | ||
1266 | obj_priv->tiling_mode != I915_TILING_NONE) { | 1269 | obj_priv->tiling_mode != I915_TILING_NONE) { |
1267 | ret = i915_gem_object_get_fence_reg(obj); | 1270 | ret = i915_gem_object_get_fence_reg(obj); |
1268 | if (ret != 0) { | 1271 | if (ret != 0) { |
@@ -1513,7 +1516,7 @@ static void igdng_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1513 | /* Enable panel fitting for LVDS */ | 1516 | /* Enable panel fitting for LVDS */ |
1514 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { | 1517 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) { |
1515 | temp = I915_READ(pf_ctl_reg); | 1518 | temp = I915_READ(pf_ctl_reg); |
1516 | I915_WRITE(pf_ctl_reg, temp | PF_ENABLE); | 1519 | I915_WRITE(pf_ctl_reg, temp | PF_ENABLE | PF_FILTER_MED_3x3); |
1517 | 1520 | ||
1518 | /* currently full aspect */ | 1521 | /* currently full aspect */ |
1519 | I915_WRITE(pf_win_pos, 0); | 1522 | I915_WRITE(pf_win_pos, 0); |
@@ -1801,6 +1804,8 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1801 | case DRM_MODE_DPMS_ON: | 1804 | case DRM_MODE_DPMS_ON: |
1802 | case DRM_MODE_DPMS_STANDBY: | 1805 | case DRM_MODE_DPMS_STANDBY: |
1803 | case DRM_MODE_DPMS_SUSPEND: | 1806 | case DRM_MODE_DPMS_SUSPEND: |
1807 | intel_update_watermarks(dev); | ||
1808 | |||
1804 | /* Enable the DPLL */ | 1809 | /* Enable the DPLL */ |
1805 | temp = I915_READ(dpll_reg); | 1810 | temp = I915_READ(dpll_reg); |
1806 | if ((temp & DPLL_VCO_ENABLE) == 0) { | 1811 | if ((temp & DPLL_VCO_ENABLE) == 0) { |
@@ -1838,7 +1843,6 @@ static void i9xx_crtc_dpms(struct drm_crtc *crtc, int mode) | |||
1838 | 1843 | ||
1839 | /* Give the overlay scaler a chance to enable if it's on this pipe */ | 1844 | /* Give the overlay scaler a chance to enable if it's on this pipe */ |
1840 | //intel_crtc_dpms_video(crtc, true); TODO | 1845 | //intel_crtc_dpms_video(crtc, true); TODO |
1841 | intel_update_watermarks(dev); | ||
1842 | break; | 1846 | break; |
1843 | case DRM_MODE_DPMS_OFF: | 1847 | case DRM_MODE_DPMS_OFF: |
1844 | intel_update_watermarks(dev); | 1848 | intel_update_watermarks(dev); |
@@ -2082,7 +2086,7 @@ fdi_reduce_ratio(u32 *num, u32 *den) | |||
2082 | #define LINK_N 0x80000 | 2086 | #define LINK_N 0x80000 |
2083 | 2087 | ||
2084 | static void | 2088 | static void |
2085 | igdng_compute_m_n(int bytes_per_pixel, int nlanes, | 2089 | igdng_compute_m_n(int bits_per_pixel, int nlanes, |
2086 | int pixel_clock, int link_clock, | 2090 | int pixel_clock, int link_clock, |
2087 | struct fdi_m_n *m_n) | 2091 | struct fdi_m_n *m_n) |
2088 | { | 2092 | { |
@@ -2092,7 +2096,8 @@ igdng_compute_m_n(int bytes_per_pixel, int nlanes, | |||
2092 | 2096 | ||
2093 | temp = (u64) DATA_N * pixel_clock; | 2097 | temp = (u64) DATA_N * pixel_clock; |
2094 | temp = div_u64(temp, link_clock); | 2098 | temp = div_u64(temp, link_clock); |
2095 | m_n->gmch_m = div_u64(temp * bytes_per_pixel, nlanes); | 2099 | m_n->gmch_m = div_u64(temp * bits_per_pixel, nlanes); |
2100 | m_n->gmch_m >>= 3; /* convert to bytes_per_pixel */ | ||
2096 | m_n->gmch_n = DATA_N; | 2101 | m_n->gmch_n = DATA_N; |
2097 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); | 2102 | fdi_reduce_ratio(&m_n->gmch_m, &m_n->gmch_n); |
2098 | 2103 | ||
@@ -2140,6 +2145,13 @@ static struct intel_watermark_params igd_cursor_hplloff_wm = { | |||
2140 | IGD_CURSOR_GUARD_WM, | 2145 | IGD_CURSOR_GUARD_WM, |
2141 | IGD_FIFO_LINE_SIZE | 2146 | IGD_FIFO_LINE_SIZE |
2142 | }; | 2147 | }; |
2148 | static struct intel_watermark_params g4x_wm_info = { | ||
2149 | G4X_FIFO_SIZE, | ||
2150 | G4X_MAX_WM, | ||
2151 | G4X_MAX_WM, | ||
2152 | 2, | ||
2153 | G4X_FIFO_LINE_SIZE, | ||
2154 | }; | ||
2143 | static struct intel_watermark_params i945_wm_info = { | 2155 | static struct intel_watermark_params i945_wm_info = { |
2144 | I945_FIFO_SIZE, | 2156 | I945_FIFO_SIZE, |
2145 | I915_MAX_WM, | 2157 | I915_MAX_WM, |
@@ -2430,17 +2442,74 @@ static int i830_get_fifo_size(struct drm_device *dev, int plane) | |||
2430 | return size; | 2442 | return size; |
2431 | } | 2443 | } |
2432 | 2444 | ||
2433 | static void g4x_update_wm(struct drm_device *dev, int unused, int unused2, | 2445 | static void g4x_update_wm(struct drm_device *dev, int planea_clock, |
2434 | int unused3, int unused4) | 2446 | int planeb_clock, int sr_hdisplay, int pixel_size) |
2435 | { | 2447 | { |
2436 | struct drm_i915_private *dev_priv = dev->dev_private; | 2448 | struct drm_i915_private *dev_priv = dev->dev_private; |
2437 | u32 fw_blc_self = I915_READ(FW_BLC_SELF); | 2449 | int total_size, cacheline_size; |
2450 | int planea_wm, planeb_wm, cursora_wm, cursorb_wm, cursor_sr; | ||
2451 | struct intel_watermark_params planea_params, planeb_params; | ||
2452 | unsigned long line_time_us; | ||
2453 | int sr_clock, sr_entries = 0, entries_required; | ||
2438 | 2454 | ||
2439 | if (i915_powersave) | 2455 | /* Create copies of the base settings for each pipe */ |
2440 | fw_blc_self |= FW_BLC_SELF_EN; | 2456 | planea_params = planeb_params = g4x_wm_info; |
2441 | else | 2457 | |
2442 | fw_blc_self &= ~FW_BLC_SELF_EN; | 2458 | /* Grab a couple of global values before we overwrite them */ |
2443 | I915_WRITE(FW_BLC_SELF, fw_blc_self); | 2459 | total_size = planea_params.fifo_size; |
2460 | cacheline_size = planea_params.cacheline_size; | ||
2461 | |||
2462 | /* | ||
2463 | * Note: we need to make sure we don't overflow for various clock & | ||
2464 | * latency values. | ||
2465 | * clocks go from a few thousand to several hundred thousand. | ||
2466 | * latency is usually a few thousand | ||
2467 | */ | ||
2468 | entries_required = ((planea_clock / 1000) * pixel_size * latency_ns) / | ||
2469 | 1000; | ||
2470 | entries_required /= G4X_FIFO_LINE_SIZE; | ||
2471 | planea_wm = entries_required + planea_params.guard_size; | ||
2472 | |||
2473 | entries_required = ((planeb_clock / 1000) * pixel_size * latency_ns) / | ||
2474 | 1000; | ||
2475 | entries_required /= G4X_FIFO_LINE_SIZE; | ||
2476 | planeb_wm = entries_required + planeb_params.guard_size; | ||
2477 | |||
2478 | cursora_wm = cursorb_wm = 16; | ||
2479 | cursor_sr = 32; | ||
2480 | |||
2481 | DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm); | ||
2482 | |||
2483 | /* Calc sr entries for one plane configs */ | ||
2484 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { | ||
2485 | /* self-refresh has much higher latency */ | ||
2486 | const static int sr_latency_ns = 12000; | ||
2487 | |||
2488 | sr_clock = planea_clock ? planea_clock : planeb_clock; | ||
2489 | line_time_us = ((sr_hdisplay * 1000) / sr_clock); | ||
2490 | |||
2491 | /* Use ns/us then divide to preserve precision */ | ||
2492 | sr_entries = (((sr_latency_ns / line_time_us) + 1) * | ||
2493 | pixel_size * sr_hdisplay) / 1000; | ||
2494 | sr_entries = roundup(sr_entries / cacheline_size, 1); | ||
2495 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | ||
2496 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | ||
2497 | } | ||
2498 | |||
2499 | DRM_DEBUG("Setting FIFO watermarks - A: %d, B: %d, SR %d\n", | ||
2500 | planea_wm, planeb_wm, sr_entries); | ||
2501 | |||
2502 | planea_wm &= 0x3f; | ||
2503 | planeb_wm &= 0x3f; | ||
2504 | |||
2505 | I915_WRITE(DSPFW1, (sr_entries << DSPFW_SR_SHIFT) | | ||
2506 | (cursorb_wm << DSPFW_CURSORB_SHIFT) | | ||
2507 | (planeb_wm << DSPFW_PLANEB_SHIFT) | planea_wm); | ||
2508 | I915_WRITE(DSPFW2, (I915_READ(DSPFW2) & DSPFW_CURSORA_MASK) | | ||
2509 | (cursora_wm << DSPFW_CURSORA_SHIFT)); | ||
2510 | /* HPLL off in SR has some issues on G4x... disable it */ | ||
2511 | I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) | | ||
2512 | (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); | ||
2444 | } | 2513 | } |
2445 | 2514 | ||
2446 | static void i965_update_wm(struct drm_device *dev, int unused, int unused2, | 2515 | static void i965_update_wm(struct drm_device *dev, int unused, int unused2, |
@@ -2586,6 +2655,9 @@ static void intel_update_watermarks(struct drm_device *dev) | |||
2586 | unsigned long planea_clock = 0, planeb_clock = 0, sr_clock = 0; | 2655 | unsigned long planea_clock = 0, planeb_clock = 0, sr_clock = 0; |
2587 | int enabled = 0, pixel_size = 0; | 2656 | int enabled = 0, pixel_size = 0; |
2588 | 2657 | ||
2658 | if (!dev_priv->display.update_wm) | ||
2659 | return; | ||
2660 | |||
2589 | /* Get the clock config from both planes */ | 2661 | /* Get the clock config from both planes */ |
2590 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 2662 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
2591 | intel_crtc = to_intel_crtc(crtc); | 2663 | intel_crtc = to_intel_crtc(crtc); |
@@ -2763,7 +2835,7 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
2763 | 2835 | ||
2764 | /* FDI link */ | 2836 | /* FDI link */ |
2765 | if (IS_IGDNG(dev)) { | 2837 | if (IS_IGDNG(dev)) { |
2766 | int lane, link_bw; | 2838 | int lane, link_bw, bpp; |
2767 | /* eDP doesn't require FDI link, so just set DP M/N | 2839 | /* eDP doesn't require FDI link, so just set DP M/N |
2768 | according to current link config */ | 2840 | according to current link config */ |
2769 | if (is_edp) { | 2841 | if (is_edp) { |
@@ -2782,10 +2854,72 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
2782 | lane = 4; | 2854 | lane = 4; |
2783 | link_bw = 270000; | 2855 | link_bw = 270000; |
2784 | } | 2856 | } |
2785 | igdng_compute_m_n(3, lane, target_clock, | 2857 | |
2858 | /* determine panel color depth */ | ||
2859 | temp = I915_READ(pipeconf_reg); | ||
2860 | |||
2861 | switch (temp & PIPE_BPC_MASK) { | ||
2862 | case PIPE_8BPC: | ||
2863 | bpp = 24; | ||
2864 | break; | ||
2865 | case PIPE_10BPC: | ||
2866 | bpp = 30; | ||
2867 | break; | ||
2868 | case PIPE_6BPC: | ||
2869 | bpp = 18; | ||
2870 | break; | ||
2871 | case PIPE_12BPC: | ||
2872 | bpp = 36; | ||
2873 | break; | ||
2874 | default: | ||
2875 | DRM_ERROR("unknown pipe bpc value\n"); | ||
2876 | bpp = 24; | ||
2877 | } | ||
2878 | |||
2879 | igdng_compute_m_n(bpp, lane, target_clock, | ||
2786 | link_bw, &m_n); | 2880 | link_bw, &m_n); |
2787 | } | 2881 | } |
2788 | 2882 | ||
2883 | /* Ironlake: try to setup display ref clock before DPLL | ||
2884 | * enabling. This is only under driver's control after | ||
2885 | * PCH B stepping, previous chipset stepping should be | ||
2886 | * ignoring this setting. | ||
2887 | */ | ||
2888 | if (IS_IGDNG(dev)) { | ||
2889 | temp = I915_READ(PCH_DREF_CONTROL); | ||
2890 | /* Always enable nonspread source */ | ||
2891 | temp &= ~DREF_NONSPREAD_SOURCE_MASK; | ||
2892 | temp |= DREF_NONSPREAD_SOURCE_ENABLE; | ||
2893 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
2894 | POSTING_READ(PCH_DREF_CONTROL); | ||
2895 | |||
2896 | temp &= ~DREF_SSC_SOURCE_MASK; | ||
2897 | temp |= DREF_SSC_SOURCE_ENABLE; | ||
2898 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
2899 | POSTING_READ(PCH_DREF_CONTROL); | ||
2900 | |||
2901 | udelay(200); | ||
2902 | |||
2903 | if (is_edp) { | ||
2904 | if (dev_priv->lvds_use_ssc) { | ||
2905 | temp |= DREF_SSC1_ENABLE; | ||
2906 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
2907 | POSTING_READ(PCH_DREF_CONTROL); | ||
2908 | |||
2909 | udelay(200); | ||
2910 | |||
2911 | temp &= ~DREF_CPU_SOURCE_OUTPUT_MASK; | ||
2912 | temp |= DREF_CPU_SOURCE_OUTPUT_DOWNSPREAD; | ||
2913 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
2914 | POSTING_READ(PCH_DREF_CONTROL); | ||
2915 | } else { | ||
2916 | temp |= DREF_CPU_SOURCE_OUTPUT_NONSPREAD; | ||
2917 | I915_WRITE(PCH_DREF_CONTROL, temp); | ||
2918 | POSTING_READ(PCH_DREF_CONTROL); | ||
2919 | } | ||
2920 | } | ||
2921 | } | ||
2922 | |||
2789 | if (IS_IGD(dev)) { | 2923 | if (IS_IGD(dev)) { |
2790 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; | 2924 | fp = (1 << clock.n) << 16 | clock.m1 << 8 | clock.m2; |
2791 | if (has_reduced_clock) | 2925 | if (has_reduced_clock) |
@@ -2936,6 +3070,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, | |||
2936 | 3070 | ||
2937 | lvds = I915_READ(lvds_reg); | 3071 | lvds = I915_READ(lvds_reg); |
2938 | lvds |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP | LVDS_PIPEB_SELECT; | 3072 | lvds |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP | LVDS_PIPEB_SELECT; |
3073 | /* set the corresponsding LVDS_BORDER bit */ | ||
3074 | lvds |= dev_priv->lvds_border_bits; | ||
2939 | /* Set the B0-B3 data pairs corresponding to whether we're going to | 3075 | /* Set the B0-B3 data pairs corresponding to whether we're going to |
2940 | * set the DPLLs for dual-channel mode or not. | 3076 | * set the DPLLs for dual-channel mode or not. |
2941 | */ | 3077 | */ |
@@ -4124,7 +4260,9 @@ void intel_init_clock_gating(struct drm_device *dev) | |||
4124 | * Disable clock gating reported to work incorrectly according to the | 4260 | * Disable clock gating reported to work incorrectly according to the |
4125 | * specs, but enable as much else as we can. | 4261 | * specs, but enable as much else as we can. |
4126 | */ | 4262 | */ |
4127 | if (IS_G4X(dev)) { | 4263 | if (IS_IGDNG(dev)) { |
4264 | return; | ||
4265 | } else if (IS_G4X(dev)) { | ||
4128 | uint32_t dspclk_gate; | 4266 | uint32_t dspclk_gate; |
4129 | I915_WRITE(RENCLK_GATE_D1, 0); | 4267 | I915_WRITE(RENCLK_GATE_D1, 0); |
4130 | I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE | | 4268 | I915_WRITE(RENCLK_GATE_D2, VF_UNIT_CLOCK_GATE_DISABLE | |
@@ -4212,7 +4350,9 @@ static void intel_init_display(struct drm_device *dev) | |||
4212 | i830_get_display_clock_speed; | 4350 | i830_get_display_clock_speed; |
4213 | 4351 | ||
4214 | /* For FIFO watermark updates */ | 4352 | /* For FIFO watermark updates */ |
4215 | if (IS_G4X(dev)) | 4353 | if (IS_IGDNG(dev)) |
4354 | dev_priv->display.update_wm = NULL; | ||
4355 | else if (IS_G4X(dev)) | ||
4216 | dev_priv->display.update_wm = g4x_update_wm; | 4356 | dev_priv->display.update_wm = g4x_update_wm; |
4217 | else if (IS_I965G(dev)) | 4357 | else if (IS_I965G(dev)) |
4218 | dev_priv->display.update_wm = i965_update_wm; | 4358 | dev_priv->display.update_wm = i965_update_wm; |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index f4856a510476..d83447557f9b 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -400,7 +400,7 @@ intel_dp_i2c_init(struct intel_output *intel_output, const char *name) | |||
400 | { | 400 | { |
401 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; | 401 | struct intel_dp_priv *dp_priv = intel_output->dev_priv; |
402 | 402 | ||
403 | DRM_ERROR("i2c_init %s\n", name); | 403 | DRM_DEBUG_KMS("i2c_init %s\n", name); |
404 | dp_priv->algo.running = false; | 404 | dp_priv->algo.running = false; |
405 | dp_priv->algo.address = 0; | 405 | dp_priv->algo.address = 0; |
406 | dp_priv->algo.aux_ch = intel_dp_i2c_aux_ch; | 406 | dp_priv->algo.aux_ch = intel_dp_i2c_aux_ch; |
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 98ae3d73577e..05598ae10c4b 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
@@ -380,7 +380,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder, | |||
380 | adjusted_mode->crtc_vblank_start + vsync_pos; | 380 | adjusted_mode->crtc_vblank_start + vsync_pos; |
381 | /* keep the vsync width constant */ | 381 | /* keep the vsync width constant */ |
382 | adjusted_mode->crtc_vsync_end = | 382 | adjusted_mode->crtc_vsync_end = |
383 | adjusted_mode->crtc_vblank_start + vsync_width; | 383 | adjusted_mode->crtc_vsync_start + vsync_width; |
384 | border = 1; | 384 | border = 1; |
385 | break; | 385 | break; |
386 | case DRM_MODE_SCALE_ASPECT: | 386 | case DRM_MODE_SCALE_ASPECT: |
@@ -526,6 +526,14 @@ out: | |||
526 | lvds_priv->pfit_control = pfit_control; | 526 | lvds_priv->pfit_control = pfit_control; |
527 | lvds_priv->pfit_pgm_ratios = pfit_pgm_ratios; | 527 | lvds_priv->pfit_pgm_ratios = pfit_pgm_ratios; |
528 | /* | 528 | /* |
529 | * When there exists the border, it means that the LVDS_BORDR | ||
530 | * should be enabled. | ||
531 | */ | ||
532 | if (border) | ||
533 | dev_priv->lvds_border_bits |= LVDS_BORDER_ENABLE; | ||
534 | else | ||
535 | dev_priv->lvds_border_bits &= ~(LVDS_BORDER_ENABLE); | ||
536 | /* | ||
529 | * XXX: It would be nice to support lower refresh rates on the | 537 | * XXX: It would be nice to support lower refresh rates on the |
530 | * panels to reduce power consumption, and perhaps match the | 538 | * panels to reduce power consumption, and perhaps match the |
531 | * user's requested refresh rate. | 539 | * user's requested refresh rate. |
@@ -656,6 +664,15 @@ static int intel_lvds_get_modes(struct drm_connector *connector) | |||
656 | return 0; | 664 | return 0; |
657 | } | 665 | } |
658 | 666 | ||
667 | /* | ||
668 | * Lid events. Note the use of 'modeset_on_lid': | ||
669 | * - we set it on lid close, and reset it on open | ||
670 | * - we use it as a "only once" bit (ie we ignore | ||
671 | * duplicate events where it was already properly | ||
672 | * set/reset) | ||
673 | * - the suspend/resume paths will also set it to | ||
674 | * zero, since they restore the mode ("lid open"). | ||
675 | */ | ||
659 | static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | 676 | static int intel_lid_notify(struct notifier_block *nb, unsigned long val, |
660 | void *unused) | 677 | void *unused) |
661 | { | 678 | { |
@@ -663,13 +680,19 @@ static int intel_lid_notify(struct notifier_block *nb, unsigned long val, | |||
663 | container_of(nb, struct drm_i915_private, lid_notifier); | 680 | container_of(nb, struct drm_i915_private, lid_notifier); |
664 | struct drm_device *dev = dev_priv->dev; | 681 | struct drm_device *dev = dev_priv->dev; |
665 | 682 | ||
666 | if (acpi_lid_open() && !dev_priv->suspended) { | 683 | if (!acpi_lid_open()) { |
667 | mutex_lock(&dev->mode_config.mutex); | 684 | dev_priv->modeset_on_lid = 1; |
668 | drm_helper_resume_force_mode(dev); | 685 | return NOTIFY_OK; |
669 | mutex_unlock(&dev->mode_config.mutex); | ||
670 | } | 686 | } |
671 | 687 | ||
672 | drm_sysfs_hotplug_event(dev_priv->dev); | 688 | if (!dev_priv->modeset_on_lid) |
689 | return NOTIFY_OK; | ||
690 | |||
691 | dev_priv->modeset_on_lid = 0; | ||
692 | |||
693 | mutex_lock(&dev->mode_config.mutex); | ||
694 | drm_helper_resume_force_mode(dev); | ||
695 | mutex_unlock(&dev->mode_config.mutex); | ||
673 | 696 | ||
674 | return NOTIFY_OK; | 697 | return NOTIFY_OK; |
675 | } | 698 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 3d667031de6e..df988142e6b0 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -582,10 +582,9 @@ int radeon_device_init(struct radeon_device *rdev, | |||
582 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); | 582 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); |
583 | 583 | ||
584 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ | 584 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ |
585 | r = vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); | 585 | /* this will fail for cards that aren't VGA class devices, just |
586 | if (r) { | 586 | * ignore it */ |
587 | return -EINVAL; | 587 | vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); |
588 | } | ||
589 | 588 | ||
590 | r = radeon_init(rdev); | 589 | r = radeon_init(rdev); |
591 | if (r) | 590 | if (r) |
diff --git a/drivers/hwmon/dme1737.c b/drivers/hwmon/dme1737.c index 2c2cb1ec94c5..27d62574284f 100644 --- a/drivers/hwmon/dme1737.c +++ b/drivers/hwmon/dme1737.c | |||
@@ -572,7 +572,7 @@ static struct dme1737_data *dme1737_update_device(struct device *dev) | |||
572 | 572 | ||
573 | /* Sample register contents every 1 sec */ | 573 | /* Sample register contents every 1 sec */ |
574 | if (time_after(jiffies, data->last_update + HZ) || !data->valid) { | 574 | if (time_after(jiffies, data->last_update + HZ) || !data->valid) { |
575 | if (data->type != sch5027) { | 575 | if (data->type == dme1737) { |
576 | data->vid = dme1737_read(data, DME1737_REG_VID) & | 576 | data->vid = dme1737_read(data, DME1737_REG_VID) & |
577 | 0x3f; | 577 | 0x3f; |
578 | } | 578 | } |
@@ -1621,9 +1621,6 @@ static struct attribute *dme1737_misc_attr[] = { | |||
1621 | &sensor_dev_attr_zone1_auto_point1_temp_hyst.dev_attr.attr, | 1621 | &sensor_dev_attr_zone1_auto_point1_temp_hyst.dev_attr.attr, |
1622 | &sensor_dev_attr_zone2_auto_point1_temp_hyst.dev_attr.attr, | 1622 | &sensor_dev_attr_zone2_auto_point1_temp_hyst.dev_attr.attr, |
1623 | &sensor_dev_attr_zone3_auto_point1_temp_hyst.dev_attr.attr, | 1623 | &sensor_dev_attr_zone3_auto_point1_temp_hyst.dev_attr.attr, |
1624 | /* Misc */ | ||
1625 | &dev_attr_vrm.attr, | ||
1626 | &dev_attr_cpu0_vid.attr, | ||
1627 | NULL | 1624 | NULL |
1628 | }; | 1625 | }; |
1629 | 1626 | ||
@@ -1631,6 +1628,18 @@ static const struct attribute_group dme1737_misc_group = { | |||
1631 | .attrs = dme1737_misc_attr, | 1628 | .attrs = dme1737_misc_attr, |
1632 | }; | 1629 | }; |
1633 | 1630 | ||
1631 | /* The following struct holds VID-related attributes. Their creation | ||
1632 | depends on the chip type which is determined during module load. */ | ||
1633 | static struct attribute *dme1737_vid_attr[] = { | ||
1634 | &dev_attr_vrm.attr, | ||
1635 | &dev_attr_cpu0_vid.attr, | ||
1636 | NULL | ||
1637 | }; | ||
1638 | |||
1639 | static const struct attribute_group dme1737_vid_group = { | ||
1640 | .attrs = dme1737_vid_attr, | ||
1641 | }; | ||
1642 | |||
1634 | /* The following structs hold the PWM attributes, some of which are optional. | 1643 | /* The following structs hold the PWM attributes, some of which are optional. |
1635 | * Their creation depends on the chip configuration which is determined during | 1644 | * Their creation depends on the chip configuration which is determined during |
1636 | * module load. */ | 1645 | * module load. */ |
@@ -1902,6 +1911,9 @@ static void dme1737_remove_files(struct device *dev) | |||
1902 | if (data->type != sch5027) { | 1911 | if (data->type != sch5027) { |
1903 | sysfs_remove_group(&dev->kobj, &dme1737_misc_group); | 1912 | sysfs_remove_group(&dev->kobj, &dme1737_misc_group); |
1904 | } | 1913 | } |
1914 | if (data->type == dme1737) { | ||
1915 | sysfs_remove_group(&dev->kobj, &dme1737_vid_group); | ||
1916 | } | ||
1905 | 1917 | ||
1906 | sysfs_remove_group(&dev->kobj, &dme1737_group); | 1918 | sysfs_remove_group(&dev->kobj, &dme1737_group); |
1907 | 1919 | ||
@@ -1933,6 +1945,13 @@ static int dme1737_create_files(struct device *dev) | |||
1933 | goto exit_remove; | 1945 | goto exit_remove; |
1934 | } | 1946 | } |
1935 | 1947 | ||
1948 | /* Create VID-related sysfs attributes */ | ||
1949 | if ((data->type == dme1737) && | ||
1950 | (err = sysfs_create_group(&dev->kobj, | ||
1951 | &dme1737_vid_group))) { | ||
1952 | goto exit_remove; | ||
1953 | } | ||
1954 | |||
1936 | /* Create fan sysfs attributes */ | 1955 | /* Create fan sysfs attributes */ |
1937 | for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { | 1956 | for (ix = 0; ix < ARRAY_SIZE(dme1737_fan_group); ix++) { |
1938 | if (data->has_fan & (1 << ix)) { | 1957 | if (data->has_fan & (1 << ix)) { |
@@ -2127,7 +2146,7 @@ static int dme1737_init_device(struct device *dev) | |||
2127 | data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ | 2146 | data->pwm_acz[2] = 4; /* pwm3 -> zone3 */ |
2128 | 2147 | ||
2129 | /* Set VRM */ | 2148 | /* Set VRM */ |
2130 | if (data->type != sch5027) { | 2149 | if (data->type == dme1737) { |
2131 | data->vrm = vid_which_vrm(); | 2150 | data->vrm = vid_which_vrm(); |
2132 | } | 2151 | } |
2133 | 2152 | ||
diff --git a/drivers/hwmon/fschmd.c b/drivers/hwmon/fschmd.c index 2a7a85a6dc36..da1b1f9488af 100644 --- a/drivers/hwmon/fschmd.c +++ b/drivers/hwmon/fschmd.c | |||
@@ -819,7 +819,7 @@ static int watchdog_release(struct inode *inode, struct file *filp) | |||
819 | static ssize_t watchdog_write(struct file *filp, const char __user *buf, | 819 | static ssize_t watchdog_write(struct file *filp, const char __user *buf, |
820 | size_t count, loff_t *offset) | 820 | size_t count, loff_t *offset) |
821 | { | 821 | { |
822 | size_t ret; | 822 | int ret; |
823 | struct fschmd_data *data = filp->private_data; | 823 | struct fschmd_data *data = filp->private_data; |
824 | 824 | ||
825 | if (count) { | 825 | if (count) { |
diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c index 6679854c85b0..be475e844c2a 100644 --- a/drivers/hwmon/hp_accel.c +++ b/drivers/hwmon/hp_accel.c | |||
@@ -197,11 +197,13 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { | |||
197 | AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left), | 197 | AXIS_DMI_MATCH("HP2133", "HP 2133", xy_rotated_left), |
198 | AXIS_DMI_MATCH("HP2140", "HP 2140", xy_swap_inverted), | 198 | AXIS_DMI_MATCH("HP2140", "HP 2140", xy_swap_inverted), |
199 | AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd), | 199 | AXIS_DMI_MATCH("NC653x", "HP Compaq 653", xy_rotated_left_usd), |
200 | AXIS_DMI_MATCH("NC673x", "HP Compaq 673", xy_rotated_left_usd), | 200 | AXIS_DMI_MATCH("NC6730b", "HP Compaq 6730b", xy_rotated_left_usd), |
201 | AXIS_DMI_MATCH("NC6730s", "HP Compaq 6730s", xy_swap), | ||
201 | AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right), | 202 | AXIS_DMI_MATCH("NC651xx", "HP Compaq 651", xy_rotated_right), |
202 | AXIS_DMI_MATCH("NC6710x", "HP Compaq 6710", xy_swap_yz_inverted), | 203 | AXIS_DMI_MATCH("NC6710x", "HP Compaq 6710", xy_swap_yz_inverted), |
203 | AXIS_DMI_MATCH("NC6715x", "HP Compaq 6715", y_inverted), | 204 | AXIS_DMI_MATCH("NC6715x", "HP Compaq 6715", y_inverted), |
204 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 693", xy_rotated_right), | 205 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 693", xy_rotated_right), |
206 | AXIS_DMI_MATCH("NC693xx", "HP EliteBook 853", xy_swap), | ||
205 | /* Intel-based HP Pavilion dv5 */ | 207 | /* Intel-based HP Pavilion dv5 */ |
206 | AXIS_DMI_MATCH2("HPDV5_I", | 208 | AXIS_DMI_MATCH2("HPDV5_I", |
207 | PRODUCT_NAME, "HP Pavilion dv5", | 209 | PRODUCT_NAME, "HP Pavilion dv5", |
@@ -214,6 +216,7 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { | |||
214 | y_inverted), | 216 | y_inverted), |
215 | AXIS_DMI_MATCH("DV7", "HP Pavilion dv7", x_inverted), | 217 | AXIS_DMI_MATCH("DV7", "HP Pavilion dv7", x_inverted), |
216 | AXIS_DMI_MATCH("HP8710", "HP Compaq 8710", y_inverted), | 218 | AXIS_DMI_MATCH("HP8710", "HP Compaq 8710", y_inverted), |
219 | AXIS_DMI_MATCH("HDX18", "HP HDX 18", x_inverted), | ||
217 | { NULL, } | 220 | { NULL, } |
218 | /* Laptop models without axis info (yet): | 221 | /* Laptop models without axis info (yet): |
219 | * "NC6910" "HP Compaq 6910" | 222 | * "NC6910" "HP Compaq 6910" |
diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c index ffeb2a10e1a7..a3749cb0f181 100644 --- a/drivers/hwmon/it87.c +++ b/drivers/hwmon/it87.c | |||
@@ -1028,12 +1028,11 @@ static int __init it87_find(unsigned short *address, | |||
1028 | chip_type, *address, sio_data->revision); | 1028 | chip_type, *address, sio_data->revision); |
1029 | 1029 | ||
1030 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ | 1030 | /* Read GPIO config and VID value from LDN 7 (GPIO) */ |
1031 | if (chip_type != IT8705F_DEVID) { | 1031 | if (sio_data->type != it87) { |
1032 | int reg; | 1032 | int reg; |
1033 | 1033 | ||
1034 | superio_select(GPIO); | 1034 | superio_select(GPIO); |
1035 | if ((chip_type == it8718) || | 1035 | if (sio_data->type == it8718 || sio_data->type == it8720) |
1036 | (chip_type == it8720)) | ||
1037 | sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); | 1036 | sio_data->vid_value = superio_inb(IT87_SIO_VID_REG); |
1038 | 1037 | ||
1039 | reg = superio_inb(IT87_SIO_PINX2_REG); | 1038 | reg = superio_inb(IT87_SIO_PINX2_REG); |
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 4afba3ec2a61..e3654d683e15 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
@@ -120,19 +120,26 @@ struct imx_i2c_struct { | |||
120 | wait_queue_head_t queue; | 120 | wait_queue_head_t queue; |
121 | unsigned long i2csr; | 121 | unsigned long i2csr; |
122 | unsigned int disable_delay; | 122 | unsigned int disable_delay; |
123 | int stopped; | ||
124 | unsigned int ifdr; /* IMX_I2C_IFDR */ | ||
123 | }; | 125 | }; |
124 | 126 | ||
125 | /** Functions for IMX I2C adapter driver *************************************** | 127 | /** Functions for IMX I2C adapter driver *************************************** |
126 | *******************************************************************************/ | 128 | *******************************************************************************/ |
127 | 129 | ||
128 | static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx) | 130 | static int i2c_imx_bus_busy(struct imx_i2c_struct *i2c_imx, int for_busy) |
129 | { | 131 | { |
130 | unsigned long orig_jiffies = jiffies; | 132 | unsigned long orig_jiffies = jiffies; |
133 | unsigned int temp; | ||
131 | 134 | ||
132 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); | 135 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); |
133 | 136 | ||
134 | /* wait for bus not busy */ | 137 | while (1) { |
135 | while (readb(i2c_imx->base + IMX_I2C_I2SR) & I2SR_IBB) { | 138 | temp = readb(i2c_imx->base + IMX_I2C_I2SR); |
139 | if (for_busy && (temp & I2SR_IBB)) | ||
140 | break; | ||
141 | if (!for_busy && !(temp & I2SR_IBB)) | ||
142 | break; | ||
136 | if (signal_pending(current)) { | 143 | if (signal_pending(current)) { |
137 | dev_dbg(&i2c_imx->adapter.dev, | 144 | dev_dbg(&i2c_imx->adapter.dev, |
138 | "<%s> I2C Interrupted\n", __func__); | 145 | "<%s> I2C Interrupted\n", __func__); |
@@ -179,41 +186,62 @@ static int i2c_imx_acked(struct imx_i2c_struct *i2c_imx) | |||
179 | return 0; | 186 | return 0; |
180 | } | 187 | } |
181 | 188 | ||
182 | static void i2c_imx_start(struct imx_i2c_struct *i2c_imx) | 189 | static int i2c_imx_start(struct imx_i2c_struct *i2c_imx) |
183 | { | 190 | { |
184 | unsigned int temp = 0; | 191 | unsigned int temp = 0; |
192 | int result; | ||
185 | 193 | ||
186 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); | 194 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); |
187 | 195 | ||
196 | clk_enable(i2c_imx->clk); | ||
197 | writeb(i2c_imx->ifdr, i2c_imx->base + IMX_I2C_IFDR); | ||
188 | /* Enable I2C controller */ | 198 | /* Enable I2C controller */ |
199 | writeb(0, i2c_imx->base + IMX_I2C_I2SR); | ||
189 | writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR); | 200 | writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR); |
201 | |||
202 | /* Wait controller to be stable */ | ||
203 | udelay(50); | ||
204 | |||
190 | /* Start I2C transaction */ | 205 | /* Start I2C transaction */ |
191 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); | 206 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); |
192 | temp |= I2CR_MSTA; | 207 | temp |= I2CR_MSTA; |
193 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); | 208 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); |
209 | result = i2c_imx_bus_busy(i2c_imx, 1); | ||
210 | if (result) | ||
211 | return result; | ||
212 | i2c_imx->stopped = 0; | ||
213 | |||
194 | temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK; | 214 | temp |= I2CR_IIEN | I2CR_MTX | I2CR_TXAK; |
195 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); | 215 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); |
216 | return result; | ||
196 | } | 217 | } |
197 | 218 | ||
198 | static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx) | 219 | static void i2c_imx_stop(struct imx_i2c_struct *i2c_imx) |
199 | { | 220 | { |
200 | unsigned int temp = 0; | 221 | unsigned int temp = 0; |
201 | 222 | ||
202 | /* Stop I2C transaction */ | 223 | if (!i2c_imx->stopped) { |
203 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); | 224 | /* Stop I2C transaction */ |
204 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); | 225 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); |
205 | temp &= ~I2CR_MSTA; | 226 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); |
206 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); | 227 | temp &= ~(I2CR_MSTA | I2CR_MTX); |
207 | /* setup chip registers to defaults */ | 228 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); |
208 | writeb(I2CR_IEN, i2c_imx->base + IMX_I2C_I2CR); | 229 | i2c_imx->stopped = 1; |
209 | writeb(0, i2c_imx->base + IMX_I2C_I2SR); | 230 | } |
210 | /* | 231 | if (cpu_is_mx1()) { |
211 | * This delay caused by an i.MXL hardware bug. | 232 | /* |
212 | * If no (or too short) delay, no "STOP" bit will be generated. | 233 | * This delay caused by an i.MXL hardware bug. |
213 | */ | 234 | * If no (or too short) delay, no "STOP" bit will be generated. |
214 | udelay(i2c_imx->disable_delay); | 235 | */ |
236 | udelay(i2c_imx->disable_delay); | ||
237 | } | ||
238 | |||
239 | if (!i2c_imx->stopped) | ||
240 | i2c_imx_bus_busy(i2c_imx, 0); | ||
241 | |||
215 | /* Disable I2C controller */ | 242 | /* Disable I2C controller */ |
216 | writeb(0, i2c_imx->base + IMX_I2C_I2CR); | 243 | writeb(0, i2c_imx->base + IMX_I2C_I2CR); |
244 | clk_disable(i2c_imx->clk); | ||
217 | } | 245 | } |
218 | 246 | ||
219 | static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, | 247 | static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, |
@@ -233,8 +261,8 @@ static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, | |||
233 | else | 261 | else |
234 | for (i = 0; i2c_clk_div[i][0] < div; i++); | 262 | for (i = 0; i2c_clk_div[i][0] < div; i++); |
235 | 263 | ||
236 | /* Write divider value to register */ | 264 | /* Store divider value */ |
237 | writeb(i2c_clk_div[i][1], i2c_imx->base + IMX_I2C_IFDR); | 265 | i2c_imx->ifdr = i2c_clk_div[i][1]; |
238 | 266 | ||
239 | /* | 267 | /* |
240 | * There dummy delay is calculated. | 268 | * There dummy delay is calculated. |
@@ -341,11 +369,15 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs) | |||
341 | if (result) | 369 | if (result) |
342 | return result; | 370 | return result; |
343 | if (i == (msgs->len - 1)) { | 371 | if (i == (msgs->len - 1)) { |
372 | /* It must generate STOP before read I2DR to prevent | ||
373 | controller from generating another clock cycle */ | ||
344 | dev_dbg(&i2c_imx->adapter.dev, | 374 | dev_dbg(&i2c_imx->adapter.dev, |
345 | "<%s> clear MSTA\n", __func__); | 375 | "<%s> clear MSTA\n", __func__); |
346 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); | 376 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); |
347 | temp &= ~I2CR_MSTA; | 377 | temp &= ~(I2CR_MSTA | I2CR_MTX); |
348 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); | 378 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); |
379 | i2c_imx_bus_busy(i2c_imx, 0); | ||
380 | i2c_imx->stopped = 1; | ||
349 | } else if (i == (msgs->len - 2)) { | 381 | } else if (i == (msgs->len - 2)) { |
350 | dev_dbg(&i2c_imx->adapter.dev, | 382 | dev_dbg(&i2c_imx->adapter.dev, |
351 | "<%s> set TXAK\n", __func__); | 383 | "<%s> set TXAK\n", __func__); |
@@ -370,14 +402,11 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter, | |||
370 | 402 | ||
371 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); | 403 | dev_dbg(&i2c_imx->adapter.dev, "<%s>\n", __func__); |
372 | 404 | ||
373 | /* Check if i2c bus is not busy */ | 405 | /* Start I2C transfer */ |
374 | result = i2c_imx_bus_busy(i2c_imx); | 406 | result = i2c_imx_start(i2c_imx); |
375 | if (result) | 407 | if (result) |
376 | goto fail0; | 408 | goto fail0; |
377 | 409 | ||
378 | /* Start I2C transfer */ | ||
379 | i2c_imx_start(i2c_imx); | ||
380 | |||
381 | /* read/write data */ | 410 | /* read/write data */ |
382 | for (i = 0; i < num; i++) { | 411 | for (i = 0; i < num; i++) { |
383 | if (i) { | 412 | if (i) { |
@@ -386,6 +415,9 @@ static int i2c_imx_xfer(struct i2c_adapter *adapter, | |||
386 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); | 415 | temp = readb(i2c_imx->base + IMX_I2C_I2CR); |
387 | temp |= I2CR_RSTA; | 416 | temp |= I2CR_RSTA; |
388 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); | 417 | writeb(temp, i2c_imx->base + IMX_I2C_I2CR); |
418 | result = i2c_imx_bus_busy(i2c_imx, 1); | ||
419 | if (result) | ||
420 | goto fail0; | ||
389 | } | 421 | } |
390 | dev_dbg(&i2c_imx->adapter.dev, | 422 | dev_dbg(&i2c_imx->adapter.dev, |
391 | "<%s> transfer message: %d\n", __func__, i); | 423 | "<%s> transfer message: %d\n", __func__, i); |
@@ -500,7 +532,6 @@ static int __init i2c_imx_probe(struct platform_device *pdev) | |||
500 | dev_err(&pdev->dev, "can't get I2C clock\n"); | 532 | dev_err(&pdev->dev, "can't get I2C clock\n"); |
501 | goto fail3; | 533 | goto fail3; |
502 | } | 534 | } |
503 | clk_enable(i2c_imx->clk); | ||
504 | 535 | ||
505 | /* Request IRQ */ | 536 | /* Request IRQ */ |
506 | ret = request_irq(i2c_imx->irq, i2c_imx_isr, 0, pdev->name, i2c_imx); | 537 | ret = request_irq(i2c_imx->irq, i2c_imx_isr, 0, pdev->name, i2c_imx); |
@@ -549,7 +580,6 @@ static int __init i2c_imx_probe(struct platform_device *pdev) | |||
549 | fail5: | 580 | fail5: |
550 | free_irq(i2c_imx->irq, i2c_imx); | 581 | free_irq(i2c_imx->irq, i2c_imx); |
551 | fail4: | 582 | fail4: |
552 | clk_disable(i2c_imx->clk); | ||
553 | clk_put(i2c_imx->clk); | 583 | clk_put(i2c_imx->clk); |
554 | fail3: | 584 | fail3: |
555 | release_mem_region(i2c_imx->res->start, resource_size(res)); | 585 | release_mem_region(i2c_imx->res->start, resource_size(res)); |
@@ -586,8 +616,6 @@ static int __exit i2c_imx_remove(struct platform_device *pdev) | |||
586 | if (pdata && pdata->exit) | 616 | if (pdata && pdata->exit) |
587 | pdata->exit(&pdev->dev); | 617 | pdata->exit(&pdev->dev); |
588 | 618 | ||
589 | /* Disable I2C clock */ | ||
590 | clk_disable(i2c_imx->clk); | ||
591 | clk_put(i2c_imx->clk); | 619 | clk_put(i2c_imx->clk); |
592 | 620 | ||
593 | release_mem_region(i2c_imx->res->start, resource_size(i2c_imx->res)); | 621 | release_mem_region(i2c_imx->res->start, resource_size(i2c_imx->res)); |
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index d325e86e3103..f627001108b8 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
@@ -365,9 +365,6 @@ static int mpc_write(struct mpc_i2c *i2c, int target, | |||
365 | unsigned timeout = i2c->adap.timeout; | 365 | unsigned timeout = i2c->adap.timeout; |
366 | u32 flags = restart ? CCR_RSTA : 0; | 366 | u32 flags = restart ? CCR_RSTA : 0; |
367 | 367 | ||
368 | /* Start with MEN */ | ||
369 | if (!restart) | ||
370 | writeccr(i2c, CCR_MEN); | ||
371 | /* Start as master */ | 368 | /* Start as master */ |
372 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); | 369 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); |
373 | /* Write target byte */ | 370 | /* Write target byte */ |
@@ -396,9 +393,6 @@ static int mpc_read(struct mpc_i2c *i2c, int target, | |||
396 | int i, result; | 393 | int i, result; |
397 | u32 flags = restart ? CCR_RSTA : 0; | 394 | u32 flags = restart ? CCR_RSTA : 0; |
398 | 395 | ||
399 | /* Start with MEN */ | ||
400 | if (!restart) | ||
401 | writeccr(i2c, CCR_MEN); | ||
402 | /* Switch to read - restart */ | 396 | /* Switch to read - restart */ |
403 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); | 397 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX | flags); |
404 | /* Write target address byte - this time with the read flag set */ | 398 | /* Write target address byte - this time with the read flag set */ |
@@ -425,9 +419,9 @@ static int mpc_read(struct mpc_i2c *i2c, int target, | |||
425 | /* Generate txack on next to last byte */ | 419 | /* Generate txack on next to last byte */ |
426 | if (i == length - 2) | 420 | if (i == length - 2) |
427 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); | 421 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_TXAK); |
428 | /* Generate stop on last byte */ | 422 | /* Do not generate stop on last byte */ |
429 | if (i == length - 1) | 423 | if (i == length - 1) |
430 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_TXAK); | 424 | writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_MTX); |
431 | data[i] = readb(i2c->base + MPC_I2C_DR); | 425 | data[i] = readb(i2c->base + MPC_I2C_DR); |
432 | } | 426 | } |
433 | 427 | ||
diff --git a/drivers/ide/atiixp.c b/drivers/ide/atiixp.c index 6396c3ad3252..837322b10a4c 100644 --- a/drivers/ide/atiixp.c +++ b/drivers/ide/atiixp.c | |||
@@ -177,7 +177,7 @@ static const struct pci_device_id atiixp_pci_tbl[] = { | |||
177 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), 0 }, | 177 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP400_IDE), 0 }, |
178 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), 1 }, | 178 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP600_IDE), 1 }, |
179 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP700_IDE), 0 }, | 179 | { PCI_VDEVICE(ATI, PCI_DEVICE_ID_ATI_IXP700_IDE), 0 }, |
180 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_SB900_IDE), 0 }, | 180 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_HUDSON2_IDE), 0 }, |
181 | { 0, }, | 181 | { 0, }, |
182 | }; | 182 | }; |
183 | MODULE_DEVICE_TABLE(pci, atiixp_pci_tbl); | 183 | MODULE_DEVICE_TABLE(pci, atiixp_pci_tbl); |
diff --git a/drivers/ide/cmd64x.c b/drivers/ide/cmd64x.c index 680e5975217f..ca0c46f6580a 100644 --- a/drivers/ide/cmd64x.c +++ b/drivers/ide/cmd64x.c | |||
@@ -379,7 +379,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
379 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, | 379 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, |
380 | .port_ops = &cmd64x_port_ops, | 380 | .port_ops = &cmd64x_port_ops, |
381 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | | 381 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | |
382 | IDE_HFLAG_ABUSE_PREFETCH, | 382 | IDE_HFLAG_ABUSE_PREFETCH | |
383 | IDE_HFLAG_SERIALIZE, | ||
383 | .pio_mask = ATA_PIO5, | 384 | .pio_mask = ATA_PIO5, |
384 | .mwdma_mask = ATA_MWDMA2, | 385 | .mwdma_mask = ATA_MWDMA2, |
385 | .udma_mask = 0x00, /* no udma */ | 386 | .udma_mask = 0x00, /* no udma */ |
@@ -389,7 +390,8 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
389 | .init_chipset = init_chipset_cmd64x, | 390 | .init_chipset = init_chipset_cmd64x, |
390 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 391 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
391 | .port_ops = &cmd648_port_ops, | 392 | .port_ops = &cmd648_port_ops, |
392 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 393 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH | |
394 | IDE_HFLAG_SERIALIZE, | ||
393 | .pio_mask = ATA_PIO5, | 395 | .pio_mask = ATA_PIO5, |
394 | .mwdma_mask = ATA_MWDMA2, | 396 | .mwdma_mask = ATA_MWDMA2, |
395 | .udma_mask = ATA_UDMA2, | 397 | .udma_mask = ATA_UDMA2, |
diff --git a/drivers/input/input.c b/drivers/input/input.c index c6f88ebb40c7..cc763c96fada 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -782,10 +782,29 @@ static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait) | |||
782 | return 0; | 782 | return 0; |
783 | } | 783 | } |
784 | 784 | ||
785 | union input_seq_state { | ||
786 | struct { | ||
787 | unsigned short pos; | ||
788 | bool mutex_acquired; | ||
789 | }; | ||
790 | void *p; | ||
791 | }; | ||
792 | |||
785 | static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos) | 793 | static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos) |
786 | { | 794 | { |
787 | if (mutex_lock_interruptible(&input_mutex)) | 795 | union input_seq_state *state = (union input_seq_state *)&seq->private; |
788 | return NULL; | 796 | int error; |
797 | |||
798 | /* We need to fit into seq->private pointer */ | ||
799 | BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); | ||
800 | |||
801 | error = mutex_lock_interruptible(&input_mutex); | ||
802 | if (error) { | ||
803 | state->mutex_acquired = false; | ||
804 | return ERR_PTR(error); | ||
805 | } | ||
806 | |||
807 | state->mutex_acquired = true; | ||
789 | 808 | ||
790 | return seq_list_start(&input_dev_list, *pos); | 809 | return seq_list_start(&input_dev_list, *pos); |
791 | } | 810 | } |
@@ -795,9 +814,12 @@ static void *input_devices_seq_next(struct seq_file *seq, void *v, loff_t *pos) | |||
795 | return seq_list_next(v, &input_dev_list, pos); | 814 | return seq_list_next(v, &input_dev_list, pos); |
796 | } | 815 | } |
797 | 816 | ||
798 | static void input_devices_seq_stop(struct seq_file *seq, void *v) | 817 | static void input_seq_stop(struct seq_file *seq, void *v) |
799 | { | 818 | { |
800 | mutex_unlock(&input_mutex); | 819 | union input_seq_state *state = (union input_seq_state *)&seq->private; |
820 | |||
821 | if (state->mutex_acquired) | ||
822 | mutex_unlock(&input_mutex); | ||
801 | } | 823 | } |
802 | 824 | ||
803 | static void input_seq_print_bitmap(struct seq_file *seq, const char *name, | 825 | static void input_seq_print_bitmap(struct seq_file *seq, const char *name, |
@@ -861,7 +883,7 @@ static int input_devices_seq_show(struct seq_file *seq, void *v) | |||
861 | static const struct seq_operations input_devices_seq_ops = { | 883 | static const struct seq_operations input_devices_seq_ops = { |
862 | .start = input_devices_seq_start, | 884 | .start = input_devices_seq_start, |
863 | .next = input_devices_seq_next, | 885 | .next = input_devices_seq_next, |
864 | .stop = input_devices_seq_stop, | 886 | .stop = input_seq_stop, |
865 | .show = input_devices_seq_show, | 887 | .show = input_devices_seq_show, |
866 | }; | 888 | }; |
867 | 889 | ||
@@ -881,40 +903,49 @@ static const struct file_operations input_devices_fileops = { | |||
881 | 903 | ||
882 | static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos) | 904 | static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos) |
883 | { | 905 | { |
884 | if (mutex_lock_interruptible(&input_mutex)) | 906 | union input_seq_state *state = (union input_seq_state *)&seq->private; |
885 | return NULL; | 907 | int error; |
908 | |||
909 | /* We need to fit into seq->private pointer */ | ||
910 | BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private)); | ||
911 | |||
912 | error = mutex_lock_interruptible(&input_mutex); | ||
913 | if (error) { | ||
914 | state->mutex_acquired = false; | ||
915 | return ERR_PTR(error); | ||
916 | } | ||
917 | |||
918 | state->mutex_acquired = true; | ||
919 | state->pos = *pos; | ||
886 | 920 | ||
887 | seq->private = (void *)(unsigned long)*pos; | ||
888 | return seq_list_start(&input_handler_list, *pos); | 921 | return seq_list_start(&input_handler_list, *pos); |
889 | } | 922 | } |
890 | 923 | ||
891 | static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos) | 924 | static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos) |
892 | { | 925 | { |
893 | seq->private = (void *)(unsigned long)(*pos + 1); | 926 | union input_seq_state *state = (union input_seq_state *)&seq->private; |
894 | return seq_list_next(v, &input_handler_list, pos); | ||
895 | } | ||
896 | 927 | ||
897 | static void input_handlers_seq_stop(struct seq_file *seq, void *v) | 928 | state->pos = *pos + 1; |
898 | { | 929 | return seq_list_next(v, &input_handler_list, pos); |
899 | mutex_unlock(&input_mutex); | ||
900 | } | 930 | } |
901 | 931 | ||
902 | static int input_handlers_seq_show(struct seq_file *seq, void *v) | 932 | static int input_handlers_seq_show(struct seq_file *seq, void *v) |
903 | { | 933 | { |
904 | struct input_handler *handler = container_of(v, struct input_handler, node); | 934 | struct input_handler *handler = container_of(v, struct input_handler, node); |
935 | union input_seq_state *state = (union input_seq_state *)&seq->private; | ||
905 | 936 | ||
906 | seq_printf(seq, "N: Number=%ld Name=%s", | 937 | seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name); |
907 | (unsigned long)seq->private, handler->name); | ||
908 | if (handler->fops) | 938 | if (handler->fops) |
909 | seq_printf(seq, " Minor=%d", handler->minor); | 939 | seq_printf(seq, " Minor=%d", handler->minor); |
910 | seq_putc(seq, '\n'); | 940 | seq_putc(seq, '\n'); |
911 | 941 | ||
912 | return 0; | 942 | return 0; |
913 | } | 943 | } |
944 | |||
914 | static const struct seq_operations input_handlers_seq_ops = { | 945 | static const struct seq_operations input_handlers_seq_ops = { |
915 | .start = input_handlers_seq_start, | 946 | .start = input_handlers_seq_start, |
916 | .next = input_handlers_seq_next, | 947 | .next = input_handlers_seq_next, |
917 | .stop = input_handlers_seq_stop, | 948 | .stop = input_seq_stop, |
918 | .show = input_handlers_seq_show, | 949 | .show = input_handlers_seq_show, |
919 | }; | 950 | }; |
920 | 951 | ||
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 4709e15af607..4452eabbee6d 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -233,6 +233,7 @@ struct atkbd { | |||
233 | */ | 233 | */ |
234 | static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); | 234 | static void (*atkbd_platform_fixup)(struct atkbd *, const void *data); |
235 | static void *atkbd_platform_fixup_data; | 235 | static void *atkbd_platform_fixup_data; |
236 | static unsigned int (*atkbd_platform_scancode_fixup)(struct atkbd *, unsigned int); | ||
236 | 237 | ||
237 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, | 238 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, |
238 | ssize_t (*handler)(struct atkbd *, char *)); | 239 | ssize_t (*handler)(struct atkbd *, char *)); |
@@ -393,6 +394,9 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data, | |||
393 | 394 | ||
394 | input_event(dev, EV_MSC, MSC_RAW, code); | 395 | input_event(dev, EV_MSC, MSC_RAW, code); |
395 | 396 | ||
397 | if (atkbd_platform_scancode_fixup) | ||
398 | code = atkbd_platform_scancode_fixup(atkbd, code); | ||
399 | |||
396 | if (atkbd->translated) { | 400 | if (atkbd->translated) { |
397 | 401 | ||
398 | if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { | 402 | if (atkbd->emul || atkbd_need_xlate(atkbd->xl_bit, code)) { |
@@ -574,11 +578,22 @@ static void atkbd_event_work(struct work_struct *work) | |||
574 | 578 | ||
575 | mutex_lock(&atkbd->event_mutex); | 579 | mutex_lock(&atkbd->event_mutex); |
576 | 580 | ||
577 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) | 581 | if (!atkbd->enabled) { |
578 | atkbd_set_leds(atkbd); | 582 | /* |
583 | * Serio ports are resumed asynchronously so while driver core | ||
584 | * thinks that device is already fully operational in reality | ||
585 | * it may not be ready yet. In this case we need to keep | ||
586 | * rescheduling till reconnect completes. | ||
587 | */ | ||
588 | schedule_delayed_work(&atkbd->event_work, | ||
589 | msecs_to_jiffies(100)); | ||
590 | } else { | ||
591 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) | ||
592 | atkbd_set_leds(atkbd); | ||
579 | 593 | ||
580 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) | 594 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) |
581 | atkbd_set_repeat_rate(atkbd); | 595 | atkbd_set_repeat_rate(atkbd); |
596 | } | ||
582 | 597 | ||
583 | mutex_unlock(&atkbd->event_mutex); | 598 | mutex_unlock(&atkbd->event_mutex); |
584 | } | 599 | } |
@@ -770,6 +785,30 @@ static int atkbd_select_set(struct atkbd *atkbd, int target_set, int allow_extra | |||
770 | return 3; | 785 | return 3; |
771 | } | 786 | } |
772 | 787 | ||
788 | static int atkbd_reset_state(struct atkbd *atkbd) | ||
789 | { | ||
790 | struct ps2dev *ps2dev = &atkbd->ps2dev; | ||
791 | unsigned char param[1]; | ||
792 | |||
793 | /* | ||
794 | * Set the LEDs to a predefined state (all off). | ||
795 | */ | ||
796 | |||
797 | param[0] = 0; | ||
798 | if (ps2_command(ps2dev, param, ATKBD_CMD_SETLEDS)) | ||
799 | return -1; | ||
800 | |||
801 | /* | ||
802 | * Set autorepeat to fastest possible. | ||
803 | */ | ||
804 | |||
805 | param[0] = 0; | ||
806 | if (ps2_command(ps2dev, param, ATKBD_CMD_SETREP)) | ||
807 | return -1; | ||
808 | |||
809 | return 0; | ||
810 | } | ||
811 | |||
773 | static int atkbd_activate(struct atkbd *atkbd) | 812 | static int atkbd_activate(struct atkbd *atkbd) |
774 | { | 813 | { |
775 | struct ps2dev *ps2dev = &atkbd->ps2dev; | 814 | struct ps2dev *ps2dev = &atkbd->ps2dev; |
@@ -852,29 +891,6 @@ static unsigned int atkbd_hp_forced_release_keys[] = { | |||
852 | }; | 891 | }; |
853 | 892 | ||
854 | /* | 893 | /* |
855 | * Inventec system with broken key release on volume keys | ||
856 | */ | ||
857 | static unsigned int atkbd_inventec_forced_release_keys[] = { | ||
858 | 0xae, 0xb0, -1U | ||
859 | }; | ||
860 | |||
861 | /* | ||
862 | * Perform fixup for HP Pavilion ZV6100 laptop that doesn't generate release | ||
863 | * for its volume buttons | ||
864 | */ | ||
865 | static unsigned int atkbd_hp_zv6100_forced_release_keys[] = { | ||
866 | 0xae, 0xb0, -1U | ||
867 | }; | ||
868 | |||
869 | /* | ||
870 | * Perform fixup for HP (Compaq) Presario R4000 R4100 R4200 that don't generate | ||
871 | * release for their volume buttons | ||
872 | */ | ||
873 | static unsigned int atkbd_hp_r4000_forced_release_keys[] = { | ||
874 | 0xae, 0xb0, -1U | ||
875 | }; | ||
876 | |||
877 | /* | ||
878 | * Samsung NC10,NC20 with Fn+F? key release not working | 894 | * Samsung NC10,NC20 with Fn+F? key release not working |
879 | */ | 895 | */ |
880 | static unsigned int atkbd_samsung_forced_release_keys[] = { | 896 | static unsigned int atkbd_samsung_forced_release_keys[] = { |
@@ -882,14 +898,6 @@ static unsigned int atkbd_samsung_forced_release_keys[] = { | |||
882 | }; | 898 | }; |
883 | 899 | ||
884 | /* | 900 | /* |
885 | * The volume up and volume down special keys on a Fujitsu Amilo PA 1510 laptop | ||
886 | * do not generate release events so we have to do it ourselves. | ||
887 | */ | ||
888 | static unsigned int atkbd_amilo_pa1510_forced_release_keys[] = { | ||
889 | 0xb0, 0xae, -1U | ||
890 | }; | ||
891 | |||
892 | /* | ||
893 | * Amilo Pi 3525 key release for Fn+Volume keys not working | 901 | * Amilo Pi 3525 key release for Fn+Volume keys not working |
894 | */ | 902 | */ |
895 | static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = { | 903 | static unsigned int atkbd_amilo_pi3525_forced_release_keys[] = { |
@@ -911,6 +919,30 @@ static unsigned int atkdb_soltech_ta12_forced_release_keys[] = { | |||
911 | }; | 919 | }; |
912 | 920 | ||
913 | /* | 921 | /* |
922 | * Many notebooks don't send key release event for volume up/down | ||
923 | * keys, with key list below common among them | ||
924 | */ | ||
925 | static unsigned int atkbd_volume_forced_release_keys[] = { | ||
926 | 0xae, 0xb0, -1U | ||
927 | }; | ||
928 | |||
929 | /* | ||
930 | * OQO 01+ multimedia keys (64--66) generate e0 6x upon release whereas | ||
931 | * they should be generating e4-e6 (0x80 | code). | ||
932 | */ | ||
933 | static unsigned int atkbd_oqo_01plus_scancode_fixup(struct atkbd *atkbd, | ||
934 | unsigned int code) | ||
935 | { | ||
936 | if (atkbd->translated && atkbd->emul == 1 && | ||
937 | (code == 0x64 || code == 0x65 || code == 0x66)) { | ||
938 | atkbd->emul = 0; | ||
939 | code |= 0x80; | ||
940 | } | ||
941 | |||
942 | return code; | ||
943 | } | ||
944 | |||
945 | /* | ||
914 | * atkbd_set_keycode_table() initializes keyboard's keycode table | 946 | * atkbd_set_keycode_table() initializes keyboard's keycode table |
915 | * according to the selected scancode set | 947 | * according to the selected scancode set |
916 | */ | 948 | */ |
@@ -1087,6 +1119,7 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) | |||
1087 | } | 1119 | } |
1088 | 1120 | ||
1089 | atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); | 1121 | atkbd->set = atkbd_select_set(atkbd, atkbd_set, atkbd_extra); |
1122 | atkbd_reset_state(atkbd); | ||
1090 | atkbd_activate(atkbd); | 1123 | atkbd_activate(atkbd); |
1091 | 1124 | ||
1092 | } else { | 1125 | } else { |
@@ -1267,6 +1300,7 @@ static ssize_t atkbd_set_extra(struct atkbd *atkbd, const char *buf, size_t coun | |||
1267 | 1300 | ||
1268 | atkbd->dev = new_dev; | 1301 | atkbd->dev = new_dev; |
1269 | atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); | 1302 | atkbd->set = atkbd_select_set(atkbd, atkbd->set, value); |
1303 | atkbd_reset_state(atkbd); | ||
1270 | atkbd_activate(atkbd); | 1304 | atkbd_activate(atkbd); |
1271 | atkbd_set_keycode_table(atkbd); | 1305 | atkbd_set_keycode_table(atkbd); |
1272 | atkbd_set_device_attrs(atkbd); | 1306 | atkbd_set_device_attrs(atkbd); |
@@ -1513,6 +1547,13 @@ static int __init atkbd_setup_forced_release(const struct dmi_system_id *id) | |||
1513 | return 0; | 1547 | return 0; |
1514 | } | 1548 | } |
1515 | 1549 | ||
1550 | static int __init atkbd_setup_scancode_fixup(const struct dmi_system_id *id) | ||
1551 | { | ||
1552 | atkbd_platform_scancode_fixup = id->driver_data; | ||
1553 | |||
1554 | return 0; | ||
1555 | } | ||
1556 | |||
1516 | static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | 1557 | static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { |
1517 | { | 1558 | { |
1518 | .ident = "Dell Laptop", | 1559 | .ident = "Dell Laptop", |
@@ -1548,7 +1589,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1548 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), | 1589 | DMI_MATCH(DMI_PRODUCT_NAME, "Pavilion ZV6100"), |
1549 | }, | 1590 | }, |
1550 | .callback = atkbd_setup_forced_release, | 1591 | .callback = atkbd_setup_forced_release, |
1551 | .driver_data = atkbd_hp_zv6100_forced_release_keys, | 1592 | .driver_data = atkbd_volume_forced_release_keys, |
1552 | }, | 1593 | }, |
1553 | { | 1594 | { |
1554 | .ident = "HP Presario R4000", | 1595 | .ident = "HP Presario R4000", |
@@ -1557,7 +1598,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1557 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), | 1598 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4000"), |
1558 | }, | 1599 | }, |
1559 | .callback = atkbd_setup_forced_release, | 1600 | .callback = atkbd_setup_forced_release, |
1560 | .driver_data = atkbd_hp_r4000_forced_release_keys, | 1601 | .driver_data = atkbd_volume_forced_release_keys, |
1561 | }, | 1602 | }, |
1562 | { | 1603 | { |
1563 | .ident = "HP Presario R4100", | 1604 | .ident = "HP Presario R4100", |
@@ -1566,7 +1607,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1566 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), | 1607 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4100"), |
1567 | }, | 1608 | }, |
1568 | .callback = atkbd_setup_forced_release, | 1609 | .callback = atkbd_setup_forced_release, |
1569 | .driver_data = atkbd_hp_r4000_forced_release_keys, | 1610 | .driver_data = atkbd_volume_forced_release_keys, |
1570 | }, | 1611 | }, |
1571 | { | 1612 | { |
1572 | .ident = "HP Presario R4200", | 1613 | .ident = "HP Presario R4200", |
@@ -1575,7 +1616,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1575 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), | 1616 | DMI_MATCH(DMI_PRODUCT_NAME, "Presario R4200"), |
1576 | }, | 1617 | }, |
1577 | .callback = atkbd_setup_forced_release, | 1618 | .callback = atkbd_setup_forced_release, |
1578 | .driver_data = atkbd_hp_r4000_forced_release_keys, | 1619 | .driver_data = atkbd_volume_forced_release_keys, |
1579 | }, | 1620 | }, |
1580 | { | 1621 | { |
1581 | .ident = "Inventec Symphony", | 1622 | .ident = "Inventec Symphony", |
@@ -1584,7 +1625,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1584 | DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), | 1625 | DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"), |
1585 | }, | 1626 | }, |
1586 | .callback = atkbd_setup_forced_release, | 1627 | .callback = atkbd_setup_forced_release, |
1587 | .driver_data = atkbd_inventec_forced_release_keys, | 1628 | .driver_data = atkbd_volume_forced_release_keys, |
1588 | }, | 1629 | }, |
1589 | { | 1630 | { |
1590 | .ident = "Samsung NC10", | 1631 | .ident = "Samsung NC10", |
@@ -1620,7 +1661,7 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1620 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), | 1661 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 1510"), |
1621 | }, | 1662 | }, |
1622 | .callback = atkbd_setup_forced_release, | 1663 | .callback = atkbd_setup_forced_release, |
1623 | .driver_data = atkbd_amilo_pa1510_forced_release_keys, | 1664 | .driver_data = atkbd_volume_forced_release_keys, |
1624 | }, | 1665 | }, |
1625 | { | 1666 | { |
1626 | .ident = "Fujitsu Amilo Pi 3525", | 1667 | .ident = "Fujitsu Amilo Pi 3525", |
@@ -1649,6 +1690,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = { | |||
1649 | .callback = atkbd_setup_forced_release, | 1690 | .callback = atkbd_setup_forced_release, |
1650 | .driver_data = atkdb_soltech_ta12_forced_release_keys, | 1691 | .driver_data = atkdb_soltech_ta12_forced_release_keys, |
1651 | }, | 1692 | }, |
1693 | { | ||
1694 | .ident = "OQO Model 01+", | ||
1695 | .matches = { | ||
1696 | DMI_MATCH(DMI_SYS_VENDOR, "OQO"), | ||
1697 | DMI_MATCH(DMI_PRODUCT_NAME, "ZEPTO"), | ||
1698 | }, | ||
1699 | .callback = atkbd_setup_scancode_fixup, | ||
1700 | .driver_data = atkbd_oqo_01plus_scancode_fixup, | ||
1701 | }, | ||
1652 | { } | 1702 | { } |
1653 | }; | 1703 | }; |
1654 | 1704 | ||
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c index a88aff3816a0..77d130914259 100644 --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c | |||
@@ -147,6 +147,7 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev) | |||
147 | } | 147 | } |
148 | 148 | ||
149 | error = request_irq(irq, gpio_keys_isr, | 149 | error = request_irq(irq, gpio_keys_isr, |
150 | IRQF_SHARED | | ||
150 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 151 | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
151 | button->desc ? button->desc : "gpio_keys", | 152 | button->desc ? button->desc : "gpio_keys", |
152 | bdata); | 153 | bdata); |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 02f4f8f1db6f..a9bb2544b2de 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -227,6 +227,7 @@ config INPUT_WINBOND_CIR | |||
227 | depends on X86 && PNP | 227 | depends on X86 && PNP |
228 | select NEW_LEDS | 228 | select NEW_LEDS |
229 | select LEDS_CLASS | 229 | select LEDS_CLASS |
230 | select LEDS_TRIGGERS | ||
230 | select BITREVERSE | 231 | select BITREVERSE |
231 | help | 232 | help |
232 | Say Y here if you want to use the IR remote functionality found | 233 | Say Y here if you want to use the IR remote functionality found |
diff --git a/drivers/input/misc/hp_sdc_rtc.c b/drivers/input/misc/hp_sdc_rtc.c index 216a559f55ea..ea821b546969 100644 --- a/drivers/input/misc/hp_sdc_rtc.c +++ b/drivers/input/misc/hp_sdc_rtc.c | |||
@@ -209,7 +209,7 @@ static inline int hp_sdc_rtc_read_rt(struct timeval *res) { | |||
209 | 209 | ||
210 | /* Read the i8042 fast handshake timer */ | 210 | /* Read the i8042 fast handshake timer */ |
211 | static inline int hp_sdc_rtc_read_fhs(struct timeval *res) { | 211 | static inline int hp_sdc_rtc_read_fhs(struct timeval *res) { |
212 | uint64_t raw; | 212 | int64_t raw; |
213 | unsigned int tenms; | 213 | unsigned int tenms; |
214 | 214 | ||
215 | raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_FHS, 2); | 215 | raw = hp_sdc_rtc_read_i8042timer(HP_SDC_CMD_LOAD_FHS, 2); |
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index de745d751162..ab5dc5f5fd83 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
@@ -219,7 +219,7 @@ static const struct ps2pp_info *get_model_info(unsigned char model) | |||
219 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | | 219 | PS2PP_WHEEL | PS2PP_SIDE_BTN | PS2PP_TASK_BTN | |
220 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, | 220 | PS2PP_EXTRA_BTN | PS2PP_NAV_BTN | PS2PP_HWHEEL }, |
221 | { 72, PS2PP_KIND_TRACKMAN, 0 }, /* T-CH11: TrackMan Marble */ | 221 | { 72, PS2PP_KIND_TRACKMAN, 0 }, /* T-CH11: TrackMan Marble */ |
222 | { 73, 0, PS2PP_SIDE_BTN }, | 222 | { 73, PS2PP_KIND_TRACKMAN, PS2PP_SIDE_BTN }, /* TrackMan FX */ |
223 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 223 | { 75, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
224 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, | 224 | { 76, PS2PP_KIND_WHEEL, PS2PP_WHEEL }, |
225 | { 79, PS2PP_KIND_TRACKMAN, PS2PP_WHEEL }, /* TrackMan with wheel */ | 225 | { 79, PS2PP_KIND_TRACKMAN, PS2PP_WHEEL }, /* TrackMan with wheel */ |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index b66ff1ac7dea..f4a61252bcc9 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -652,6 +652,16 @@ static const struct dmi_system_id toshiba_dmi_table[] = { | |||
652 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | 652 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
653 | DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), | 653 | DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"), |
654 | }, | 654 | }, |
655 | |||
656 | }, | ||
657 | { | ||
658 | .ident = "Toshiba Portege M300", | ||
659 | .matches = { | ||
660 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
661 | DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"), | ||
662 | DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"), | ||
663 | }, | ||
664 | |||
655 | }, | 665 | }, |
656 | { } | 666 | { } |
657 | }; | 667 | }; |
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index a39bc4eb902b..a537925f7651 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -327,6 +327,17 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
327 | }, | 327 | }, |
328 | }, | 328 | }, |
329 | { | 329 | { |
330 | /* | ||
331 | * Reset and GET ID commands issued via KBD port are | ||
332 | * sometimes being delivered to AUX3. | ||
333 | */ | ||
334 | .ident = "Sony Vaio FZ-240E", | ||
335 | .matches = { | ||
336 | DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), | ||
337 | DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ240E"), | ||
338 | }, | ||
339 | }, | ||
340 | { | ||
330 | .ident = "Amoi M636/A737", | 341 | .ident = "Amoi M636/A737", |
331 | .matches = { | 342 | .matches = { |
332 | DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), | 343 | DMI_MATCH(DMI_SYS_VENDOR, "Amoi Electronics CO.,LTD."), |
@@ -661,7 +672,7 @@ static void i8042_pnp_exit(void) | |||
661 | static int __init i8042_pnp_init(void) | 672 | static int __init i8042_pnp_init(void) |
662 | { | 673 | { |
663 | char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; | 674 | char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; |
664 | int pnp_data_busted = false; | 675 | bool pnp_data_busted = false; |
665 | int err; | 676 | int err; |
666 | 677 | ||
667 | #ifdef CONFIG_X86 | 678 | #ifdef CONFIG_X86 |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index a31578170ccc..1df02d25aca5 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -836,17 +836,32 @@ static int i8042_controller_selftest(void) | |||
836 | static int i8042_controller_init(void) | 836 | static int i8042_controller_init(void) |
837 | { | 837 | { |
838 | unsigned long flags; | 838 | unsigned long flags; |
839 | int n = 0; | ||
840 | unsigned char ctr[2]; | ||
839 | 841 | ||
840 | /* | 842 | /* |
841 | * Save the CTR for restoral on unload / reboot. | 843 | * Save the CTR for restore on unload / reboot. |
842 | */ | 844 | */ |
843 | 845 | ||
844 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_RCTR)) { | 846 | do { |
845 | printk(KERN_ERR "i8042.c: Can't read CTR while initializing i8042.\n"); | 847 | if (n >= 10) { |
846 | return -EIO; | 848 | printk(KERN_ERR |
847 | } | 849 | "i8042.c: Unable to get stable CTR read.\n"); |
850 | return -EIO; | ||
851 | } | ||
852 | |||
853 | if (n != 0) | ||
854 | udelay(50); | ||
855 | |||
856 | if (i8042_command(&ctr[n++ % 2], I8042_CMD_CTL_RCTR)) { | ||
857 | printk(KERN_ERR | ||
858 | "i8042.c: Can't read CTR while initializing i8042.\n"); | ||
859 | return -EIO; | ||
860 | } | ||
848 | 861 | ||
849 | i8042_initial_ctr = i8042_ctr; | 862 | } while (n < 2 || ctr[0] != ctr[1]); |
863 | |||
864 | i8042_initial_ctr = i8042_ctr = ctr[0]; | ||
850 | 865 | ||
851 | /* | 866 | /* |
852 | * Disable the keyboard interface and interrupt. | 867 | * Disable the keyboard interface and interrupt. |
@@ -895,6 +910,12 @@ static int i8042_controller_init(void) | |||
895 | return -EIO; | 910 | return -EIO; |
896 | } | 911 | } |
897 | 912 | ||
913 | /* | ||
914 | * Flush whatever accumulated while we were disabling keyboard port. | ||
915 | */ | ||
916 | |||
917 | i8042_flush(); | ||
918 | |||
898 | return 0; | 919 | return 0; |
899 | } | 920 | } |
900 | 921 | ||
@@ -914,7 +935,7 @@ static void i8042_controller_reset(void) | |||
914 | i8042_ctr |= I8042_CTR_KBDDIS | I8042_CTR_AUXDIS; | 935 | i8042_ctr |= I8042_CTR_KBDDIS | I8042_CTR_AUXDIS; |
915 | i8042_ctr &= ~(I8042_CTR_KBDINT | I8042_CTR_AUXINT); | 936 | i8042_ctr &= ~(I8042_CTR_KBDINT | I8042_CTR_AUXINT); |
916 | 937 | ||
917 | if (i8042_command(&i8042_initial_ctr, I8042_CMD_CTL_WCTR)) | 938 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) |
918 | printk(KERN_WARNING "i8042.c: Can't write CTR while resetting.\n"); | 939 | printk(KERN_WARNING "i8042.c: Can't write CTR while resetting.\n"); |
919 | 940 | ||
920 | /* | 941 | /* |
diff --git a/drivers/isdn/i4l/isdn_net.h b/drivers/isdn/i4l/isdn_net.h index 74032d0881ef..7511f08effa5 100644 --- a/drivers/isdn/i4l/isdn_net.h +++ b/drivers/isdn/i4l/isdn_net.h | |||
@@ -83,19 +83,19 @@ static __inline__ isdn_net_local * isdn_net_get_locked_lp(isdn_net_dev *nd) | |||
83 | 83 | ||
84 | spin_lock_irqsave(&nd->queue_lock, flags); | 84 | spin_lock_irqsave(&nd->queue_lock, flags); |
85 | lp = nd->queue; /* get lp on top of queue */ | 85 | lp = nd->queue; /* get lp on top of queue */ |
86 | spin_lock(&nd->queue->xmit_lock); | ||
87 | while (isdn_net_lp_busy(nd->queue)) { | 86 | while (isdn_net_lp_busy(nd->queue)) { |
88 | spin_unlock(&nd->queue->xmit_lock); | ||
89 | nd->queue = nd->queue->next; | 87 | nd->queue = nd->queue->next; |
90 | if (nd->queue == lp) { /* not found -- should never happen */ | 88 | if (nd->queue == lp) { /* not found -- should never happen */ |
91 | lp = NULL; | 89 | lp = NULL; |
92 | goto errout; | 90 | goto errout; |
93 | } | 91 | } |
94 | spin_lock(&nd->queue->xmit_lock); | ||
95 | } | 92 | } |
96 | lp = nd->queue; | 93 | lp = nd->queue; |
97 | nd->queue = nd->queue->next; | 94 | nd->queue = nd->queue->next; |
95 | spin_unlock_irqrestore(&nd->queue_lock, flags); | ||
96 | spin_lock(&lp->xmit_lock); | ||
98 | local_bh_disable(); | 97 | local_bh_disable(); |
98 | return lp; | ||
99 | errout: | 99 | errout: |
100 | spin_unlock_irqrestore(&nd->queue_lock, flags); | 100 | spin_unlock_irqrestore(&nd->queue_lock, flags); |
101 | return lp; | 101 | return lp; |
diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 1dc4185bd781..e355e7f6a536 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile | |||
@@ -46,7 +46,7 @@ obj-$(CONFIG_DM_LOG_USERSPACE) += dm-log-userspace.o | |||
46 | obj-$(CONFIG_DM_ZERO) += dm-zero.o | 46 | obj-$(CONFIG_DM_ZERO) += dm-zero.o |
47 | 47 | ||
48 | quiet_cmd_unroll = UNROLL $@ | 48 | quiet_cmd_unroll = UNROLL $@ |
49 | cmd_unroll = $(PERL) $(srctree)/$(src)/unroll.pl $(UNROLL) \ | 49 | cmd_unroll = $(AWK) -f$(srctree)/$(src)/unroll.awk -vN=$(UNROLL) \ |
50 | < $< > $@ || ( rm -f $@ && exit 1 ) | 50 | < $< > $@ || ( rm -f $@ && exit 1 ) |
51 | 51 | ||
52 | ifeq ($(CONFIG_ALTIVEC),y) | 52 | ifeq ($(CONFIG_ALTIVEC),y) |
@@ -59,56 +59,56 @@ endif | |||
59 | 59 | ||
60 | targets += raid6int1.c | 60 | targets += raid6int1.c |
61 | $(obj)/raid6int1.c: UNROLL := 1 | 61 | $(obj)/raid6int1.c: UNROLL := 1 |
62 | $(obj)/raid6int1.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 62 | $(obj)/raid6int1.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
63 | $(call if_changed,unroll) | 63 | $(call if_changed,unroll) |
64 | 64 | ||
65 | targets += raid6int2.c | 65 | targets += raid6int2.c |
66 | $(obj)/raid6int2.c: UNROLL := 2 | 66 | $(obj)/raid6int2.c: UNROLL := 2 |
67 | $(obj)/raid6int2.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 67 | $(obj)/raid6int2.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
68 | $(call if_changed,unroll) | 68 | $(call if_changed,unroll) |
69 | 69 | ||
70 | targets += raid6int4.c | 70 | targets += raid6int4.c |
71 | $(obj)/raid6int4.c: UNROLL := 4 | 71 | $(obj)/raid6int4.c: UNROLL := 4 |
72 | $(obj)/raid6int4.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 72 | $(obj)/raid6int4.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
73 | $(call if_changed,unroll) | 73 | $(call if_changed,unroll) |
74 | 74 | ||
75 | targets += raid6int8.c | 75 | targets += raid6int8.c |
76 | $(obj)/raid6int8.c: UNROLL := 8 | 76 | $(obj)/raid6int8.c: UNROLL := 8 |
77 | $(obj)/raid6int8.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 77 | $(obj)/raid6int8.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
78 | $(call if_changed,unroll) | 78 | $(call if_changed,unroll) |
79 | 79 | ||
80 | targets += raid6int16.c | 80 | targets += raid6int16.c |
81 | $(obj)/raid6int16.c: UNROLL := 16 | 81 | $(obj)/raid6int16.c: UNROLL := 16 |
82 | $(obj)/raid6int16.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 82 | $(obj)/raid6int16.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
83 | $(call if_changed,unroll) | 83 | $(call if_changed,unroll) |
84 | 84 | ||
85 | targets += raid6int32.c | 85 | targets += raid6int32.c |
86 | $(obj)/raid6int32.c: UNROLL := 32 | 86 | $(obj)/raid6int32.c: UNROLL := 32 |
87 | $(obj)/raid6int32.c: $(src)/raid6int.uc $(src)/unroll.pl FORCE | 87 | $(obj)/raid6int32.c: $(src)/raid6int.uc $(src)/unroll.awk FORCE |
88 | $(call if_changed,unroll) | 88 | $(call if_changed,unroll) |
89 | 89 | ||
90 | CFLAGS_raid6altivec1.o += $(altivec_flags) | 90 | CFLAGS_raid6altivec1.o += $(altivec_flags) |
91 | targets += raid6altivec1.c | 91 | targets += raid6altivec1.c |
92 | $(obj)/raid6altivec1.c: UNROLL := 1 | 92 | $(obj)/raid6altivec1.c: UNROLL := 1 |
93 | $(obj)/raid6altivec1.c: $(src)/raid6altivec.uc $(src)/unroll.pl FORCE | 93 | $(obj)/raid6altivec1.c: $(src)/raid6altivec.uc $(src)/unroll.awk FORCE |
94 | $(call if_changed,unroll) | 94 | $(call if_changed,unroll) |
95 | 95 | ||
96 | CFLAGS_raid6altivec2.o += $(altivec_flags) | 96 | CFLAGS_raid6altivec2.o += $(altivec_flags) |
97 | targets += raid6altivec2.c | 97 | targets += raid6altivec2.c |
98 | $(obj)/raid6altivec2.c: UNROLL := 2 | 98 | $(obj)/raid6altivec2.c: UNROLL := 2 |
99 | $(obj)/raid6altivec2.c: $(src)/raid6altivec.uc $(src)/unroll.pl FORCE | 99 | $(obj)/raid6altivec2.c: $(src)/raid6altivec.uc $(src)/unroll.awk FORCE |
100 | $(call if_changed,unroll) | 100 | $(call if_changed,unroll) |
101 | 101 | ||
102 | CFLAGS_raid6altivec4.o += $(altivec_flags) | 102 | CFLAGS_raid6altivec4.o += $(altivec_flags) |
103 | targets += raid6altivec4.c | 103 | targets += raid6altivec4.c |
104 | $(obj)/raid6altivec4.c: UNROLL := 4 | 104 | $(obj)/raid6altivec4.c: UNROLL := 4 |
105 | $(obj)/raid6altivec4.c: $(src)/raid6altivec.uc $(src)/unroll.pl FORCE | 105 | $(obj)/raid6altivec4.c: $(src)/raid6altivec.uc $(src)/unroll.awk FORCE |
106 | $(call if_changed,unroll) | 106 | $(call if_changed,unroll) |
107 | 107 | ||
108 | CFLAGS_raid6altivec8.o += $(altivec_flags) | 108 | CFLAGS_raid6altivec8.o += $(altivec_flags) |
109 | targets += raid6altivec8.c | 109 | targets += raid6altivec8.c |
110 | $(obj)/raid6altivec8.c: UNROLL := 8 | 110 | $(obj)/raid6altivec8.c: UNROLL := 8 |
111 | $(obj)/raid6altivec8.c: $(src)/raid6altivec.uc $(src)/unroll.pl FORCE | 111 | $(obj)/raid6altivec8.c: $(src)/raid6altivec.uc $(src)/unroll.awk FORCE |
112 | $(call if_changed,unroll) | 112 | $(call if_changed,unroll) |
113 | 113 | ||
114 | quiet_cmd_mktable = TABLE $@ | 114 | quiet_cmd_mktable = TABLE $@ |
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index 6986b0059d23..60e2b322db11 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c | |||
@@ -1624,10 +1624,11 @@ int bitmap_create(mddev_t *mddev) | |||
1624 | bitmap->offset = mddev->bitmap_offset; | 1624 | bitmap->offset = mddev->bitmap_offset; |
1625 | if (file) { | 1625 | if (file) { |
1626 | get_file(file); | 1626 | get_file(file); |
1627 | do_sync_mapping_range(file->f_mapping, 0, LLONG_MAX, | 1627 | /* As future accesses to this file will use bmap, |
1628 | SYNC_FILE_RANGE_WAIT_BEFORE | | 1628 | * and bypass the page cache, we must sync the file |
1629 | SYNC_FILE_RANGE_WRITE | | 1629 | * first. |
1630 | SYNC_FILE_RANGE_WAIT_AFTER); | 1630 | */ |
1631 | vfs_fsync(file, file->f_dentry, 1); | ||
1631 | } | 1632 | } |
1632 | /* read superblock from bitmap file (this sets bitmap->chunksize) */ | 1633 | /* read superblock from bitmap file (this sets bitmap->chunksize) */ |
1633 | err = bitmap_read_sb(bitmap); | 1634 | err = bitmap_read_sb(bitmap); |
diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c index 556acff3952f..7dbe652efb5a 100644 --- a/drivers/md/dm-exception-store.c +++ b/drivers/md/dm-exception-store.c | |||
@@ -138,16 +138,6 @@ int dm_exception_store_type_unregister(struct dm_exception_store_type *type) | |||
138 | } | 138 | } |
139 | EXPORT_SYMBOL(dm_exception_store_type_unregister); | 139 | EXPORT_SYMBOL(dm_exception_store_type_unregister); |
140 | 140 | ||
141 | /* | ||
142 | * Round a number up to the nearest 'size' boundary. size must | ||
143 | * be a power of 2. | ||
144 | */ | ||
145 | static ulong round_up(ulong n, ulong size) | ||
146 | { | ||
147 | size--; | ||
148 | return (n + size) & ~size; | ||
149 | } | ||
150 | |||
151 | static int set_chunk_size(struct dm_exception_store *store, | 141 | static int set_chunk_size(struct dm_exception_store *store, |
152 | const char *chunk_size_arg, char **error) | 142 | const char *chunk_size_arg, char **error) |
153 | { | 143 | { |
@@ -155,7 +145,8 @@ static int set_chunk_size(struct dm_exception_store *store, | |||
155 | char *value; | 145 | char *value; |
156 | 146 | ||
157 | chunk_size_ulong = simple_strtoul(chunk_size_arg, &value, 10); | 147 | chunk_size_ulong = simple_strtoul(chunk_size_arg, &value, 10); |
158 | if (*chunk_size_arg == '\0' || *value != '\0') { | 148 | if (*chunk_size_arg == '\0' || *value != '\0' || |
149 | chunk_size_ulong > UINT_MAX) { | ||
159 | *error = "Invalid chunk size"; | 150 | *error = "Invalid chunk size"; |
160 | return -EINVAL; | 151 | return -EINVAL; |
161 | } | 152 | } |
@@ -165,40 +156,35 @@ static int set_chunk_size(struct dm_exception_store *store, | |||
165 | return 0; | 156 | return 0; |
166 | } | 157 | } |
167 | 158 | ||
168 | /* | 159 | return dm_exception_store_set_chunk_size(store, |
169 | * Chunk size must be multiple of page size. Silently | 160 | (unsigned) chunk_size_ulong, |
170 | * round up if it's not. | ||
171 | */ | ||
172 | chunk_size_ulong = round_up(chunk_size_ulong, PAGE_SIZE >> 9); | ||
173 | |||
174 | return dm_exception_store_set_chunk_size(store, chunk_size_ulong, | ||
175 | error); | 161 | error); |
176 | } | 162 | } |
177 | 163 | ||
178 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, | 164 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, |
179 | unsigned long chunk_size_ulong, | 165 | unsigned chunk_size, |
180 | char **error) | 166 | char **error) |
181 | { | 167 | { |
182 | /* Check chunk_size is a power of 2 */ | 168 | /* Check chunk_size is a power of 2 */ |
183 | if (!is_power_of_2(chunk_size_ulong)) { | 169 | if (!is_power_of_2(chunk_size)) { |
184 | *error = "Chunk size is not a power of 2"; | 170 | *error = "Chunk size is not a power of 2"; |
185 | return -EINVAL; | 171 | return -EINVAL; |
186 | } | 172 | } |
187 | 173 | ||
188 | /* Validate the chunk size against the device block size */ | 174 | /* Validate the chunk size against the device block size */ |
189 | if (chunk_size_ulong % (bdev_logical_block_size(store->cow->bdev) >> 9)) { | 175 | if (chunk_size % (bdev_logical_block_size(store->cow->bdev) >> 9)) { |
190 | *error = "Chunk size is not a multiple of device blocksize"; | 176 | *error = "Chunk size is not a multiple of device blocksize"; |
191 | return -EINVAL; | 177 | return -EINVAL; |
192 | } | 178 | } |
193 | 179 | ||
194 | if (chunk_size_ulong > INT_MAX >> SECTOR_SHIFT) { | 180 | if (chunk_size > INT_MAX >> SECTOR_SHIFT) { |
195 | *error = "Chunk size is too high"; | 181 | *error = "Chunk size is too high"; |
196 | return -EINVAL; | 182 | return -EINVAL; |
197 | } | 183 | } |
198 | 184 | ||
199 | store->chunk_size = chunk_size_ulong; | 185 | store->chunk_size = chunk_size; |
200 | store->chunk_mask = chunk_size_ulong - 1; | 186 | store->chunk_mask = chunk_size - 1; |
201 | store->chunk_shift = ffs(chunk_size_ulong) - 1; | 187 | store->chunk_shift = ffs(chunk_size) - 1; |
202 | 188 | ||
203 | return 0; | 189 | return 0; |
204 | } | 190 | } |
@@ -251,7 +237,7 @@ int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | |||
251 | 237 | ||
252 | r = set_chunk_size(tmp_store, argv[2], &ti->error); | 238 | r = set_chunk_size(tmp_store, argv[2], &ti->error); |
253 | if (r) | 239 | if (r) |
254 | goto bad_cow; | 240 | goto bad_ctr; |
255 | 241 | ||
256 | r = type->ctr(tmp_store, 0, NULL); | 242 | r = type->ctr(tmp_store, 0, NULL); |
257 | if (r) { | 243 | if (r) { |
diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h index 812c71872ba0..8a223a48802c 100644 --- a/drivers/md/dm-exception-store.h +++ b/drivers/md/dm-exception-store.h | |||
@@ -101,9 +101,9 @@ struct dm_exception_store { | |||
101 | struct dm_dev *cow; | 101 | struct dm_dev *cow; |
102 | 102 | ||
103 | /* Size of data blocks saved - must be a power of 2 */ | 103 | /* Size of data blocks saved - must be a power of 2 */ |
104 | chunk_t chunk_size; | 104 | unsigned chunk_size; |
105 | chunk_t chunk_mask; | 105 | unsigned chunk_mask; |
106 | chunk_t chunk_shift; | 106 | unsigned chunk_shift; |
107 | 107 | ||
108 | void *context; | 108 | void *context; |
109 | }; | 109 | }; |
@@ -169,7 +169,7 @@ int dm_exception_store_type_register(struct dm_exception_store_type *type); | |||
169 | int dm_exception_store_type_unregister(struct dm_exception_store_type *type); | 169 | int dm_exception_store_type_unregister(struct dm_exception_store_type *type); |
170 | 170 | ||
171 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, | 171 | int dm_exception_store_set_chunk_size(struct dm_exception_store *store, |
172 | unsigned long chunk_size_ulong, | 172 | unsigned chunk_size, |
173 | char **error); | 173 | char **error); |
174 | 174 | ||
175 | int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, | 175 | int dm_exception_store_create(struct dm_target *ti, int argc, char **argv, |
diff --git a/drivers/md/dm-log-userspace-base.c b/drivers/md/dm-log-userspace-base.c index 652bd33109e3..7ac2c1450d10 100644 --- a/drivers/md/dm-log-userspace-base.c +++ b/drivers/md/dm-log-userspace-base.c | |||
@@ -156,7 +156,7 @@ static int userspace_ctr(struct dm_dirty_log *log, struct dm_target *ti, | |||
156 | } | 156 | } |
157 | 157 | ||
158 | /* The ptr value is sufficient for local unique id */ | 158 | /* The ptr value is sufficient for local unique id */ |
159 | lc->luid = (uint64_t)lc; | 159 | lc->luid = (unsigned long)lc; |
160 | 160 | ||
161 | lc->ti = ti; | 161 | lc->ti = ti; |
162 | 162 | ||
diff --git a/drivers/md/dm-snap-persistent.c b/drivers/md/dm-snap-persistent.c index d5b2e08750d5..0c746420c008 100644 --- a/drivers/md/dm-snap-persistent.c +++ b/drivers/md/dm-snap-persistent.c | |||
@@ -284,12 +284,13 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
284 | { | 284 | { |
285 | int r; | 285 | int r; |
286 | struct disk_header *dh; | 286 | struct disk_header *dh; |
287 | chunk_t chunk_size; | 287 | unsigned chunk_size; |
288 | int chunk_size_supplied = 1; | 288 | int chunk_size_supplied = 1; |
289 | char *chunk_err; | 289 | char *chunk_err; |
290 | 290 | ||
291 | /* | 291 | /* |
292 | * Use default chunk size (or hardsect_size, if larger) if none supplied | 292 | * Use default chunk size (or logical_block_size, if larger) |
293 | * if none supplied | ||
293 | */ | 294 | */ |
294 | if (!ps->store->chunk_size) { | 295 | if (!ps->store->chunk_size) { |
295 | ps->store->chunk_size = max(DM_CHUNK_SIZE_DEFAULT_SECTORS, | 296 | ps->store->chunk_size = max(DM_CHUNK_SIZE_DEFAULT_SECTORS, |
@@ -334,10 +335,9 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
334 | return 0; | 335 | return 0; |
335 | 336 | ||
336 | if (chunk_size_supplied) | 337 | if (chunk_size_supplied) |
337 | DMWARN("chunk size %llu in device metadata overrides " | 338 | DMWARN("chunk size %u in device metadata overrides " |
338 | "table chunk size of %llu.", | 339 | "table chunk size of %u.", |
339 | (unsigned long long)chunk_size, | 340 | chunk_size, ps->store->chunk_size); |
340 | (unsigned long long)ps->store->chunk_size); | ||
341 | 341 | ||
342 | /* We had a bogus chunk_size. Fix stuff up. */ | 342 | /* We had a bogus chunk_size. Fix stuff up. */ |
343 | free_area(ps); | 343 | free_area(ps); |
@@ -345,8 +345,8 @@ static int read_header(struct pstore *ps, int *new_snapshot) | |||
345 | r = dm_exception_store_set_chunk_size(ps->store, chunk_size, | 345 | r = dm_exception_store_set_chunk_size(ps->store, chunk_size, |
346 | &chunk_err); | 346 | &chunk_err); |
347 | if (r) { | 347 | if (r) { |
348 | DMERR("invalid on-disk chunk size %llu: %s.", | 348 | DMERR("invalid on-disk chunk size %u: %s.", |
349 | (unsigned long long)chunk_size, chunk_err); | 349 | chunk_size, chunk_err); |
350 | return r; | 350 | return r; |
351 | } | 351 | } |
352 | 352 | ||
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 57f1bf7f3b7a..3a3ba46e6d4b 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -296,6 +296,7 @@ static void __insert_origin(struct origin *o) | |||
296 | */ | 296 | */ |
297 | static int register_snapshot(struct dm_snapshot *snap) | 297 | static int register_snapshot(struct dm_snapshot *snap) |
298 | { | 298 | { |
299 | struct dm_snapshot *l; | ||
299 | struct origin *o, *new_o; | 300 | struct origin *o, *new_o; |
300 | struct block_device *bdev = snap->origin->bdev; | 301 | struct block_device *bdev = snap->origin->bdev; |
301 | 302 | ||
@@ -319,7 +320,11 @@ static int register_snapshot(struct dm_snapshot *snap) | |||
319 | __insert_origin(o); | 320 | __insert_origin(o); |
320 | } | 321 | } |
321 | 322 | ||
322 | list_add_tail(&snap->list, &o->snapshots); | 323 | /* Sort the list according to chunk size, largest-first smallest-last */ |
324 | list_for_each_entry(l, &o->snapshots, list) | ||
325 | if (l->store->chunk_size < snap->store->chunk_size) | ||
326 | break; | ||
327 | list_add_tail(&snap->list, &l->list); | ||
323 | 328 | ||
324 | up_write(&_origins_lock); | 329 | up_write(&_origins_lock); |
325 | return 0; | 330 | return 0; |
@@ -668,6 +673,11 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
668 | bio_list_init(&s->queued_bios); | 673 | bio_list_init(&s->queued_bios); |
669 | INIT_WORK(&s->queued_bios_work, flush_queued_bios); | 674 | INIT_WORK(&s->queued_bios_work, flush_queued_bios); |
670 | 675 | ||
676 | if (!s->store->chunk_size) { | ||
677 | ti->error = "Chunk size not set"; | ||
678 | goto bad_load_and_register; | ||
679 | } | ||
680 | |||
671 | /* Add snapshot to the list of snapshots for this origin */ | 681 | /* Add snapshot to the list of snapshots for this origin */ |
672 | /* Exceptions aren't triggered till snapshot_resume() is called */ | 682 | /* Exceptions aren't triggered till snapshot_resume() is called */ |
673 | if (register_snapshot(s)) { | 683 | if (register_snapshot(s)) { |
@@ -951,7 +961,7 @@ static void start_copy(struct dm_snap_pending_exception *pe) | |||
951 | 961 | ||
952 | src.bdev = bdev; | 962 | src.bdev = bdev; |
953 | src.sector = chunk_to_sector(s->store, pe->e.old_chunk); | 963 | src.sector = chunk_to_sector(s->store, pe->e.old_chunk); |
954 | src.count = min(s->store->chunk_size, dev_size - src.sector); | 964 | src.count = min((sector_t)s->store->chunk_size, dev_size - src.sector); |
955 | 965 | ||
956 | dest.bdev = s->store->cow->bdev; | 966 | dest.bdev = s->store->cow->bdev; |
957 | dest.sector = chunk_to_sector(s->store, pe->e.new_chunk); | 967 | dest.sector = chunk_to_sector(s->store, pe->e.new_chunk); |
@@ -1142,6 +1152,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, | |||
1142 | unsigned sz = 0; | 1152 | unsigned sz = 0; |
1143 | struct dm_snapshot *snap = ti->private; | 1153 | struct dm_snapshot *snap = ti->private; |
1144 | 1154 | ||
1155 | down_write(&snap->lock); | ||
1156 | |||
1145 | switch (type) { | 1157 | switch (type) { |
1146 | case STATUSTYPE_INFO: | 1158 | case STATUSTYPE_INFO: |
1147 | if (!snap->valid) | 1159 | if (!snap->valid) |
@@ -1173,6 +1185,8 @@ static int snapshot_status(struct dm_target *ti, status_type_t type, | |||
1173 | break; | 1185 | break; |
1174 | } | 1186 | } |
1175 | 1187 | ||
1188 | up_write(&snap->lock); | ||
1189 | |||
1176 | return 0; | 1190 | return 0; |
1177 | } | 1191 | } |
1178 | 1192 | ||
@@ -1388,7 +1402,7 @@ static void origin_resume(struct dm_target *ti) | |||
1388 | struct dm_dev *dev = ti->private; | 1402 | struct dm_dev *dev = ti->private; |
1389 | struct dm_snapshot *snap; | 1403 | struct dm_snapshot *snap; |
1390 | struct origin *o; | 1404 | struct origin *o; |
1391 | chunk_t chunk_size = 0; | 1405 | unsigned chunk_size = 0; |
1392 | 1406 | ||
1393 | down_read(&_origins_lock); | 1407 | down_read(&_origins_lock); |
1394 | o = __lookup_origin(dev->bdev); | 1408 | o = __lookup_origin(dev->bdev); |
@@ -1465,7 +1479,7 @@ static int __init dm_snapshot_init(void) | |||
1465 | r = dm_register_target(&snapshot_target); | 1479 | r = dm_register_target(&snapshot_target); |
1466 | if (r) { | 1480 | if (r) { |
1467 | DMERR("snapshot target register failed %d", r); | 1481 | DMERR("snapshot target register failed %d", r); |
1468 | return r; | 1482 | goto bad_register_snapshot_target; |
1469 | } | 1483 | } |
1470 | 1484 | ||
1471 | r = dm_register_target(&origin_target); | 1485 | r = dm_register_target(&origin_target); |
@@ -1522,6 +1536,9 @@ bad2: | |||
1522 | dm_unregister_target(&origin_target); | 1536 | dm_unregister_target(&origin_target); |
1523 | bad1: | 1537 | bad1: |
1524 | dm_unregister_target(&snapshot_target); | 1538 | dm_unregister_target(&snapshot_target); |
1539 | |||
1540 | bad_register_snapshot_target: | ||
1541 | dm_exception_store_exit(); | ||
1525 | return r; | 1542 | return r; |
1526 | } | 1543 | } |
1527 | 1544 | ||
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 376f1ab48a24..724efc63904d 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -47,6 +47,7 @@ struct dm_io { | |||
47 | atomic_t io_count; | 47 | atomic_t io_count; |
48 | struct bio *bio; | 48 | struct bio *bio; |
49 | unsigned long start_time; | 49 | unsigned long start_time; |
50 | spinlock_t endio_lock; | ||
50 | }; | 51 | }; |
51 | 52 | ||
52 | /* | 53 | /* |
@@ -578,8 +579,12 @@ static void dec_pending(struct dm_io *io, int error) | |||
578 | struct mapped_device *md = io->md; | 579 | struct mapped_device *md = io->md; |
579 | 580 | ||
580 | /* Push-back supersedes any I/O errors */ | 581 | /* Push-back supersedes any I/O errors */ |
581 | if (error && !(io->error > 0 && __noflush_suspending(md))) | 582 | if (unlikely(error)) { |
582 | io->error = error; | 583 | spin_lock_irqsave(&io->endio_lock, flags); |
584 | if (!(io->error > 0 && __noflush_suspending(md))) | ||
585 | io->error = error; | ||
586 | spin_unlock_irqrestore(&io->endio_lock, flags); | ||
587 | } | ||
583 | 588 | ||
584 | if (atomic_dec_and_test(&io->io_count)) { | 589 | if (atomic_dec_and_test(&io->io_count)) { |
585 | if (io->error == DM_ENDIO_REQUEUE) { | 590 | if (io->error == DM_ENDIO_REQUEUE) { |
@@ -1226,6 +1231,7 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio) | |||
1226 | atomic_set(&ci.io->io_count, 1); | 1231 | atomic_set(&ci.io->io_count, 1); |
1227 | ci.io->bio = bio; | 1232 | ci.io->bio = bio; |
1228 | ci.io->md = md; | 1233 | ci.io->md = md; |
1234 | spin_lock_init(&ci.io->endio_lock); | ||
1229 | ci.sector = bio->bi_sector; | 1235 | ci.sector = bio->bi_sector; |
1230 | ci.sector_count = bio_sectors(bio); | 1236 | ci.sector_count = bio_sectors(bio); |
1231 | if (unlikely(bio_empty_barrier(bio))) | 1237 | if (unlikely(bio_empty_barrier(bio))) |
@@ -1822,6 +1828,7 @@ static struct mapped_device *alloc_dev(int minor) | |||
1822 | bad_bdev: | 1828 | bad_bdev: |
1823 | destroy_workqueue(md->wq); | 1829 | destroy_workqueue(md->wq); |
1824 | bad_thread: | 1830 | bad_thread: |
1831 | del_gendisk(md->disk); | ||
1825 | put_disk(md->disk); | 1832 | put_disk(md->disk); |
1826 | bad_disk: | 1833 | bad_disk: |
1827 | blk_cleanup_queue(md->queue); | 1834 | blk_cleanup_queue(md->queue); |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 26ba42a79129..10eb1fce975e 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2631,7 +2631,7 @@ static void analyze_sbs(mddev_t * mddev) | |||
2631 | rdev->desc_nr = i++; | 2631 | rdev->desc_nr = i++; |
2632 | rdev->raid_disk = rdev->desc_nr; | 2632 | rdev->raid_disk = rdev->desc_nr; |
2633 | set_bit(In_sync, &rdev->flags); | 2633 | set_bit(In_sync, &rdev->flags); |
2634 | } else if (rdev->raid_disk >= mddev->raid_disks) { | 2634 | } else if (rdev->raid_disk >= (mddev->raid_disks - min(0, mddev->delta_disks))) { |
2635 | rdev->raid_disk = -1; | 2635 | rdev->raid_disk = -1; |
2636 | clear_bit(In_sync, &rdev->flags); | 2636 | clear_bit(In_sync, &rdev->flags); |
2637 | } | 2637 | } |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index d1b9bd5fd4f6..a053423785c9 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -64,7 +64,7 @@ static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data) | |||
64 | 64 | ||
65 | /* allocate a r1bio with room for raid_disks entries in the bios array */ | 65 | /* allocate a r1bio with room for raid_disks entries in the bios array */ |
66 | r1_bio = kzalloc(size, gfp_flags); | 66 | r1_bio = kzalloc(size, gfp_flags); |
67 | if (!r1_bio) | 67 | if (!r1_bio && pi->mddev) |
68 | unplug_slaves(pi->mddev); | 68 | unplug_slaves(pi->mddev); |
69 | 69 | ||
70 | return r1_bio; | 70 | return r1_bio; |
@@ -1683,6 +1683,7 @@ static void raid1d(mddev_t *mddev) | |||
1683 | generic_make_request(bio); | 1683 | generic_make_request(bio); |
1684 | } | 1684 | } |
1685 | } | 1685 | } |
1686 | cond_resched(); | ||
1686 | } | 1687 | } |
1687 | if (unplug) | 1688 | if (unplug) |
1688 | unplug_slaves(mddev); | 1689 | unplug_slaves(mddev); |
@@ -1978,13 +1979,14 @@ static int run(mddev_t *mddev) | |||
1978 | conf->poolinfo = kmalloc(sizeof(*conf->poolinfo), GFP_KERNEL); | 1979 | conf->poolinfo = kmalloc(sizeof(*conf->poolinfo), GFP_KERNEL); |
1979 | if (!conf->poolinfo) | 1980 | if (!conf->poolinfo) |
1980 | goto out_no_mem; | 1981 | goto out_no_mem; |
1981 | conf->poolinfo->mddev = mddev; | 1982 | conf->poolinfo->mddev = NULL; |
1982 | conf->poolinfo->raid_disks = mddev->raid_disks; | 1983 | conf->poolinfo->raid_disks = mddev->raid_disks; |
1983 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, | 1984 | conf->r1bio_pool = mempool_create(NR_RAID1_BIOS, r1bio_pool_alloc, |
1984 | r1bio_pool_free, | 1985 | r1bio_pool_free, |
1985 | conf->poolinfo); | 1986 | conf->poolinfo); |
1986 | if (!conf->r1bio_pool) | 1987 | if (!conf->r1bio_pool) |
1987 | goto out_no_mem; | 1988 | goto out_no_mem; |
1989 | conf->poolinfo->mddev = mddev; | ||
1988 | 1990 | ||
1989 | spin_lock_init(&conf->device_lock); | 1991 | spin_lock_init(&conf->device_lock); |
1990 | mddev->queue->queue_lock = &conf->device_lock; | 1992 | mddev->queue->queue_lock = &conf->device_lock; |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 51c4c5c4d87a..c2cb7b87b440 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -68,7 +68,7 @@ static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) | |||
68 | 68 | ||
69 | /* allocate a r10bio with room for raid_disks entries in the bios array */ | 69 | /* allocate a r10bio with room for raid_disks entries in the bios array */ |
70 | r10_bio = kzalloc(size, gfp_flags); | 70 | r10_bio = kzalloc(size, gfp_flags); |
71 | if (!r10_bio) | 71 | if (!r10_bio && conf->mddev) |
72 | unplug_slaves(conf->mddev); | 72 | unplug_slaves(conf->mddev); |
73 | 73 | ||
74 | return r10_bio; | 74 | return r10_bio; |
@@ -1632,6 +1632,7 @@ static void raid10d(mddev_t *mddev) | |||
1632 | generic_make_request(bio); | 1632 | generic_make_request(bio); |
1633 | } | 1633 | } |
1634 | } | 1634 | } |
1635 | cond_resched(); | ||
1635 | } | 1636 | } |
1636 | if (unplug) | 1637 | if (unplug) |
1637 | unplug_slaves(mddev); | 1638 | unplug_slaves(mddev); |
@@ -2095,7 +2096,6 @@ static int run(mddev_t *mddev) | |||
2095 | if (!conf->tmppage) | 2096 | if (!conf->tmppage) |
2096 | goto out_free_conf; | 2097 | goto out_free_conf; |
2097 | 2098 | ||
2098 | conf->mddev = mddev; | ||
2099 | conf->raid_disks = mddev->raid_disks; | 2099 | conf->raid_disks = mddev->raid_disks; |
2100 | conf->near_copies = nc; | 2100 | conf->near_copies = nc; |
2101 | conf->far_copies = fc; | 2101 | conf->far_copies = fc; |
@@ -2132,6 +2132,7 @@ static int run(mddev_t *mddev) | |||
2132 | goto out_free_conf; | 2132 | goto out_free_conf; |
2133 | } | 2133 | } |
2134 | 2134 | ||
2135 | conf->mddev = mddev; | ||
2135 | spin_lock_init(&conf->device_lock); | 2136 | spin_lock_init(&conf->device_lock); |
2136 | mddev->queue->queue_lock = &conf->device_lock; | 2137 | mddev->queue->queue_lock = &conf->device_lock; |
2137 | 2138 | ||
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 94829804ab7f..81abefc172d9 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -156,13 +156,16 @@ static inline int raid6_next_disk(int disk, int raid_disks) | |||
156 | static int raid6_idx_to_slot(int idx, struct stripe_head *sh, | 156 | static int raid6_idx_to_slot(int idx, struct stripe_head *sh, |
157 | int *count, int syndrome_disks) | 157 | int *count, int syndrome_disks) |
158 | { | 158 | { |
159 | int slot; | 159 | int slot = *count; |
160 | 160 | ||
161 | if (sh->ddf_layout) | ||
162 | (*count)++; | ||
161 | if (idx == sh->pd_idx) | 163 | if (idx == sh->pd_idx) |
162 | return syndrome_disks; | 164 | return syndrome_disks; |
163 | if (idx == sh->qd_idx) | 165 | if (idx == sh->qd_idx) |
164 | return syndrome_disks + 1; | 166 | return syndrome_disks + 1; |
165 | slot = (*count)++; | 167 | if (!sh->ddf_layout) |
168 | (*count)++; | ||
166 | return slot; | 169 | return slot; |
167 | } | 170 | } |
168 | 171 | ||
@@ -717,7 +720,7 @@ static int set_syndrome_sources(struct page **srcs, struct stripe_head *sh) | |||
717 | int i; | 720 | int i; |
718 | 721 | ||
719 | for (i = 0; i < disks; i++) | 722 | for (i = 0; i < disks; i++) |
720 | srcs[i] = (void *)raid6_empty_zero_page; | 723 | srcs[i] = NULL; |
721 | 724 | ||
722 | count = 0; | 725 | count = 0; |
723 | i = d0_idx; | 726 | i = d0_idx; |
@@ -727,9 +730,8 @@ static int set_syndrome_sources(struct page **srcs, struct stripe_head *sh) | |||
727 | srcs[slot] = sh->dev[i].page; | 730 | srcs[slot] = sh->dev[i].page; |
728 | i = raid6_next_disk(i, disks); | 731 | i = raid6_next_disk(i, disks); |
729 | } while (i != d0_idx); | 732 | } while (i != d0_idx); |
730 | BUG_ON(count != syndrome_disks); | ||
731 | 733 | ||
732 | return count; | 734 | return syndrome_disks; |
733 | } | 735 | } |
734 | 736 | ||
735 | static struct dma_async_tx_descriptor * | 737 | static struct dma_async_tx_descriptor * |
@@ -814,7 +816,7 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) | |||
814 | * slot number conversion for 'faila' and 'failb' | 816 | * slot number conversion for 'faila' and 'failb' |
815 | */ | 817 | */ |
816 | for (i = 0; i < disks ; i++) | 818 | for (i = 0; i < disks ; i++) |
817 | blocks[i] = (void *)raid6_empty_zero_page; | 819 | blocks[i] = NULL; |
818 | count = 0; | 820 | count = 0; |
819 | i = d0_idx; | 821 | i = d0_idx; |
820 | do { | 822 | do { |
@@ -828,7 +830,6 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) | |||
828 | failb = slot; | 830 | failb = slot; |
829 | i = raid6_next_disk(i, disks); | 831 | i = raid6_next_disk(i, disks); |
830 | } while (i != d0_idx); | 832 | } while (i != d0_idx); |
831 | BUG_ON(count != syndrome_disks); | ||
832 | 833 | ||
833 | BUG_ON(faila == failb); | 834 | BUG_ON(faila == failb); |
834 | if (failb < faila) | 835 | if (failb < faila) |
@@ -845,7 +846,7 @@ ops_run_compute6_2(struct stripe_head *sh, struct raid5_percpu *percpu) | |||
845 | init_async_submit(&submit, ASYNC_TX_FENCE, NULL, | 846 | init_async_submit(&submit, ASYNC_TX_FENCE, NULL, |
846 | ops_complete_compute, sh, | 847 | ops_complete_compute, sh, |
847 | to_addr_conv(sh, percpu)); | 848 | to_addr_conv(sh, percpu)); |
848 | return async_gen_syndrome(blocks, 0, count+2, | 849 | return async_gen_syndrome(blocks, 0, syndrome_disks+2, |
849 | STRIPE_SIZE, &submit); | 850 | STRIPE_SIZE, &submit); |
850 | } else { | 851 | } else { |
851 | struct page *dest; | 852 | struct page *dest; |
@@ -1139,7 +1140,7 @@ static void ops_run_check_pq(struct stripe_head *sh, struct raid5_percpu *percpu | |||
1139 | &sh->ops.zero_sum_result, percpu->spare_page, &submit); | 1140 | &sh->ops.zero_sum_result, percpu->spare_page, &submit); |
1140 | } | 1141 | } |
1141 | 1142 | ||
1142 | static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) | 1143 | static void __raid_run_ops(struct stripe_head *sh, unsigned long ops_request) |
1143 | { | 1144 | { |
1144 | int overlap_clear = 0, i, disks = sh->disks; | 1145 | int overlap_clear = 0, i, disks = sh->disks; |
1145 | struct dma_async_tx_descriptor *tx = NULL; | 1146 | struct dma_async_tx_descriptor *tx = NULL; |
@@ -1204,22 +1205,55 @@ static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) | |||
1204 | put_cpu(); | 1205 | put_cpu(); |
1205 | } | 1206 | } |
1206 | 1207 | ||
1208 | #ifdef CONFIG_MULTICORE_RAID456 | ||
1209 | static void async_run_ops(void *param, async_cookie_t cookie) | ||
1210 | { | ||
1211 | struct stripe_head *sh = param; | ||
1212 | unsigned long ops_request = sh->ops.request; | ||
1213 | |||
1214 | clear_bit_unlock(STRIPE_OPS_REQ_PENDING, &sh->state); | ||
1215 | wake_up(&sh->ops.wait_for_ops); | ||
1216 | |||
1217 | __raid_run_ops(sh, ops_request); | ||
1218 | release_stripe(sh); | ||
1219 | } | ||
1220 | |||
1221 | static void raid_run_ops(struct stripe_head *sh, unsigned long ops_request) | ||
1222 | { | ||
1223 | /* since handle_stripe can be called outside of raid5d context | ||
1224 | * we need to ensure sh->ops.request is de-staged before another | ||
1225 | * request arrives | ||
1226 | */ | ||
1227 | wait_event(sh->ops.wait_for_ops, | ||
1228 | !test_and_set_bit_lock(STRIPE_OPS_REQ_PENDING, &sh->state)); | ||
1229 | sh->ops.request = ops_request; | ||
1230 | |||
1231 | atomic_inc(&sh->count); | ||
1232 | async_schedule(async_run_ops, sh); | ||
1233 | } | ||
1234 | #else | ||
1235 | #define raid_run_ops __raid_run_ops | ||
1236 | #endif | ||
1237 | |||
1207 | static int grow_one_stripe(raid5_conf_t *conf) | 1238 | static int grow_one_stripe(raid5_conf_t *conf) |
1208 | { | 1239 | { |
1209 | struct stripe_head *sh; | 1240 | struct stripe_head *sh; |
1241 | int disks = max(conf->raid_disks, conf->previous_raid_disks); | ||
1210 | sh = kmem_cache_alloc(conf->slab_cache, GFP_KERNEL); | 1242 | sh = kmem_cache_alloc(conf->slab_cache, GFP_KERNEL); |
1211 | if (!sh) | 1243 | if (!sh) |
1212 | return 0; | 1244 | return 0; |
1213 | memset(sh, 0, sizeof(*sh) + (conf->raid_disks-1)*sizeof(struct r5dev)); | 1245 | memset(sh, 0, sizeof(*sh) + (disks-1)*sizeof(struct r5dev)); |
1214 | sh->raid_conf = conf; | 1246 | sh->raid_conf = conf; |
1215 | spin_lock_init(&sh->lock); | 1247 | spin_lock_init(&sh->lock); |
1248 | #ifdef CONFIG_MULTICORE_RAID456 | ||
1249 | init_waitqueue_head(&sh->ops.wait_for_ops); | ||
1250 | #endif | ||
1216 | 1251 | ||
1217 | if (grow_buffers(sh, conf->raid_disks)) { | 1252 | if (grow_buffers(sh, disks)) { |
1218 | shrink_buffers(sh, conf->raid_disks); | 1253 | shrink_buffers(sh, disks); |
1219 | kmem_cache_free(conf->slab_cache, sh); | 1254 | kmem_cache_free(conf->slab_cache, sh); |
1220 | return 0; | 1255 | return 0; |
1221 | } | 1256 | } |
1222 | sh->disks = conf->raid_disks; | ||
1223 | /* we just created an active stripe so... */ | 1257 | /* we just created an active stripe so... */ |
1224 | atomic_set(&sh->count, 1); | 1258 | atomic_set(&sh->count, 1); |
1225 | atomic_inc(&conf->active_stripes); | 1259 | atomic_inc(&conf->active_stripes); |
@@ -1231,7 +1265,7 @@ static int grow_one_stripe(raid5_conf_t *conf) | |||
1231 | static int grow_stripes(raid5_conf_t *conf, int num) | 1265 | static int grow_stripes(raid5_conf_t *conf, int num) |
1232 | { | 1266 | { |
1233 | struct kmem_cache *sc; | 1267 | struct kmem_cache *sc; |
1234 | int devs = conf->raid_disks; | 1268 | int devs = max(conf->raid_disks, conf->previous_raid_disks); |
1235 | 1269 | ||
1236 | sprintf(conf->cache_name[0], | 1270 | sprintf(conf->cache_name[0], |
1237 | "raid%d-%s", conf->level, mdname(conf->mddev)); | 1271 | "raid%d-%s", conf->level, mdname(conf->mddev)); |
@@ -1329,6 +1363,9 @@ static int resize_stripes(raid5_conf_t *conf, int newsize) | |||
1329 | 1363 | ||
1330 | nsh->raid_conf = conf; | 1364 | nsh->raid_conf = conf; |
1331 | spin_lock_init(&nsh->lock); | 1365 | spin_lock_init(&nsh->lock); |
1366 | #ifdef CONFIG_MULTICORE_RAID456 | ||
1367 | init_waitqueue_head(&nsh->ops.wait_for_ops); | ||
1368 | #endif | ||
1332 | 1369 | ||
1333 | list_add(&nsh->lru, &newstripes); | 1370 | list_add(&nsh->lru, &newstripes); |
1334 | } | 1371 | } |
@@ -1899,10 +1936,15 @@ static sector_t compute_blocknr(struct stripe_head *sh, int i, int previous) | |||
1899 | case ALGORITHM_PARITY_N: | 1936 | case ALGORITHM_PARITY_N: |
1900 | break; | 1937 | break; |
1901 | case ALGORITHM_ROTATING_N_CONTINUE: | 1938 | case ALGORITHM_ROTATING_N_CONTINUE: |
1939 | /* Like left_symmetric, but P is before Q */ | ||
1902 | if (sh->pd_idx == 0) | 1940 | if (sh->pd_idx == 0) |
1903 | i--; /* P D D D Q */ | 1941 | i--; /* P D D D Q */ |
1904 | else if (i > sh->pd_idx) | 1942 | else { |
1905 | i -= 2; /* D D Q P D */ | 1943 | /* D D Q P D */ |
1944 | if (i < sh->pd_idx) | ||
1945 | i += raid_disks; | ||
1946 | i -= (sh->pd_idx + 1); | ||
1947 | } | ||
1906 | break; | 1948 | break; |
1907 | case ALGORITHM_LEFT_ASYMMETRIC_6: | 1949 | case ALGORITHM_LEFT_ASYMMETRIC_6: |
1908 | case ALGORITHM_RIGHT_ASYMMETRIC_6: | 1950 | case ALGORITHM_RIGHT_ASYMMETRIC_6: |
@@ -2896,7 +2938,7 @@ static void handle_stripe_expansion(raid5_conf_t *conf, struct stripe_head *sh, | |||
2896 | * | 2938 | * |
2897 | */ | 2939 | */ |
2898 | 2940 | ||
2899 | static bool handle_stripe5(struct stripe_head *sh) | 2941 | static void handle_stripe5(struct stripe_head *sh) |
2900 | { | 2942 | { |
2901 | raid5_conf_t *conf = sh->raid_conf; | 2943 | raid5_conf_t *conf = sh->raid_conf; |
2902 | int disks = sh->disks, i; | 2944 | int disks = sh->disks, i; |
@@ -3167,11 +3209,9 @@ static bool handle_stripe5(struct stripe_head *sh) | |||
3167 | ops_run_io(sh, &s); | 3209 | ops_run_io(sh, &s); |
3168 | 3210 | ||
3169 | return_io(return_bi); | 3211 | return_io(return_bi); |
3170 | |||
3171 | return blocked_rdev == NULL; | ||
3172 | } | 3212 | } |
3173 | 3213 | ||
3174 | static bool handle_stripe6(struct stripe_head *sh) | 3214 | static void handle_stripe6(struct stripe_head *sh) |
3175 | { | 3215 | { |
3176 | raid5_conf_t *conf = sh->raid_conf; | 3216 | raid5_conf_t *conf = sh->raid_conf; |
3177 | int disks = sh->disks; | 3217 | int disks = sh->disks; |
@@ -3455,17 +3495,14 @@ static bool handle_stripe6(struct stripe_head *sh) | |||
3455 | ops_run_io(sh, &s); | 3495 | ops_run_io(sh, &s); |
3456 | 3496 | ||
3457 | return_io(return_bi); | 3497 | return_io(return_bi); |
3458 | |||
3459 | return blocked_rdev == NULL; | ||
3460 | } | 3498 | } |
3461 | 3499 | ||
3462 | /* returns true if the stripe was handled */ | 3500 | static void handle_stripe(struct stripe_head *sh) |
3463 | static bool handle_stripe(struct stripe_head *sh) | ||
3464 | { | 3501 | { |
3465 | if (sh->raid_conf->level == 6) | 3502 | if (sh->raid_conf->level == 6) |
3466 | return handle_stripe6(sh); | 3503 | handle_stripe6(sh); |
3467 | else | 3504 | else |
3468 | return handle_stripe5(sh); | 3505 | handle_stripe5(sh); |
3469 | } | 3506 | } |
3470 | 3507 | ||
3471 | static void raid5_activate_delayed(raid5_conf_t *conf) | 3508 | static void raid5_activate_delayed(raid5_conf_t *conf) |
@@ -3503,9 +3540,10 @@ static void unplug_slaves(mddev_t *mddev) | |||
3503 | { | 3540 | { |
3504 | raid5_conf_t *conf = mddev->private; | 3541 | raid5_conf_t *conf = mddev->private; |
3505 | int i; | 3542 | int i; |
3543 | int devs = max(conf->raid_disks, conf->previous_raid_disks); | ||
3506 | 3544 | ||
3507 | rcu_read_lock(); | 3545 | rcu_read_lock(); |
3508 | for (i = 0; i < conf->raid_disks; i++) { | 3546 | for (i = 0; i < devs; i++) { |
3509 | mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev); | 3547 | mdk_rdev_t *rdev = rcu_dereference(conf->disks[i].rdev); |
3510 | if (rdev && !test_bit(Faulty, &rdev->flags) && atomic_read(&rdev->nr_pending)) { | 3548 | if (rdev && !test_bit(Faulty, &rdev->flags) && atomic_read(&rdev->nr_pending)) { |
3511 | struct request_queue *r_queue = bdev_get_queue(rdev->bdev); | 3549 | struct request_queue *r_queue = bdev_get_queue(rdev->bdev); |
@@ -4277,9 +4315,7 @@ static inline sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *ski | |||
4277 | clear_bit(STRIPE_INSYNC, &sh->state); | 4315 | clear_bit(STRIPE_INSYNC, &sh->state); |
4278 | spin_unlock(&sh->lock); | 4316 | spin_unlock(&sh->lock); |
4279 | 4317 | ||
4280 | /* wait for any blocked device to be handled */ | 4318 | handle_stripe(sh); |
4281 | while (unlikely(!handle_stripe(sh))) | ||
4282 | ; | ||
4283 | release_stripe(sh); | 4319 | release_stripe(sh); |
4284 | 4320 | ||
4285 | return STRIPE_SECTORS; | 4321 | return STRIPE_SECTORS; |
@@ -4349,37 +4385,6 @@ static int retry_aligned_read(raid5_conf_t *conf, struct bio *raid_bio) | |||
4349 | return handled; | 4385 | return handled; |
4350 | } | 4386 | } |
4351 | 4387 | ||
4352 | #ifdef CONFIG_MULTICORE_RAID456 | ||
4353 | static void __process_stripe(void *param, async_cookie_t cookie) | ||
4354 | { | ||
4355 | struct stripe_head *sh = param; | ||
4356 | |||
4357 | handle_stripe(sh); | ||
4358 | release_stripe(sh); | ||
4359 | } | ||
4360 | |||
4361 | static void process_stripe(struct stripe_head *sh, struct list_head *domain) | ||
4362 | { | ||
4363 | async_schedule_domain(__process_stripe, sh, domain); | ||
4364 | } | ||
4365 | |||
4366 | static void synchronize_stripe_processing(struct list_head *domain) | ||
4367 | { | ||
4368 | async_synchronize_full_domain(domain); | ||
4369 | } | ||
4370 | #else | ||
4371 | static void process_stripe(struct stripe_head *sh, struct list_head *domain) | ||
4372 | { | ||
4373 | handle_stripe(sh); | ||
4374 | release_stripe(sh); | ||
4375 | cond_resched(); | ||
4376 | } | ||
4377 | |||
4378 | static void synchronize_stripe_processing(struct list_head *domain) | ||
4379 | { | ||
4380 | } | ||
4381 | #endif | ||
4382 | |||
4383 | 4388 | ||
4384 | /* | 4389 | /* |
4385 | * This is our raid5 kernel thread. | 4390 | * This is our raid5 kernel thread. |
@@ -4393,7 +4398,6 @@ static void raid5d(mddev_t *mddev) | |||
4393 | struct stripe_head *sh; | 4398 | struct stripe_head *sh; |
4394 | raid5_conf_t *conf = mddev->private; | 4399 | raid5_conf_t *conf = mddev->private; |
4395 | int handled; | 4400 | int handled; |
4396 | LIST_HEAD(raid_domain); | ||
4397 | 4401 | ||
4398 | pr_debug("+++ raid5d active\n"); | 4402 | pr_debug("+++ raid5d active\n"); |
4399 | 4403 | ||
@@ -4430,7 +4434,9 @@ static void raid5d(mddev_t *mddev) | |||
4430 | spin_unlock_irq(&conf->device_lock); | 4434 | spin_unlock_irq(&conf->device_lock); |
4431 | 4435 | ||
4432 | handled++; | 4436 | handled++; |
4433 | process_stripe(sh, &raid_domain); | 4437 | handle_stripe(sh); |
4438 | release_stripe(sh); | ||
4439 | cond_resched(); | ||
4434 | 4440 | ||
4435 | spin_lock_irq(&conf->device_lock); | 4441 | spin_lock_irq(&conf->device_lock); |
4436 | } | 4442 | } |
@@ -4438,7 +4444,6 @@ static void raid5d(mddev_t *mddev) | |||
4438 | 4444 | ||
4439 | spin_unlock_irq(&conf->device_lock); | 4445 | spin_unlock_irq(&conf->device_lock); |
4440 | 4446 | ||
4441 | synchronize_stripe_processing(&raid_domain); | ||
4442 | async_tx_issue_pending_all(); | 4447 | async_tx_issue_pending_all(); |
4443 | unplug_slaves(mddev); | 4448 | unplug_slaves(mddev); |
4444 | 4449 | ||
@@ -4558,13 +4563,9 @@ raid5_size(mddev_t *mddev, sector_t sectors, int raid_disks) | |||
4558 | 4563 | ||
4559 | if (!sectors) | 4564 | if (!sectors) |
4560 | sectors = mddev->dev_sectors; | 4565 | sectors = mddev->dev_sectors; |
4561 | if (!raid_disks) { | 4566 | if (!raid_disks) |
4562 | /* size is defined by the smallest of previous and new size */ | 4567 | /* size is defined by the smallest of previous and new size */ |
4563 | if (conf->raid_disks < conf->previous_raid_disks) | 4568 | raid_disks = min(conf->raid_disks, conf->previous_raid_disks); |
4564 | raid_disks = conf->raid_disks; | ||
4565 | else | ||
4566 | raid_disks = conf->previous_raid_disks; | ||
4567 | } | ||
4568 | 4569 | ||
4569 | sectors &= ~((sector_t)mddev->chunk_sectors - 1); | 4570 | sectors &= ~((sector_t)mddev->chunk_sectors - 1); |
4570 | sectors &= ~((sector_t)mddev->new_chunk_sectors - 1); | 4571 | sectors &= ~((sector_t)mddev->new_chunk_sectors - 1); |
@@ -4665,7 +4666,7 @@ static int raid5_alloc_percpu(raid5_conf_t *conf) | |||
4665 | } | 4666 | } |
4666 | per_cpu_ptr(conf->percpu, cpu)->spare_page = spare_page; | 4667 | per_cpu_ptr(conf->percpu, cpu)->spare_page = spare_page; |
4667 | } | 4668 | } |
4668 | scribble = kmalloc(scribble_len(conf->raid_disks), GFP_KERNEL); | 4669 | scribble = kmalloc(conf->scribble_len, GFP_KERNEL); |
4669 | if (!scribble) { | 4670 | if (!scribble) { |
4670 | err = -ENOMEM; | 4671 | err = -ENOMEM; |
4671 | break; | 4672 | break; |
@@ -4686,7 +4687,7 @@ static int raid5_alloc_percpu(raid5_conf_t *conf) | |||
4686 | static raid5_conf_t *setup_conf(mddev_t *mddev) | 4687 | static raid5_conf_t *setup_conf(mddev_t *mddev) |
4687 | { | 4688 | { |
4688 | raid5_conf_t *conf; | 4689 | raid5_conf_t *conf; |
4689 | int raid_disk, memory; | 4690 | int raid_disk, memory, max_disks; |
4690 | mdk_rdev_t *rdev; | 4691 | mdk_rdev_t *rdev; |
4691 | struct disk_info *disk; | 4692 | struct disk_info *disk; |
4692 | 4693 | ||
@@ -4722,15 +4723,28 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) | |||
4722 | conf = kzalloc(sizeof(raid5_conf_t), GFP_KERNEL); | 4723 | conf = kzalloc(sizeof(raid5_conf_t), GFP_KERNEL); |
4723 | if (conf == NULL) | 4724 | if (conf == NULL) |
4724 | goto abort; | 4725 | goto abort; |
4726 | spin_lock_init(&conf->device_lock); | ||
4727 | init_waitqueue_head(&conf->wait_for_stripe); | ||
4728 | init_waitqueue_head(&conf->wait_for_overlap); | ||
4729 | INIT_LIST_HEAD(&conf->handle_list); | ||
4730 | INIT_LIST_HEAD(&conf->hold_list); | ||
4731 | INIT_LIST_HEAD(&conf->delayed_list); | ||
4732 | INIT_LIST_HEAD(&conf->bitmap_list); | ||
4733 | INIT_LIST_HEAD(&conf->inactive_list); | ||
4734 | atomic_set(&conf->active_stripes, 0); | ||
4735 | atomic_set(&conf->preread_active_stripes, 0); | ||
4736 | atomic_set(&conf->active_aligned_reads, 0); | ||
4737 | conf->bypass_threshold = BYPASS_THRESHOLD; | ||
4725 | 4738 | ||
4726 | conf->raid_disks = mddev->raid_disks; | 4739 | conf->raid_disks = mddev->raid_disks; |
4727 | conf->scribble_len = scribble_len(conf->raid_disks); | ||
4728 | if (mddev->reshape_position == MaxSector) | 4740 | if (mddev->reshape_position == MaxSector) |
4729 | conf->previous_raid_disks = mddev->raid_disks; | 4741 | conf->previous_raid_disks = mddev->raid_disks; |
4730 | else | 4742 | else |
4731 | conf->previous_raid_disks = mddev->raid_disks - mddev->delta_disks; | 4743 | conf->previous_raid_disks = mddev->raid_disks - mddev->delta_disks; |
4744 | max_disks = max(conf->raid_disks, conf->previous_raid_disks); | ||
4745 | conf->scribble_len = scribble_len(max_disks); | ||
4732 | 4746 | ||
4733 | conf->disks = kzalloc(conf->raid_disks * sizeof(struct disk_info), | 4747 | conf->disks = kzalloc(max_disks * sizeof(struct disk_info), |
4734 | GFP_KERNEL); | 4748 | GFP_KERNEL); |
4735 | if (!conf->disks) | 4749 | if (!conf->disks) |
4736 | goto abort; | 4750 | goto abort; |
@@ -4744,24 +4758,11 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) | |||
4744 | if (raid5_alloc_percpu(conf) != 0) | 4758 | if (raid5_alloc_percpu(conf) != 0) |
4745 | goto abort; | 4759 | goto abort; |
4746 | 4760 | ||
4747 | spin_lock_init(&conf->device_lock); | ||
4748 | init_waitqueue_head(&conf->wait_for_stripe); | ||
4749 | init_waitqueue_head(&conf->wait_for_overlap); | ||
4750 | INIT_LIST_HEAD(&conf->handle_list); | ||
4751 | INIT_LIST_HEAD(&conf->hold_list); | ||
4752 | INIT_LIST_HEAD(&conf->delayed_list); | ||
4753 | INIT_LIST_HEAD(&conf->bitmap_list); | ||
4754 | INIT_LIST_HEAD(&conf->inactive_list); | ||
4755 | atomic_set(&conf->active_stripes, 0); | ||
4756 | atomic_set(&conf->preread_active_stripes, 0); | ||
4757 | atomic_set(&conf->active_aligned_reads, 0); | ||
4758 | conf->bypass_threshold = BYPASS_THRESHOLD; | ||
4759 | |||
4760 | pr_debug("raid5: run(%s) called.\n", mdname(mddev)); | 4761 | pr_debug("raid5: run(%s) called.\n", mdname(mddev)); |
4761 | 4762 | ||
4762 | list_for_each_entry(rdev, &mddev->disks, same_set) { | 4763 | list_for_each_entry(rdev, &mddev->disks, same_set) { |
4763 | raid_disk = rdev->raid_disk; | 4764 | raid_disk = rdev->raid_disk; |
4764 | if (raid_disk >= conf->raid_disks | 4765 | if (raid_disk >= max_disks |
4765 | || raid_disk < 0) | 4766 | || raid_disk < 0) |
4766 | continue; | 4767 | continue; |
4767 | disk = conf->disks + raid_disk; | 4768 | disk = conf->disks + raid_disk; |
@@ -4793,7 +4794,7 @@ static raid5_conf_t *setup_conf(mddev_t *mddev) | |||
4793 | } | 4794 | } |
4794 | 4795 | ||
4795 | memory = conf->max_nr_stripes * (sizeof(struct stripe_head) + | 4796 | memory = conf->max_nr_stripes * (sizeof(struct stripe_head) + |
4796 | conf->raid_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024; | 4797 | max_disks * ((sizeof(struct bio) + PAGE_SIZE))) / 1024; |
4797 | if (grow_stripes(conf, conf->max_nr_stripes)) { | 4798 | if (grow_stripes(conf, conf->max_nr_stripes)) { |
4798 | printk(KERN_ERR | 4799 | printk(KERN_ERR |
4799 | "raid5: couldn't allocate %dkB for buffers\n", memory); | 4800 | "raid5: couldn't allocate %dkB for buffers\n", memory); |
@@ -4918,7 +4919,8 @@ static int run(mddev_t *mddev) | |||
4918 | test_bit(In_sync, &rdev->flags)) | 4919 | test_bit(In_sync, &rdev->flags)) |
4919 | working_disks++; | 4920 | working_disks++; |
4920 | 4921 | ||
4921 | mddev->degraded = conf->raid_disks - working_disks; | 4922 | mddev->degraded = (max(conf->raid_disks, conf->previous_raid_disks) |
4923 | - working_disks); | ||
4922 | 4924 | ||
4923 | if (mddev->degraded > conf->max_degraded) { | 4925 | if (mddev->degraded > conf->max_degraded) { |
4924 | printk(KERN_ERR "raid5: not enough operational devices for %s" | 4926 | printk(KERN_ERR "raid5: not enough operational devices for %s" |
diff --git a/drivers/md/raid5.h b/drivers/md/raid5.h index 2390e0e83daf..dd708359b451 100644 --- a/drivers/md/raid5.h +++ b/drivers/md/raid5.h | |||
@@ -214,12 +214,20 @@ struct stripe_head { | |||
214 | int disks; /* disks in stripe */ | 214 | int disks; /* disks in stripe */ |
215 | enum check_states check_state; | 215 | enum check_states check_state; |
216 | enum reconstruct_states reconstruct_state; | 216 | enum reconstruct_states reconstruct_state; |
217 | /* stripe_operations | 217 | /** |
218 | * struct stripe_operations | ||
218 | * @target - STRIPE_OP_COMPUTE_BLK target | 219 | * @target - STRIPE_OP_COMPUTE_BLK target |
220 | * @target2 - 2nd compute target in the raid6 case | ||
221 | * @zero_sum_result - P and Q verification flags | ||
222 | * @request - async service request flags for raid_run_ops | ||
219 | */ | 223 | */ |
220 | struct stripe_operations { | 224 | struct stripe_operations { |
221 | int target, target2; | 225 | int target, target2; |
222 | enum sum_check_flags zero_sum_result; | 226 | enum sum_check_flags zero_sum_result; |
227 | #ifdef CONFIG_MULTICORE_RAID456 | ||
228 | unsigned long request; | ||
229 | wait_queue_head_t wait_for_ops; | ||
230 | #endif | ||
223 | } ops; | 231 | } ops; |
224 | struct r5dev { | 232 | struct r5dev { |
225 | struct bio req; | 233 | struct bio req; |
@@ -294,6 +302,8 @@ struct r6_state { | |||
294 | #define STRIPE_FULL_WRITE 13 /* all blocks are set to be overwritten */ | 302 | #define STRIPE_FULL_WRITE 13 /* all blocks are set to be overwritten */ |
295 | #define STRIPE_BIOFILL_RUN 14 | 303 | #define STRIPE_BIOFILL_RUN 14 |
296 | #define STRIPE_COMPUTE_RUN 15 | 304 | #define STRIPE_COMPUTE_RUN 15 |
305 | #define STRIPE_OPS_REQ_PENDING 16 | ||
306 | |||
297 | /* | 307 | /* |
298 | * Operation request flags | 308 | * Operation request flags |
299 | */ | 309 | */ |
@@ -478,7 +488,7 @@ static inline int algorithm_valid_raid6(int layout) | |||
478 | { | 488 | { |
479 | return (layout >= 0 && layout <= 5) | 489 | return (layout >= 0 && layout <= 5) |
480 | || | 490 | || |
481 | (layout == 8 || layout == 10) | 491 | (layout >= 8 && layout <= 10) |
482 | || | 492 | || |
483 | (layout >= 16 && layout <= 20); | 493 | (layout >= 16 && layout <= 20); |
484 | } | 494 | } |
diff --git a/drivers/md/raid6altivec.uc b/drivers/md/raid6altivec.uc index 699dfeee4944..2654d5c854be 100644 --- a/drivers/md/raid6altivec.uc +++ b/drivers/md/raid6altivec.uc | |||
@@ -15,7 +15,7 @@ | |||
15 | * | 15 | * |
16 | * $#-way unrolled portable integer math RAID-6 instruction set | 16 | * $#-way unrolled portable integer math RAID-6 instruction set |
17 | * | 17 | * |
18 | * This file is postprocessed using unroll.pl | 18 | * This file is postprocessed using unroll.awk |
19 | * | 19 | * |
20 | * <benh> hpa: in process, | 20 | * <benh> hpa: in process, |
21 | * you can just "steal" the vec unit with enable_kernel_altivec() (but | 21 | * you can just "steal" the vec unit with enable_kernel_altivec() (but |
diff --git a/drivers/md/raid6int.uc b/drivers/md/raid6int.uc index f9bf9cba357f..d1e276a14fab 100644 --- a/drivers/md/raid6int.uc +++ b/drivers/md/raid6int.uc | |||
@@ -15,7 +15,7 @@ | |||
15 | * | 15 | * |
16 | * $#-way unrolled portable integer math RAID-6 instruction set | 16 | * $#-way unrolled portable integer math RAID-6 instruction set |
17 | * | 17 | * |
18 | * This file is postprocessed using unroll.pl | 18 | * This file is postprocessed using unroll.awk |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #include <linux/raid/pq.h> | 21 | #include <linux/raid/pq.h> |
diff --git a/drivers/md/raid6test/Makefile b/drivers/md/raid6test/Makefile index 58ffdf4f5161..2874cbef529d 100644 --- a/drivers/md/raid6test/Makefile +++ b/drivers/md/raid6test/Makefile | |||
@@ -7,7 +7,7 @@ CC = gcc | |||
7 | OPTFLAGS = -O2 # Adjust as desired | 7 | OPTFLAGS = -O2 # Adjust as desired |
8 | CFLAGS = -I.. -I ../../../include -g $(OPTFLAGS) | 8 | CFLAGS = -I.. -I ../../../include -g $(OPTFLAGS) |
9 | LD = ld | 9 | LD = ld |
10 | PERL = perl | 10 | AWK = awk |
11 | AR = ar | 11 | AR = ar |
12 | RANLIB = ranlib | 12 | RANLIB = ranlib |
13 | 13 | ||
@@ -35,35 +35,35 @@ raid6.a: raid6int1.o raid6int2.o raid6int4.o raid6int8.o raid6int16.o \ | |||
35 | raid6test: test.c raid6.a | 35 | raid6test: test.c raid6.a |
36 | $(CC) $(CFLAGS) -o raid6test $^ | 36 | $(CC) $(CFLAGS) -o raid6test $^ |
37 | 37 | ||
38 | raid6altivec1.c: raid6altivec.uc ../unroll.pl | 38 | raid6altivec1.c: raid6altivec.uc ../unroll.awk |
39 | $(PERL) ../unroll.pl 1 < raid6altivec.uc > $@ | 39 | $(AWK) ../unroll.awk -vN=1 < raid6altivec.uc > $@ |
40 | 40 | ||
41 | raid6altivec2.c: raid6altivec.uc ../unroll.pl | 41 | raid6altivec2.c: raid6altivec.uc ../unroll.awk |
42 | $(PERL) ../unroll.pl 2 < raid6altivec.uc > $@ | 42 | $(AWK) ../unroll.awk -vN=2 < raid6altivec.uc > $@ |
43 | 43 | ||
44 | raid6altivec4.c: raid6altivec.uc ../unroll.pl | 44 | raid6altivec4.c: raid6altivec.uc ../unroll.awk |
45 | $(PERL) ../unroll.pl 4 < raid6altivec.uc > $@ | 45 | $(AWK) ../unroll.awk -vN=4 < raid6altivec.uc > $@ |
46 | 46 | ||
47 | raid6altivec8.c: raid6altivec.uc ../unroll.pl | 47 | raid6altivec8.c: raid6altivec.uc ../unroll.awk |
48 | $(PERL) ../unroll.pl 8 < raid6altivec.uc > $@ | 48 | $(AWK) ../unroll.awk -vN=8 < raid6altivec.uc > $@ |
49 | 49 | ||
50 | raid6int1.c: raid6int.uc ../unroll.pl | 50 | raid6int1.c: raid6int.uc ../unroll.awk |
51 | $(PERL) ../unroll.pl 1 < raid6int.uc > $@ | 51 | $(AWK) ../unroll.awk -vN=1 < raid6int.uc > $@ |
52 | 52 | ||
53 | raid6int2.c: raid6int.uc ../unroll.pl | 53 | raid6int2.c: raid6int.uc ../unroll.awk |
54 | $(PERL) ../unroll.pl 2 < raid6int.uc > $@ | 54 | $(AWK) ../unroll.awk -vN=2 < raid6int.uc > $@ |
55 | 55 | ||
56 | raid6int4.c: raid6int.uc ../unroll.pl | 56 | raid6int4.c: raid6int.uc ../unroll.awk |
57 | $(PERL) ../unroll.pl 4 < raid6int.uc > $@ | 57 | $(AWK) ../unroll.awk -vN=4 < raid6int.uc > $@ |
58 | 58 | ||
59 | raid6int8.c: raid6int.uc ../unroll.pl | 59 | raid6int8.c: raid6int.uc ../unroll.awk |
60 | $(PERL) ../unroll.pl 8 < raid6int.uc > $@ | 60 | $(AWK) ../unroll.awk -vN=8 < raid6int.uc > $@ |
61 | 61 | ||
62 | raid6int16.c: raid6int.uc ../unroll.pl | 62 | raid6int16.c: raid6int.uc ../unroll.awk |
63 | $(PERL) ../unroll.pl 16 < raid6int.uc > $@ | 63 | $(AWK) ../unroll.awk -vN=16 < raid6int.uc > $@ |
64 | 64 | ||
65 | raid6int32.c: raid6int.uc ../unroll.pl | 65 | raid6int32.c: raid6int.uc ../unroll.awk |
66 | $(PERL) ../unroll.pl 32 < raid6int.uc > $@ | 66 | $(AWK) ../unroll.awk -vN=32 < raid6int.uc > $@ |
67 | 67 | ||
68 | raid6tables.c: mktables | 68 | raid6tables.c: mktables |
69 | ./mktables > raid6tables.c | 69 | ./mktables > raid6tables.c |
diff --git a/drivers/md/unroll.awk b/drivers/md/unroll.awk new file mode 100644 index 000000000000..c6aa03631df8 --- /dev/null +++ b/drivers/md/unroll.awk | |||
@@ -0,0 +1,20 @@ | |||
1 | |||
2 | # This filter requires one command line option of form -vN=n | ||
3 | # where n must be a decimal number. | ||
4 | # | ||
5 | # Repeat each input line containing $$ n times, replacing $$ with 0...n-1. | ||
6 | # Replace each $# with n, and each $* with a single $. | ||
7 | |||
8 | BEGIN { | ||
9 | n = N + 0 | ||
10 | } | ||
11 | { | ||
12 | if (/\$\$/) { rep = n } else { rep = 1 } | ||
13 | for (i = 0; i < rep; ++i) { | ||
14 | tmp = $0 | ||
15 | gsub(/\$\$/, i, tmp) | ||
16 | gsub(/\$\#/, n, tmp) | ||
17 | gsub(/\$\*/, "$", tmp) | ||
18 | print tmp | ||
19 | } | ||
20 | } | ||
diff --git a/drivers/md/unroll.pl b/drivers/md/unroll.pl deleted file mode 100644 index 3acc710a20ea..000000000000 --- a/drivers/md/unroll.pl +++ /dev/null | |||
@@ -1,24 +0,0 @@ | |||
1 | #!/usr/bin/perl | ||
2 | # | ||
3 | # Take a piece of C code and for each line which contains the sequence $$ | ||
4 | # repeat n times with $ replaced by 0...n-1; the sequence $# is replaced | ||
5 | # by the unrolling factor, and $* with a single $ | ||
6 | # | ||
7 | |||
8 | ($n) = @ARGV; | ||
9 | $n += 0; | ||
10 | |||
11 | while ( defined($line = <STDIN>) ) { | ||
12 | if ( $line =~ /\$\$/ ) { | ||
13 | $rep = $n; | ||
14 | } else { | ||
15 | $rep = 1; | ||
16 | } | ||
17 | for ( $i = 0 ; $i < $rep ; $i++ ) { | ||
18 | $tmp = $line; | ||
19 | $tmp =~ s/\$\$/$i/g; | ||
20 | $tmp =~ s/\$\#/$n/g; | ||
21 | $tmp =~ s/\$\*/\$/g; | ||
22 | print $tmp; | ||
23 | } | ||
24 | } | ||
diff --git a/drivers/mfd/twl4030-core.c b/drivers/mfd/twl4030-core.c index e832e975da60..a1c47ee95c0e 100644 --- a/drivers/mfd/twl4030-core.c +++ b/drivers/mfd/twl4030-core.c | |||
@@ -795,7 +795,7 @@ twl4030_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
795 | twl->client = i2c_new_dummy(client->adapter, | 795 | twl->client = i2c_new_dummy(client->adapter, |
796 | twl->address); | 796 | twl->address); |
797 | if (!twl->client) { | 797 | if (!twl->client) { |
798 | dev_err(&twl->client->dev, | 798 | dev_err(&client->dev, |
799 | "can't attach client %d\n", i); | 799 | "can't attach client %d\n", i); |
800 | status = -ENOMEM; | 800 | status = -ENOMEM; |
801 | goto fail; | 801 | goto fail; |
diff --git a/drivers/mfd/wm831x-irq.c b/drivers/mfd/wm831x-irq.c index d3015dfb9134..ac056ea6b66e 100644 --- a/drivers/mfd/wm831x-irq.c +++ b/drivers/mfd/wm831x-irq.c | |||
@@ -507,6 +507,8 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
507 | { | 507 | { |
508 | int i, ret; | 508 | int i, ret; |
509 | 509 | ||
510 | mutex_init(&wm831x->irq_lock); | ||
511 | |||
510 | if (!irq) { | 512 | if (!irq) { |
511 | dev_warn(wm831x->dev, | 513 | dev_warn(wm831x->dev, |
512 | "No interrupt specified - functionality limited\n"); | 514 | "No interrupt specified - functionality limited\n"); |
@@ -521,7 +523,6 @@ int wm831x_irq_init(struct wm831x *wm831x, int irq) | |||
521 | } | 523 | } |
522 | 524 | ||
523 | wm831x->irq = irq; | 525 | wm831x->irq = irq; |
524 | mutex_init(&wm831x->irq_lock); | ||
525 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); | 526 | INIT_WORK(&wm831x->irq_work, wm831x_irq_worker); |
526 | 527 | ||
527 | /* Mask the individual interrupt sources */ | 528 | /* Mask the individual interrupt sources */ |
diff --git a/drivers/mmc/host/at91_mci.c b/drivers/mmc/host/at91_mci.c index e556d42cc45a..63924e0c7ea9 100644 --- a/drivers/mmc/host/at91_mci.c +++ b/drivers/mmc/host/at91_mci.c | |||
@@ -72,7 +72,6 @@ | |||
72 | #include <asm/irq.h> | 72 | #include <asm/irq.h> |
73 | #include <asm/gpio.h> | 73 | #include <asm/gpio.h> |
74 | 74 | ||
75 | #include <asm/mach/mmc.h> | ||
76 | #include <mach/board.h> | 75 | #include <mach/board.h> |
77 | #include <mach/cpu.h> | 76 | #include <mach/cpu.h> |
78 | #include <mach/at91_mci.h> | 77 | #include <mach/at91_mci.h> |
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c index 4487cc097911..0aecaaebef3d 100644 --- a/drivers/mmc/host/omap_hsmmc.c +++ b/drivers/mmc/host/omap_hsmmc.c | |||
@@ -2013,7 +2013,7 @@ static struct platform_driver omap_hsmmc_driver = { | |||
2013 | static int __init omap_hsmmc_init(void) | 2013 | static int __init omap_hsmmc_init(void) |
2014 | { | 2014 | { |
2015 | /* Register the MMC driver */ | 2015 | /* Register the MMC driver */ |
2016 | return platform_driver_register(&omap_hsmmc_driver); | 2016 | return platform_driver_probe(&omap_hsmmc_driver, omap_hsmmc_probe); |
2017 | } | 2017 | } |
2018 | 2018 | ||
2019 | static void __exit omap_hsmmc_cleanup(void) | 2019 | static void __exit omap_hsmmc_cleanup(void) |
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index e1f7d0a78b9d..14cec04c34f9 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <linux/log2.h> | 42 | #include <linux/log2.h> |
43 | #include <linux/kthread.h> | 43 | #include <linux/kthread.h> |
44 | #include <linux/reboot.h> | 44 | #include <linux/reboot.h> |
45 | #include <linux/kernel.h> | ||
45 | #include "ubi.h" | 46 | #include "ubi.h" |
46 | 47 | ||
47 | /* Maximum length of the 'mtd=' parameter */ | 48 | /* Maximum length of the 'mtd=' parameter */ |
@@ -1257,7 +1258,7 @@ static int __init bytes_str_to_int(const char *str) | |||
1257 | unsigned long result; | 1258 | unsigned long result; |
1258 | 1259 | ||
1259 | result = simple_strtoul(str, &endp, 0); | 1260 | result = simple_strtoul(str, &endp, 0); |
1260 | if (str == endp || result < 0) { | 1261 | if (str == endp || result >= INT_MAX) { |
1261 | printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n", | 1262 | printk(KERN_ERR "UBI error: incorrect bytes count: \"%s\"\n", |
1262 | str); | 1263 | str); |
1263 | return -EINVAL; | 1264 | return -EINVAL; |
diff --git a/drivers/mtd/ubi/scan.c b/drivers/mtd/ubi/scan.c index e7161adc419d..90af61a2c3e4 100644 --- a/drivers/mtd/ubi/scan.c +++ b/drivers/mtd/ubi/scan.c | |||
@@ -794,16 +794,15 @@ static int process_eb(struct ubi_device *ubi, struct ubi_scan_info *si, | |||
794 | * number. | 794 | * number. |
795 | */ | 795 | */ |
796 | image_seq = be32_to_cpu(ech->image_seq); | 796 | image_seq = be32_to_cpu(ech->image_seq); |
797 | if (!si->image_seq_set) { | 797 | if (!ubi->image_seq && image_seq) |
798 | ubi->image_seq = image_seq; | 798 | ubi->image_seq = image_seq; |
799 | si->image_seq_set = 1; | 799 | if (ubi->image_seq && image_seq && |
800 | } else if (ubi->image_seq && ubi->image_seq != image_seq) { | 800 | ubi->image_seq != image_seq) { |
801 | ubi_err("bad image sequence number %d in PEB %d, " | 801 | ubi_err("bad image sequence number %d in PEB %d, " |
802 | "expected %d", image_seq, pnum, ubi->image_seq); | 802 | "expected %d", image_seq, pnum, ubi->image_seq); |
803 | ubi_dbg_dump_ec_hdr(ech); | 803 | ubi_dbg_dump_ec_hdr(ech); |
804 | return -EINVAL; | 804 | return -EINVAL; |
805 | } | 805 | } |
806 | |||
807 | } | 806 | } |
808 | 807 | ||
809 | /* OK, we've done with the EC header, let's look at the VID header */ | 808 | /* OK, we've done with the EC header, let's look at the VID header */ |
diff --git a/drivers/mtd/ubi/scan.h b/drivers/mtd/ubi/scan.h index bab31695dace..ff179ad7ca55 100644 --- a/drivers/mtd/ubi/scan.h +++ b/drivers/mtd/ubi/scan.h | |||
@@ -103,7 +103,6 @@ struct ubi_scan_volume { | |||
103 | * @ec_sum: a temporary variable used when calculating @mean_ec | 103 | * @ec_sum: a temporary variable used when calculating @mean_ec |
104 | * @ec_count: a temporary variable used when calculating @mean_ec | 104 | * @ec_count: a temporary variable used when calculating @mean_ec |
105 | * @corr_count: count of corrupted PEBs | 105 | * @corr_count: count of corrupted PEBs |
106 | * @image_seq_set: indicates @ubi->image_seq is known | ||
107 | * | 106 | * |
108 | * This data structure contains the result of scanning and may be used by other | 107 | * This data structure contains the result of scanning and may be used by other |
109 | * UBI sub-systems to build final UBI data structures, further error-recovery | 108 | * UBI sub-systems to build final UBI data structures, further error-recovery |
@@ -127,7 +126,6 @@ struct ubi_scan_info { | |||
127 | uint64_t ec_sum; | 126 | uint64_t ec_sum; |
128 | int ec_count; | 127 | int ec_count; |
129 | int corr_count; | 128 | int corr_count; |
130 | int image_seq_set; | ||
131 | }; | 129 | }; |
132 | 130 | ||
133 | struct ubi_device; | 131 | struct ubi_device; |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 04f63c77071d..ce6f1ac25df8 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
@@ -34,6 +34,7 @@ | |||
34 | * | 34 | * |
35 | * | 35 | * |
36 | */ | 36 | */ |
37 | #include <linux/capability.h> | ||
37 | #include <linux/dma-mapping.h> | 38 | #include <linux/dma-mapping.h> |
38 | #include <linux/module.h> | 39 | #include <linux/module.h> |
39 | #include <linux/kernel.h> | 40 | #include <linux/kernel.h> |
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 89876ade5e33..28a0eda92680 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
@@ -243,15 +243,26 @@ static int be_POST_stage_get(struct be_adapter *adapter, u16 *stage) | |||
243 | 243 | ||
244 | int be_cmd_POST(struct be_adapter *adapter) | 244 | int be_cmd_POST(struct be_adapter *adapter) |
245 | { | 245 | { |
246 | u16 stage, error; | 246 | u16 stage; |
247 | int status, timeout = 0; | ||
247 | 248 | ||
248 | error = be_POST_stage_get(adapter, &stage); | 249 | do { |
249 | if (error || stage != POST_STAGE_ARMFW_RDY) { | 250 | status = be_POST_stage_get(adapter, &stage); |
250 | dev_err(&adapter->pdev->dev, "POST failed.\n"); | 251 | if (status) { |
251 | return -1; | 252 | dev_err(&adapter->pdev->dev, "POST error; stage=0x%x\n", |
252 | } | 253 | stage); |
254 | return -1; | ||
255 | } else if (stage != POST_STAGE_ARMFW_RDY) { | ||
256 | set_current_state(TASK_INTERRUPTIBLE); | ||
257 | schedule_timeout(2 * HZ); | ||
258 | timeout += 2; | ||
259 | } else { | ||
260 | return 0; | ||
261 | } | ||
262 | } while (timeout < 20); | ||
253 | 263 | ||
254 | return 0; | 264 | dev_err(&adapter->pdev->dev, "POST timeout; stage=0x%x\n", stage); |
265 | return -1; | ||
255 | } | 266 | } |
256 | 267 | ||
257 | static inline void *embedded_payload(struct be_mcc_wrb *wrb) | 268 | static inline void *embedded_payload(struct be_mcc_wrb *wrb) |
@@ -729,8 +740,8 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q, | |||
729 | /* Create an rx filtering policy configuration on an i/f | 740 | /* Create an rx filtering policy configuration on an i/f |
730 | * Uses mbox | 741 | * Uses mbox |
731 | */ | 742 | */ |
732 | int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, | 743 | int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags, |
733 | bool pmac_invalid, u32 *if_handle, u32 *pmac_id) | 744 | u8 *mac, bool pmac_invalid, u32 *if_handle, u32 *pmac_id) |
734 | { | 745 | { |
735 | struct be_mcc_wrb *wrb; | 746 | struct be_mcc_wrb *wrb; |
736 | struct be_cmd_req_if_create *req; | 747 | struct be_cmd_req_if_create *req; |
@@ -746,8 +757,8 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, | |||
746 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | 757 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, |
747 | OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req)); | 758 | OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req)); |
748 | 759 | ||
749 | req->capability_flags = cpu_to_le32(flags); | 760 | req->capability_flags = cpu_to_le32(cap_flags); |
750 | req->enable_flags = cpu_to_le32(flags); | 761 | req->enable_flags = cpu_to_le32(en_flags); |
751 | req->pmac_invalid = pmac_invalid; | 762 | req->pmac_invalid = pmac_invalid; |
752 | if (!pmac_invalid) | 763 | if (!pmac_invalid) |
753 | memcpy(req->mac_addr, mac, ETH_ALEN); | 764 | memcpy(req->mac_addr, mac, ETH_ALEN); |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index a86f917f85f4..49953787e41c 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -720,8 +720,9 @@ extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | |||
720 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, | 720 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, |
721 | u32 if_id, u32 *pmac_id); | 721 | u32 if_id, u32 *pmac_id); |
722 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id); | 722 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id); |
723 | extern int be_cmd_if_create(struct be_adapter *adapter, u32 if_flags, u8 *mac, | 723 | extern int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, |
724 | bool pmac_invalid, u32 *if_handle, u32 *pmac_id); | 724 | u32 en_flags, u8 *mac, bool pmac_invalid, |
725 | u32 *if_handle, u32 *pmac_id); | ||
725 | extern int be_cmd_if_destroy(struct be_adapter *adapter, u32 if_handle); | 726 | extern int be_cmd_if_destroy(struct be_adapter *adapter, u32 if_handle); |
726 | extern int be_cmd_eq_create(struct be_adapter *adapter, | 727 | extern int be_cmd_eq_create(struct be_adapter *adapter, |
727 | struct be_queue_info *eq, int eq_delay); | 728 | struct be_queue_info *eq, int eq_delay); |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 6d5e81f7046f..1f941f027718 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
@@ -1620,19 +1620,22 @@ static int be_open(struct net_device *netdev) | |||
1620 | static int be_setup(struct be_adapter *adapter) | 1620 | static int be_setup(struct be_adapter *adapter) |
1621 | { | 1621 | { |
1622 | struct net_device *netdev = adapter->netdev; | 1622 | struct net_device *netdev = adapter->netdev; |
1623 | u32 if_flags; | 1623 | u32 cap_flags, en_flags; |
1624 | int status; | 1624 | int status; |
1625 | 1625 | ||
1626 | if_flags = BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_PROMISCUOUS | | 1626 | cap_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | |
1627 | BE_IF_FLAGS_MCAST_PROMISCUOUS | BE_IF_FLAGS_UNTAGGED | | 1627 | BE_IF_FLAGS_MCAST_PROMISCUOUS | |
1628 | BE_IF_FLAGS_PASS_L3L4_ERRORS; | 1628 | BE_IF_FLAGS_PROMISCUOUS | |
1629 | status = be_cmd_if_create(adapter, if_flags, netdev->dev_addr, | 1629 | BE_IF_FLAGS_PASS_L3L4_ERRORS; |
1630 | false/* pmac_invalid */, &adapter->if_handle, | 1630 | en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | |
1631 | &adapter->pmac_id); | 1631 | BE_IF_FLAGS_PASS_L3L4_ERRORS; |
1632 | |||
1633 | status = be_cmd_if_create(adapter, cap_flags, en_flags, | ||
1634 | netdev->dev_addr, false/* pmac_invalid */, | ||
1635 | &adapter->if_handle, &adapter->pmac_id); | ||
1632 | if (status != 0) | 1636 | if (status != 0) |
1633 | goto do_none; | 1637 | goto do_none; |
1634 | 1638 | ||
1635 | |||
1636 | status = be_tx_queues_create(adapter); | 1639 | status = be_tx_queues_create(adapter); |
1637 | if (status != 0) | 1640 | if (status != 0) |
1638 | goto if_destroy; | 1641 | goto if_destroy; |
@@ -2055,6 +2058,10 @@ static int be_hw_up(struct be_adapter *adapter) | |||
2055 | if (status) | 2058 | if (status) |
2056 | return status; | 2059 | return status; |
2057 | 2060 | ||
2061 | status = be_cmd_reset_function(adapter); | ||
2062 | if (status) | ||
2063 | return status; | ||
2064 | |||
2058 | status = be_cmd_get_fw_ver(adapter, adapter->fw_ver); | 2065 | status = be_cmd_get_fw_ver(adapter, adapter->fw_ver); |
2059 | if (status) | 2066 | if (status) |
2060 | return status; | 2067 | return status; |
@@ -2108,10 +2115,6 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
2108 | if (status) | 2115 | if (status) |
2109 | goto free_netdev; | 2116 | goto free_netdev; |
2110 | 2117 | ||
2111 | status = be_cmd_reset_function(adapter); | ||
2112 | if (status) | ||
2113 | goto ctrl_clean; | ||
2114 | |||
2115 | status = be_stats_init(adapter); | 2118 | status = be_stats_init(adapter); |
2116 | if (status) | 2119 | if (status) |
2117 | goto ctrl_clean; | 2120 | goto ctrl_clean; |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index 6c7f795d12de..a4d83409f205 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -361,9 +361,12 @@ struct l2_fhdr { | |||
361 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE (1<<28) | 361 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE (1<<28) |
362 | 362 | ||
363 | #define BNX2_L2CTX_HOST_BDIDX 0x00000004 | 363 | #define BNX2_L2CTX_HOST_BDIDX 0x00000004 |
364 | #define BNX2_L2CTX_STATUSB_NUM_SHIFT 16 | 364 | #define BNX2_L2CTX_L5_STATUSB_NUM_SHIFT 16 |
365 | #define BNX2_L2CTX_STATUSB_NUM(sb_id) \ | 365 | #define BNX2_L2CTX_L2_STATUSB_NUM_SHIFT 24 |
366 | (((sb_id) > 0) ? (((sb_id) + 7) << BNX2_L2CTX_STATUSB_NUM_SHIFT) : 0) | 366 | #define BNX2_L2CTX_L5_STATUSB_NUM(sb_id) \ |
367 | (((sb_id) > 0) ? (((sb_id) + 7) << BNX2_L2CTX_L5_STATUSB_NUM_SHIFT) : 0) | ||
368 | #define BNX2_L2CTX_L2_STATUSB_NUM(sb_id) \ | ||
369 | (((sb_id) > 0) ? (((sb_id) + 7) << BNX2_L2CTX_L2_STATUSB_NUM_SHIFT) : 0) | ||
367 | #define BNX2_L2CTX_HOST_BSEQ 0x00000008 | 370 | #define BNX2_L2CTX_HOST_BSEQ 0x00000008 |
368 | #define BNX2_L2CTX_NX_BSEQ 0x0000000c | 371 | #define BNX2_L2CTX_NX_BSEQ 0x0000000c |
369 | #define BNX2_L2CTX_NX_BDHADDR_HI 0x00000010 | 372 | #define BNX2_L2CTX_NX_BDHADDR_HI 0x00000010 |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 69c5b15e22da..40fb5eefc72e 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -691,7 +691,7 @@ static int bond_check_dev_link(struct bonding *bond, | |||
691 | struct net_device *slave_dev, int reporting) | 691 | struct net_device *slave_dev, int reporting) |
692 | { | 692 | { |
693 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; | 693 | const struct net_device_ops *slave_ops = slave_dev->netdev_ops; |
694 | static int (*ioctl)(struct net_device *, struct ifreq *, int); | 694 | int (*ioctl)(struct net_device *, struct ifreq *, int); |
695 | struct ifreq ifr; | 695 | struct ifreq ifr; |
696 | struct mii_ioctl_data *mii; | 696 | struct mii_ioctl_data *mii; |
697 | 697 | ||
@@ -3665,10 +3665,10 @@ static int bond_xmit_hash_policy_l23(struct sk_buff *skb, | |||
3665 | 3665 | ||
3666 | if (skb->protocol == htons(ETH_P_IP)) { | 3666 | if (skb->protocol == htons(ETH_P_IP)) { |
3667 | return ((ntohl(iph->saddr ^ iph->daddr) & 0xffff) ^ | 3667 | return ((ntohl(iph->saddr ^ iph->daddr) & 0xffff) ^ |
3668 | (data->h_dest[5] ^ bond_dev->dev_addr[5])) % count; | 3668 | (data->h_dest[5] ^ data->h_source[5])) % count; |
3669 | } | 3669 | } |
3670 | 3670 | ||
3671 | return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | 3671 | return (data->h_dest[5] ^ data->h_source[5]) % count; |
3672 | } | 3672 | } |
3673 | 3673 | ||
3674 | /* | 3674 | /* |
@@ -3695,7 +3695,7 @@ static int bond_xmit_hash_policy_l34(struct sk_buff *skb, | |||
3695 | 3695 | ||
3696 | } | 3696 | } |
3697 | 3697 | ||
3698 | return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | 3698 | return (data->h_dest[5] ^ data->h_source[5]) % count; |
3699 | } | 3699 | } |
3700 | 3700 | ||
3701 | /* | 3701 | /* |
@@ -3706,7 +3706,7 @@ static int bond_xmit_hash_policy_l2(struct sk_buff *skb, | |||
3706 | { | 3706 | { |
3707 | struct ethhdr *data = (struct ethhdr *)skb->data; | 3707 | struct ethhdr *data = (struct ethhdr *)skb->data; |
3708 | 3708 | ||
3709 | return (data->h_dest[5] ^ bond_dev->dev_addr[5]) % count; | 3709 | return (data->h_dest[5] ^ data->h_source[5]) % count; |
3710 | } | 3710 | } |
3711 | 3711 | ||
3712 | /*-------------------------- Device entry points ----------------------------*/ | 3712 | /*-------------------------- Device entry points ----------------------------*/ |
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c index 46c87ec7960c..3bf1b04f2cab 100644 --- a/drivers/net/cnic.c +++ b/drivers/net/cnic.c | |||
@@ -2264,9 +2264,9 @@ static void cnic_init_bnx2_rx_ring(struct cnic_dev *dev) | |||
2264 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_CTX_TYPE, val); | 2264 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_CTX_TYPE, val); |
2265 | 2265 | ||
2266 | if (sb_id == 0) | 2266 | if (sb_id == 0) |
2267 | val = 2 << BNX2_L2CTX_STATUSB_NUM_SHIFT; | 2267 | val = 2 << BNX2_L2CTX_L2_STATUSB_NUM_SHIFT; |
2268 | else | 2268 | else |
2269 | val = BNX2_L2CTX_STATUSB_NUM(sb_id); | 2269 | val = BNX2_L2CTX_L2_STATUSB_NUM(sb_id); |
2270 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_HOST_BDIDX, val); | 2270 | cnic_ctx_wr(dev, cid_addr, BNX2_L2CTX_HOST_BDIDX, val); |
2271 | 2271 | ||
2272 | rxbd = (struct rx_bd *) (cp->l2_ring + BCM_PAGE_SIZE); | 2272 | rxbd = (struct rx_bd *) (cp->l2_ring + BCM_PAGE_SIZE); |
@@ -2423,7 +2423,7 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev) | |||
2423 | cp->int_num = 0; | 2423 | cp->int_num = 0; |
2424 | if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { | 2424 | if (ethdev->drv_state & CNIC_DRV_STATE_USING_MSIX) { |
2425 | u32 sb_id = cp->status_blk_num; | 2425 | u32 sb_id = cp->status_blk_num; |
2426 | u32 sb = BNX2_L2CTX_STATUSB_NUM(sb_id); | 2426 | u32 sb = BNX2_L2CTX_L5_STATUSB_NUM(sb_id); |
2427 | 2427 | ||
2428 | cp->int_num = sb_id << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT; | 2428 | cp->int_num = sb_id << BNX2_PCICFG_INT_ACK_CMD_INT_NUM_SHIFT; |
2429 | cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); | 2429 | cnic_ctx_wr(dev, cp->kwq_cid_addr, L5_KRNLQ_HOST_QIDX, sb); |
diff --git a/drivers/net/dm9000.h b/drivers/net/dm9000.h index 80817c2edfb3..fb1c924d79b4 100644 --- a/drivers/net/dm9000.h +++ b/drivers/net/dm9000.h | |||
@@ -50,7 +50,7 @@ | |||
50 | #define DM9000_RCSR 0x32 | 50 | #define DM9000_RCSR 0x32 |
51 | 51 | ||
52 | #define CHIPR_DM9000A 0x19 | 52 | #define CHIPR_DM9000A 0x19 |
53 | #define CHIPR_DM9000B 0x1B | 53 | #define CHIPR_DM9000B 0x1A |
54 | 54 | ||
55 | #define DM9000_MRCMDX 0xF0 | 55 | #define DM9000_MRCMDX 0xF0 |
56 | #define DM9000_MRCMD 0xF2 | 56 | #define DM9000_MRCMD 0xF2 |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 5d2f48f02251..3c29a20b751e 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -1427,19 +1427,31 @@ static int e100_phy_init(struct nic *nic) | |||
1427 | } else | 1427 | } else |
1428 | DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id); | 1428 | DPRINTK(HW, DEBUG, "phy_addr = %d\n", nic->mii.phy_id); |
1429 | 1429 | ||
1430 | /* Isolate all the PHY ids */ | ||
1431 | for (addr = 0; addr < 32; addr++) | ||
1432 | mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE); | ||
1433 | /* Select the discovered PHY */ | ||
1434 | bmcr &= ~BMCR_ISOLATE; | ||
1435 | mdio_write(netdev, nic->mii.phy_id, MII_BMCR, bmcr); | ||
1436 | |||
1437 | /* Get phy ID */ | 1430 | /* Get phy ID */ |
1438 | id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1); | 1431 | id_lo = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID1); |
1439 | id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2); | 1432 | id_hi = mdio_read(netdev, nic->mii.phy_id, MII_PHYSID2); |
1440 | nic->phy = (u32)id_hi << 16 | (u32)id_lo; | 1433 | nic->phy = (u32)id_hi << 16 | (u32)id_lo; |
1441 | DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy); | 1434 | DPRINTK(HW, DEBUG, "phy ID = 0x%08X\n", nic->phy); |
1442 | 1435 | ||
1436 | /* Select the phy and isolate the rest */ | ||
1437 | for (addr = 0; addr < 32; addr++) { | ||
1438 | if (addr != nic->mii.phy_id) { | ||
1439 | mdio_write(netdev, addr, MII_BMCR, BMCR_ISOLATE); | ||
1440 | } else if (nic->phy != phy_82552_v) { | ||
1441 | bmcr = mdio_read(netdev, addr, MII_BMCR); | ||
1442 | mdio_write(netdev, addr, MII_BMCR, | ||
1443 | bmcr & ~BMCR_ISOLATE); | ||
1444 | } | ||
1445 | } | ||
1446 | /* | ||
1447 | * Workaround for 82552: | ||
1448 | * Clear the ISOLATE bit on selected phy_id last (mirrored on all | ||
1449 | * other phy_id's) using bmcr value from addr discovery loop above. | ||
1450 | */ | ||
1451 | if (nic->phy == phy_82552_v) | ||
1452 | mdio_write(netdev, nic->mii.phy_id, MII_BMCR, | ||
1453 | bmcr & ~BMCR_ISOLATE); | ||
1454 | |||
1443 | /* Handle National tx phys */ | 1455 | /* Handle National tx phys */ |
1444 | #define NCS_PHY_MODEL_MASK 0xFFF0FFFF | 1456 | #define NCS_PHY_MODEL_MASK 0xFFF0FFFF |
1445 | if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) { | 1457 | if ((nic->phy & NCS_PHY_MODEL_MASK) == phy_nsc_tx) { |
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h index c0f185beb8bc..1190167a8b3d 100644 --- a/drivers/net/e1000e/defines.h +++ b/drivers/net/e1000e/defines.h | |||
@@ -76,6 +76,7 @@ | |||
76 | /* Extended Device Control */ | 76 | /* Extended Device Control */ |
77 | #define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ | 77 | #define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Definable Pin 7 */ |
78 | #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ | 78 | #define E1000_CTRL_EXT_EE_RST 0x00002000 /* Reinitialize from EEPROM */ |
79 | #define E1000_CTRL_EXT_SPD_BYPS 0x00008000 /* Speed Select Bypass */ | ||
79 | #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ | 80 | #define E1000_CTRL_EXT_RO_DIS 0x00020000 /* Relaxed Ordering disable */ |
80 | #define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ | 81 | #define E1000_CTRL_EXT_DMA_DYN_CLK_EN 0x00080000 /* DMA Dynamic Clock Gating */ |
81 | #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 | 82 | #define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000 |
@@ -347,6 +348,7 @@ | |||
347 | /* Extended Configuration Control and Size */ | 348 | /* Extended Configuration Control and Size */ |
348 | #define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 | 349 | #define E1000_EXTCNF_CTRL_MDIO_SW_OWNERSHIP 0x00000020 |
349 | #define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 | 350 | #define E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE 0x00000001 |
351 | #define E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE 0x00000008 | ||
350 | #define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 | 352 | #define E1000_EXTCNF_CTRL_SWFLAG 0x00000020 |
351 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 | 353 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK 0x00FF0000 |
352 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 | 354 | #define E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT 16 |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 981936c1fb46..189dfa2d6c76 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -141,6 +141,20 @@ struct e1000_info; | |||
141 | #define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */ | 141 | #define HV_TNCRS_UPPER PHY_REG(778, 29) /* Transmit with no CRS */ |
142 | #define HV_TNCRS_LOWER PHY_REG(778, 30) | 142 | #define HV_TNCRS_LOWER PHY_REG(778, 30) |
143 | 143 | ||
144 | /* BM PHY Copper Specific Status */ | ||
145 | #define BM_CS_STATUS 17 | ||
146 | #define BM_CS_STATUS_LINK_UP 0x0400 | ||
147 | #define BM_CS_STATUS_RESOLVED 0x0800 | ||
148 | #define BM_CS_STATUS_SPEED_MASK 0xC000 | ||
149 | #define BM_CS_STATUS_SPEED_1000 0x8000 | ||
150 | |||
151 | /* 82577 Mobile Phy Status Register */ | ||
152 | #define HV_M_STATUS 26 | ||
153 | #define HV_M_STATUS_AUTONEG_COMPLETE 0x1000 | ||
154 | #define HV_M_STATUS_SPEED_MASK 0x0300 | ||
155 | #define HV_M_STATUS_SPEED_1000 0x0200 | ||
156 | #define HV_M_STATUS_LINK_UP 0x0040 | ||
157 | |||
144 | enum e1000_boards { | 158 | enum e1000_boards { |
145 | board_82571, | 159 | board_82571, |
146 | board_82572, | 160 | board_82572, |
@@ -519,9 +533,13 @@ extern s32 e1000e_phy_force_speed_duplex_igp(struct e1000_hw *hw); | |||
519 | extern s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw); | 533 | extern s32 e1000e_get_cable_length_igp_2(struct e1000_hw *hw); |
520 | extern s32 e1000e_get_phy_info_igp(struct e1000_hw *hw); | 534 | extern s32 e1000e_get_phy_info_igp(struct e1000_hw *hw); |
521 | extern s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); | 535 | extern s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data); |
536 | extern s32 e1000e_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, | ||
537 | u16 *data); | ||
522 | extern s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw); | 538 | extern s32 e1000e_phy_hw_reset_generic(struct e1000_hw *hw); |
523 | extern s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active); | 539 | extern s32 e1000e_set_d3_lplu_state(struct e1000_hw *hw, bool active); |
524 | extern s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); | 540 | extern s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data); |
541 | extern s32 e1000e_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, | ||
542 | u16 data); | ||
525 | extern s32 e1000e_phy_sw_reset(struct e1000_hw *hw); | 543 | extern s32 e1000e_phy_sw_reset(struct e1000_hw *hw); |
526 | extern s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw); | 544 | extern s32 e1000e_phy_force_speed_duplex_m88(struct e1000_hw *hw); |
527 | extern s32 e1000e_get_cfg_done(struct e1000_hw *hw); | 545 | extern s32 e1000e_get_cfg_done(struct e1000_hw *hw); |
@@ -538,7 +556,11 @@ extern s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data); | |||
538 | extern s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data); | 556 | extern s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data); |
539 | extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); | 557 | extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); |
540 | extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); | 558 | extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); |
559 | extern s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, | ||
560 | u16 data); | ||
541 | extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); | 561 | extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); |
562 | extern s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, | ||
563 | u16 *data); | ||
542 | extern s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, | 564 | extern s32 e1000e_phy_has_link_generic(struct e1000_hw *hw, u32 iterations, |
543 | u32 usec_interval, bool *success); | 565 | u32 usec_interval, bool *success); |
544 | extern s32 e1000e_phy_reset_dsp(struct e1000_hw *hw); | 566 | extern s32 e1000e_phy_reset_dsp(struct e1000_hw *hw); |
@@ -546,7 +568,11 @@ extern s32 e1000e_read_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 *data); | |||
546 | extern s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); | 568 | extern s32 e1000e_write_phy_reg_mdic(struct e1000_hw *hw, u32 offset, u16 data); |
547 | extern s32 e1000e_check_downshift(struct e1000_hw *hw); | 569 | extern s32 e1000e_check_downshift(struct e1000_hw *hw); |
548 | extern s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data); | 570 | extern s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data); |
571 | extern s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, | ||
572 | u16 *data); | ||
549 | extern s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data); | 573 | extern s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data); |
574 | extern s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, | ||
575 | u16 data); | ||
550 | extern s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow); | 576 | extern s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow); |
551 | extern s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw); | 577 | extern s32 e1000_link_stall_workaround_hv(struct e1000_hw *hw); |
552 | extern s32 e1000_copper_link_setup_82577(struct e1000_hw *hw); | 578 | extern s32 e1000_copper_link_setup_82577(struct e1000_hw *hw); |
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index fd44d9f90769..aaea41ef794d 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
@@ -764,11 +764,13 @@ struct e1000_phy_operations { | |||
764 | s32 (*get_cable_length)(struct e1000_hw *); | 764 | s32 (*get_cable_length)(struct e1000_hw *); |
765 | s32 (*get_phy_info)(struct e1000_hw *); | 765 | s32 (*get_phy_info)(struct e1000_hw *); |
766 | s32 (*read_phy_reg)(struct e1000_hw *, u32, u16 *); | 766 | s32 (*read_phy_reg)(struct e1000_hw *, u32, u16 *); |
767 | s32 (*read_phy_reg_locked)(struct e1000_hw *, u32, u16 *); | ||
767 | void (*release_phy)(struct e1000_hw *); | 768 | void (*release_phy)(struct e1000_hw *); |
768 | s32 (*reset_phy)(struct e1000_hw *); | 769 | s32 (*reset_phy)(struct e1000_hw *); |
769 | s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); | 770 | s32 (*set_d0_lplu_state)(struct e1000_hw *, bool); |
770 | s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); | 771 | s32 (*set_d3_lplu_state)(struct e1000_hw *, bool); |
771 | s32 (*write_phy_reg)(struct e1000_hw *, u32, u16); | 772 | s32 (*write_phy_reg)(struct e1000_hw *, u32, u16); |
773 | s32 (*write_phy_reg_locked)(struct e1000_hw *, u32, u16); | ||
772 | s32 (*cfg_on_link_up)(struct e1000_hw *); | 774 | s32 (*cfg_on_link_up)(struct e1000_hw *); |
773 | }; | 775 | }; |
774 | 776 | ||
@@ -901,6 +903,7 @@ struct e1000_shadow_ram { | |||
901 | struct e1000_dev_spec_ich8lan { | 903 | struct e1000_dev_spec_ich8lan { |
902 | bool kmrn_lock_loss_workaround_enabled; | 904 | bool kmrn_lock_loss_workaround_enabled; |
903 | struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; | 905 | struct e1000_shadow_ram shadow_ram[E1000_ICH8_SHADOW_RAM_WORDS]; |
906 | bool nvm_k1_enabled; | ||
904 | }; | 907 | }; |
905 | 908 | ||
906 | struct e1000_hw { | 909 | struct e1000_hw { |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 99df2abf82a9..51ddb04ab195 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -122,6 +122,27 @@ | |||
122 | 122 | ||
123 | #define HV_LED_CONFIG PHY_REG(768, 30) /* LED Configuration */ | 123 | #define HV_LED_CONFIG PHY_REG(768, 30) /* LED Configuration */ |
124 | 124 | ||
125 | #define SW_FLAG_TIMEOUT 1000 /* SW Semaphore flag timeout in milliseconds */ | ||
126 | |||
127 | /* SMBus Address Phy Register */ | ||
128 | #define HV_SMB_ADDR PHY_REG(768, 26) | ||
129 | #define HV_SMB_ADDR_PEC_EN 0x0200 | ||
130 | #define HV_SMB_ADDR_VALID 0x0080 | ||
131 | |||
132 | /* Strapping Option Register - RO */ | ||
133 | #define E1000_STRAP 0x0000C | ||
134 | #define E1000_STRAP_SMBUS_ADDRESS_MASK 0x00FE0000 | ||
135 | #define E1000_STRAP_SMBUS_ADDRESS_SHIFT 17 | ||
136 | |||
137 | /* OEM Bits Phy Register */ | ||
138 | #define HV_OEM_BITS PHY_REG(768, 25) | ||
139 | #define HV_OEM_BITS_LPLU 0x0004 /* Low Power Link Up */ | ||
140 | #define HV_OEM_BITS_GBE_DIS 0x0040 /* Gigabit Disable */ | ||
141 | #define HV_OEM_BITS_RESTART_AN 0x0400 /* Restart Auto-negotiation */ | ||
142 | |||
143 | #define E1000_NVM_K1_CONFIG 0x1B /* NVM K1 Config Word */ | ||
144 | #define E1000_NVM_K1_ENABLE 0x1 /* NVM Enable K1 bit */ | ||
145 | |||
125 | /* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ | 146 | /* ICH GbE Flash Hardware Sequencing Flash Status Register bit breakdown */ |
126 | /* Offset 04h HSFSTS */ | 147 | /* Offset 04h HSFSTS */ |
127 | union ich8_hws_flash_status { | 148 | union ich8_hws_flash_status { |
@@ -200,6 +221,10 @@ static s32 e1000_setup_led_pchlan(struct e1000_hw *hw); | |||
200 | static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw); | 221 | static s32 e1000_cleanup_led_pchlan(struct e1000_hw *hw); |
201 | static s32 e1000_led_on_pchlan(struct e1000_hw *hw); | 222 | static s32 e1000_led_on_pchlan(struct e1000_hw *hw); |
202 | static s32 e1000_led_off_pchlan(struct e1000_hw *hw); | 223 | static s32 e1000_led_off_pchlan(struct e1000_hw *hw); |
224 | static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active); | ||
225 | static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw); | ||
226 | static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link); | ||
227 | static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable); | ||
203 | 228 | ||
204 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) | 229 | static inline u16 __er16flash(struct e1000_hw *hw, unsigned long reg) |
205 | { | 230 | { |
@@ -242,7 +267,11 @@ static s32 e1000_init_phy_params_pchlan(struct e1000_hw *hw) | |||
242 | 267 | ||
243 | phy->ops.check_polarity = e1000_check_polarity_ife_ich8lan; | 268 | phy->ops.check_polarity = e1000_check_polarity_ife_ich8lan; |
244 | phy->ops.read_phy_reg = e1000_read_phy_reg_hv; | 269 | phy->ops.read_phy_reg = e1000_read_phy_reg_hv; |
270 | phy->ops.read_phy_reg_locked = e1000_read_phy_reg_hv_locked; | ||
271 | phy->ops.set_d0_lplu_state = e1000_set_lplu_state_pchlan; | ||
272 | phy->ops.set_d3_lplu_state = e1000_set_lplu_state_pchlan; | ||
245 | phy->ops.write_phy_reg = e1000_write_phy_reg_hv; | 273 | phy->ops.write_phy_reg = e1000_write_phy_reg_hv; |
274 | phy->ops.write_phy_reg_locked = e1000_write_phy_reg_hv_locked; | ||
246 | phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; | 275 | phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; |
247 | 276 | ||
248 | phy->id = e1000_phy_unknown; | 277 | phy->id = e1000_phy_unknown; |
@@ -303,6 +332,8 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) | |||
303 | case IGP03E1000_E_PHY_ID: | 332 | case IGP03E1000_E_PHY_ID: |
304 | phy->type = e1000_phy_igp_3; | 333 | phy->type = e1000_phy_igp_3; |
305 | phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; | 334 | phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; |
335 | phy->ops.read_phy_reg_locked = e1000e_read_phy_reg_igp_locked; | ||
336 | phy->ops.write_phy_reg_locked = e1000e_write_phy_reg_igp_locked; | ||
306 | break; | 337 | break; |
307 | case IFE_E_PHY_ID: | 338 | case IFE_E_PHY_ID: |
308 | case IFE_PLUS_E_PHY_ID: | 339 | case IFE_PLUS_E_PHY_ID: |
@@ -469,14 +500,6 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | |||
469 | goto out; | 500 | goto out; |
470 | } | 501 | } |
471 | 502 | ||
472 | if (hw->mac.type == e1000_pchlan) { | ||
473 | ret_val = e1000e_write_kmrn_reg(hw, | ||
474 | E1000_KMRNCTRLSTA_K1_CONFIG, | ||
475 | E1000_KMRNCTRLSTA_K1_ENABLE); | ||
476 | if (ret_val) | ||
477 | goto out; | ||
478 | } | ||
479 | |||
480 | /* | 503 | /* |
481 | * First we want to see if the MII Status Register reports | 504 | * First we want to see if the MII Status Register reports |
482 | * link. If so, then we want to get the current speed/duplex | 505 | * link. If so, then we want to get the current speed/duplex |
@@ -486,6 +509,12 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw) | |||
486 | if (ret_val) | 509 | if (ret_val) |
487 | goto out; | 510 | goto out; |
488 | 511 | ||
512 | if (hw->mac.type == e1000_pchlan) { | ||
513 | ret_val = e1000_k1_gig_workaround_hv(hw, link); | ||
514 | if (ret_val) | ||
515 | goto out; | ||
516 | } | ||
517 | |||
489 | if (!link) | 518 | if (!link) |
490 | goto out; /* No link detected */ | 519 | goto out; /* No link detected */ |
491 | 520 | ||
@@ -568,12 +597,39 @@ static s32 e1000_get_variants_ich8lan(struct e1000_adapter *adapter) | |||
568 | static DEFINE_MUTEX(nvm_mutex); | 597 | static DEFINE_MUTEX(nvm_mutex); |
569 | 598 | ||
570 | /** | 599 | /** |
600 | * e1000_acquire_nvm_ich8lan - Acquire NVM mutex | ||
601 | * @hw: pointer to the HW structure | ||
602 | * | ||
603 | * Acquires the mutex for performing NVM operations. | ||
604 | **/ | ||
605 | static s32 e1000_acquire_nvm_ich8lan(struct e1000_hw *hw) | ||
606 | { | ||
607 | mutex_lock(&nvm_mutex); | ||
608 | |||
609 | return 0; | ||
610 | } | ||
611 | |||
612 | /** | ||
613 | * e1000_release_nvm_ich8lan - Release NVM mutex | ||
614 | * @hw: pointer to the HW structure | ||
615 | * | ||
616 | * Releases the mutex used while performing NVM operations. | ||
617 | **/ | ||
618 | static void e1000_release_nvm_ich8lan(struct e1000_hw *hw) | ||
619 | { | ||
620 | mutex_unlock(&nvm_mutex); | ||
621 | |||
622 | return; | ||
623 | } | ||
624 | |||
625 | static DEFINE_MUTEX(swflag_mutex); | ||
626 | |||
627 | /** | ||
571 | * e1000_acquire_swflag_ich8lan - Acquire software control flag | 628 | * e1000_acquire_swflag_ich8lan - Acquire software control flag |
572 | * @hw: pointer to the HW structure | 629 | * @hw: pointer to the HW structure |
573 | * | 630 | * |
574 | * Acquires the software control flag for performing NVM and PHY | 631 | * Acquires the software control flag for performing PHY and select |
575 | * operations. This is a function pointer entry point only called by | 632 | * MAC CSR accesses. |
576 | * read/write routines for the PHY and NVM parts. | ||
577 | **/ | 633 | **/ |
578 | static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | 634 | static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) |
579 | { | 635 | { |
@@ -582,7 +638,7 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
582 | 638 | ||
583 | might_sleep(); | 639 | might_sleep(); |
584 | 640 | ||
585 | mutex_lock(&nvm_mutex); | 641 | mutex_lock(&swflag_mutex); |
586 | 642 | ||
587 | while (timeout) { | 643 | while (timeout) { |
588 | extcnf_ctrl = er32(EXTCNF_CTRL); | 644 | extcnf_ctrl = er32(EXTCNF_CTRL); |
@@ -599,7 +655,7 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
599 | goto out; | 655 | goto out; |
600 | } | 656 | } |
601 | 657 | ||
602 | timeout = PHY_CFG_TIMEOUT * 2; | 658 | timeout = SW_FLAG_TIMEOUT; |
603 | 659 | ||
604 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; | 660 | extcnf_ctrl |= E1000_EXTCNF_CTRL_SWFLAG; |
605 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 661 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
@@ -623,7 +679,7 @@ static s32 e1000_acquire_swflag_ich8lan(struct e1000_hw *hw) | |||
623 | 679 | ||
624 | out: | 680 | out: |
625 | if (ret_val) | 681 | if (ret_val) |
626 | mutex_unlock(&nvm_mutex); | 682 | mutex_unlock(&swflag_mutex); |
627 | 683 | ||
628 | return ret_val; | 684 | return ret_val; |
629 | } | 685 | } |
@@ -632,9 +688,8 @@ out: | |||
632 | * e1000_release_swflag_ich8lan - Release software control flag | 688 | * e1000_release_swflag_ich8lan - Release software control flag |
633 | * @hw: pointer to the HW structure | 689 | * @hw: pointer to the HW structure |
634 | * | 690 | * |
635 | * Releases the software control flag for performing NVM and PHY operations. | 691 | * Releases the software control flag for performing PHY and select |
636 | * This is a function pointer entry point only called by read/write | 692 | * MAC CSR accesses. |
637 | * routines for the PHY and NVM parts. | ||
638 | **/ | 693 | **/ |
639 | static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | 694 | static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) |
640 | { | 695 | { |
@@ -644,7 +699,9 @@ static void e1000_release_swflag_ich8lan(struct e1000_hw *hw) | |||
644 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; | 699 | extcnf_ctrl &= ~E1000_EXTCNF_CTRL_SWFLAG; |
645 | ew32(EXTCNF_CTRL, extcnf_ctrl); | 700 | ew32(EXTCNF_CTRL, extcnf_ctrl); |
646 | 701 | ||
647 | mutex_unlock(&nvm_mutex); | 702 | mutex_unlock(&swflag_mutex); |
703 | |||
704 | return; | ||
648 | } | 705 | } |
649 | 706 | ||
650 | /** | 707 | /** |
@@ -752,6 +809,326 @@ static s32 e1000_phy_force_speed_duplex_ich8lan(struct e1000_hw *hw) | |||
752 | } | 809 | } |
753 | 810 | ||
754 | /** | 811 | /** |
812 | * e1000_sw_lcd_config_ich8lan - SW-based LCD Configuration | ||
813 | * @hw: pointer to the HW structure | ||
814 | * | ||
815 | * SW should configure the LCD from the NVM extended configuration region | ||
816 | * as a workaround for certain parts. | ||
817 | **/ | ||
818 | static s32 e1000_sw_lcd_config_ich8lan(struct e1000_hw *hw) | ||
819 | { | ||
820 | struct e1000_phy_info *phy = &hw->phy; | ||
821 | u32 i, data, cnf_size, cnf_base_addr, sw_cfg_mask; | ||
822 | s32 ret_val; | ||
823 | u16 word_addr, reg_data, reg_addr, phy_page = 0; | ||
824 | |||
825 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
826 | if (ret_val) | ||
827 | return ret_val; | ||
828 | |||
829 | /* | ||
830 | * Initialize the PHY from the NVM on ICH platforms. This | ||
831 | * is needed due to an issue where the NVM configuration is | ||
832 | * not properly autoloaded after power transitions. | ||
833 | * Therefore, after each PHY reset, we will load the | ||
834 | * configuration data out of the NVM manually. | ||
835 | */ | ||
836 | if ((hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) || | ||
837 | (hw->mac.type == e1000_pchlan)) { | ||
838 | struct e1000_adapter *adapter = hw->adapter; | ||
839 | |||
840 | /* Check if SW needs to configure the PHY */ | ||
841 | if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) || | ||
842 | (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M) || | ||
843 | (hw->mac.type == e1000_pchlan)) | ||
844 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; | ||
845 | else | ||
846 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | ||
847 | |||
848 | data = er32(FEXTNVM); | ||
849 | if (!(data & sw_cfg_mask)) | ||
850 | goto out; | ||
851 | |||
852 | /* Wait for basic configuration completes before proceeding */ | ||
853 | e1000_lan_init_done_ich8lan(hw); | ||
854 | |||
855 | /* | ||
856 | * Make sure HW does not configure LCD from PHY | ||
857 | * extended configuration before SW configuration | ||
858 | */ | ||
859 | data = er32(EXTCNF_CTRL); | ||
860 | if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) | ||
861 | goto out; | ||
862 | |||
863 | cnf_size = er32(EXTCNF_SIZE); | ||
864 | cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; | ||
865 | cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; | ||
866 | if (!cnf_size) | ||
867 | goto out; | ||
868 | |||
869 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | ||
870 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | ||
871 | |||
872 | if (!(data & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) && | ||
873 | (hw->mac.type == e1000_pchlan)) { | ||
874 | /* | ||
875 | * HW configures the SMBus address and LEDs when the | ||
876 | * OEM and LCD Write Enable bits are set in the NVM. | ||
877 | * When both NVM bits are cleared, SW will configure | ||
878 | * them instead. | ||
879 | */ | ||
880 | data = er32(STRAP); | ||
881 | data &= E1000_STRAP_SMBUS_ADDRESS_MASK; | ||
882 | reg_data = data >> E1000_STRAP_SMBUS_ADDRESS_SHIFT; | ||
883 | reg_data |= HV_SMB_ADDR_PEC_EN | HV_SMB_ADDR_VALID; | ||
884 | ret_val = e1000_write_phy_reg_hv_locked(hw, HV_SMB_ADDR, | ||
885 | reg_data); | ||
886 | if (ret_val) | ||
887 | goto out; | ||
888 | |||
889 | data = er32(LEDCTL); | ||
890 | ret_val = e1000_write_phy_reg_hv_locked(hw, | ||
891 | HV_LED_CONFIG, | ||
892 | (u16)data); | ||
893 | if (ret_val) | ||
894 | goto out; | ||
895 | } | ||
896 | /* Configure LCD from extended configuration region. */ | ||
897 | |||
898 | /* cnf_base_addr is in DWORD */ | ||
899 | word_addr = (u16)(cnf_base_addr << 1); | ||
900 | |||
901 | for (i = 0; i < cnf_size; i++) { | ||
902 | ret_val = e1000_read_nvm(hw, (word_addr + i * 2), 1, | ||
903 | ®_data); | ||
904 | if (ret_val) | ||
905 | goto out; | ||
906 | |||
907 | ret_val = e1000_read_nvm(hw, (word_addr + i * 2 + 1), | ||
908 | 1, ®_addr); | ||
909 | if (ret_val) | ||
910 | goto out; | ||
911 | |||
912 | /* Save off the PHY page for future writes. */ | ||
913 | if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { | ||
914 | phy_page = reg_data; | ||
915 | continue; | ||
916 | } | ||
917 | |||
918 | reg_addr &= PHY_REG_MASK; | ||
919 | reg_addr |= phy_page; | ||
920 | |||
921 | ret_val = phy->ops.write_phy_reg_locked(hw, | ||
922 | (u32)reg_addr, | ||
923 | reg_data); | ||
924 | if (ret_val) | ||
925 | goto out; | ||
926 | } | ||
927 | } | ||
928 | |||
929 | out: | ||
930 | hw->phy.ops.release_phy(hw); | ||
931 | return ret_val; | ||
932 | } | ||
933 | |||
934 | /** | ||
935 | * e1000_k1_gig_workaround_hv - K1 Si workaround | ||
936 | * @hw: pointer to the HW structure | ||
937 | * @link: link up bool flag | ||
938 | * | ||
939 | * If K1 is enabled for 1Gbps, the MAC might stall when transitioning | ||
940 | * from a lower speed. This workaround disables K1 whenever link is at 1Gig | ||
941 | * If link is down, the function will restore the default K1 setting located | ||
942 | * in the NVM. | ||
943 | **/ | ||
944 | static s32 e1000_k1_gig_workaround_hv(struct e1000_hw *hw, bool link) | ||
945 | { | ||
946 | s32 ret_val = 0; | ||
947 | u16 status_reg = 0; | ||
948 | bool k1_enable = hw->dev_spec.ich8lan.nvm_k1_enabled; | ||
949 | |||
950 | if (hw->mac.type != e1000_pchlan) | ||
951 | goto out; | ||
952 | |||
953 | /* Wrap the whole flow with the sw flag */ | ||
954 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
955 | if (ret_val) | ||
956 | goto out; | ||
957 | |||
958 | /* Disable K1 when link is 1Gbps, otherwise use the NVM setting */ | ||
959 | if (link) { | ||
960 | if (hw->phy.type == e1000_phy_82578) { | ||
961 | ret_val = hw->phy.ops.read_phy_reg_locked(hw, | ||
962 | BM_CS_STATUS, | ||
963 | &status_reg); | ||
964 | if (ret_val) | ||
965 | goto release; | ||
966 | |||
967 | status_reg &= BM_CS_STATUS_LINK_UP | | ||
968 | BM_CS_STATUS_RESOLVED | | ||
969 | BM_CS_STATUS_SPEED_MASK; | ||
970 | |||
971 | if (status_reg == (BM_CS_STATUS_LINK_UP | | ||
972 | BM_CS_STATUS_RESOLVED | | ||
973 | BM_CS_STATUS_SPEED_1000)) | ||
974 | k1_enable = false; | ||
975 | } | ||
976 | |||
977 | if (hw->phy.type == e1000_phy_82577) { | ||
978 | ret_val = hw->phy.ops.read_phy_reg_locked(hw, | ||
979 | HV_M_STATUS, | ||
980 | &status_reg); | ||
981 | if (ret_val) | ||
982 | goto release; | ||
983 | |||
984 | status_reg &= HV_M_STATUS_LINK_UP | | ||
985 | HV_M_STATUS_AUTONEG_COMPLETE | | ||
986 | HV_M_STATUS_SPEED_MASK; | ||
987 | |||
988 | if (status_reg == (HV_M_STATUS_LINK_UP | | ||
989 | HV_M_STATUS_AUTONEG_COMPLETE | | ||
990 | HV_M_STATUS_SPEED_1000)) | ||
991 | k1_enable = false; | ||
992 | } | ||
993 | |||
994 | /* Link stall fix for link up */ | ||
995 | ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19), | ||
996 | 0x0100); | ||
997 | if (ret_val) | ||
998 | goto release; | ||
999 | |||
1000 | } else { | ||
1001 | /* Link stall fix for link down */ | ||
1002 | ret_val = hw->phy.ops.write_phy_reg_locked(hw, PHY_REG(770, 19), | ||
1003 | 0x4100); | ||
1004 | if (ret_val) | ||
1005 | goto release; | ||
1006 | } | ||
1007 | |||
1008 | ret_val = e1000_configure_k1_ich8lan(hw, k1_enable); | ||
1009 | |||
1010 | release: | ||
1011 | hw->phy.ops.release_phy(hw); | ||
1012 | out: | ||
1013 | return ret_val; | ||
1014 | } | ||
1015 | |||
1016 | /** | ||
1017 | * e1000_configure_k1_ich8lan - Configure K1 power state | ||
1018 | * @hw: pointer to the HW structure | ||
1019 | * @enable: K1 state to configure | ||
1020 | * | ||
1021 | * Configure the K1 power state based on the provided parameter. | ||
1022 | * Assumes semaphore already acquired. | ||
1023 | * | ||
1024 | * Success returns 0, Failure returns -E1000_ERR_PHY (-2) | ||
1025 | **/ | ||
1026 | static s32 e1000_configure_k1_ich8lan(struct e1000_hw *hw, bool k1_enable) | ||
1027 | { | ||
1028 | s32 ret_val = 0; | ||
1029 | u32 ctrl_reg = 0; | ||
1030 | u32 ctrl_ext = 0; | ||
1031 | u32 reg = 0; | ||
1032 | u16 kmrn_reg = 0; | ||
1033 | |||
1034 | ret_val = e1000e_read_kmrn_reg_locked(hw, | ||
1035 | E1000_KMRNCTRLSTA_K1_CONFIG, | ||
1036 | &kmrn_reg); | ||
1037 | if (ret_val) | ||
1038 | goto out; | ||
1039 | |||
1040 | if (k1_enable) | ||
1041 | kmrn_reg |= E1000_KMRNCTRLSTA_K1_ENABLE; | ||
1042 | else | ||
1043 | kmrn_reg &= ~E1000_KMRNCTRLSTA_K1_ENABLE; | ||
1044 | |||
1045 | ret_val = e1000e_write_kmrn_reg_locked(hw, | ||
1046 | E1000_KMRNCTRLSTA_K1_CONFIG, | ||
1047 | kmrn_reg); | ||
1048 | if (ret_val) | ||
1049 | goto out; | ||
1050 | |||
1051 | udelay(20); | ||
1052 | ctrl_ext = er32(CTRL_EXT); | ||
1053 | ctrl_reg = er32(CTRL); | ||
1054 | |||
1055 | reg = ctrl_reg & ~(E1000_CTRL_SPD_1000 | E1000_CTRL_SPD_100); | ||
1056 | reg |= E1000_CTRL_FRCSPD; | ||
1057 | ew32(CTRL, reg); | ||
1058 | |||
1059 | ew32(CTRL_EXT, ctrl_ext | E1000_CTRL_EXT_SPD_BYPS); | ||
1060 | udelay(20); | ||
1061 | ew32(CTRL, ctrl_reg); | ||
1062 | ew32(CTRL_EXT, ctrl_ext); | ||
1063 | udelay(20); | ||
1064 | |||
1065 | out: | ||
1066 | return ret_val; | ||
1067 | } | ||
1068 | |||
1069 | /** | ||
1070 | * e1000_oem_bits_config_ich8lan - SW-based LCD Configuration | ||
1071 | * @hw: pointer to the HW structure | ||
1072 | * @d0_state: boolean if entering d0 or d3 device state | ||
1073 | * | ||
1074 | * SW will configure Gbe Disable and LPLU based on the NVM. The four bits are | ||
1075 | * collectively called OEM bits. The OEM Write Enable bit and SW Config bit | ||
1076 | * in NVM determines whether HW should configure LPLU and Gbe Disable. | ||
1077 | **/ | ||
1078 | static s32 e1000_oem_bits_config_ich8lan(struct e1000_hw *hw, bool d0_state) | ||
1079 | { | ||
1080 | s32 ret_val = 0; | ||
1081 | u32 mac_reg; | ||
1082 | u16 oem_reg; | ||
1083 | |||
1084 | if (hw->mac.type != e1000_pchlan) | ||
1085 | return ret_val; | ||
1086 | |||
1087 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
1088 | if (ret_val) | ||
1089 | return ret_val; | ||
1090 | |||
1091 | mac_reg = er32(EXTCNF_CTRL); | ||
1092 | if (mac_reg & E1000_EXTCNF_CTRL_OEM_WRITE_ENABLE) | ||
1093 | goto out; | ||
1094 | |||
1095 | mac_reg = er32(FEXTNVM); | ||
1096 | if (!(mac_reg & E1000_FEXTNVM_SW_CONFIG_ICH8M)) | ||
1097 | goto out; | ||
1098 | |||
1099 | mac_reg = er32(PHY_CTRL); | ||
1100 | |||
1101 | ret_val = hw->phy.ops.read_phy_reg_locked(hw, HV_OEM_BITS, &oem_reg); | ||
1102 | if (ret_val) | ||
1103 | goto out; | ||
1104 | |||
1105 | oem_reg &= ~(HV_OEM_BITS_GBE_DIS | HV_OEM_BITS_LPLU); | ||
1106 | |||
1107 | if (d0_state) { | ||
1108 | if (mac_reg & E1000_PHY_CTRL_GBE_DISABLE) | ||
1109 | oem_reg |= HV_OEM_BITS_GBE_DIS; | ||
1110 | |||
1111 | if (mac_reg & E1000_PHY_CTRL_D0A_LPLU) | ||
1112 | oem_reg |= HV_OEM_BITS_LPLU; | ||
1113 | } else { | ||
1114 | if (mac_reg & E1000_PHY_CTRL_NOND0A_GBE_DISABLE) | ||
1115 | oem_reg |= HV_OEM_BITS_GBE_DIS; | ||
1116 | |||
1117 | if (mac_reg & E1000_PHY_CTRL_NOND0A_LPLU) | ||
1118 | oem_reg |= HV_OEM_BITS_LPLU; | ||
1119 | } | ||
1120 | /* Restart auto-neg to activate the bits */ | ||
1121 | oem_reg |= HV_OEM_BITS_RESTART_AN; | ||
1122 | ret_val = hw->phy.ops.write_phy_reg_locked(hw, HV_OEM_BITS, oem_reg); | ||
1123 | |||
1124 | out: | ||
1125 | hw->phy.ops.release_phy(hw); | ||
1126 | |||
1127 | return ret_val; | ||
1128 | } | ||
1129 | |||
1130 | |||
1131 | /** | ||
755 | * e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be | 1132 | * e1000_hv_phy_workarounds_ich8lan - A series of Phy workarounds to be |
756 | * done after every PHY reset. | 1133 | * done after every PHY reset. |
757 | **/ | 1134 | **/ |
@@ -791,10 +1168,20 @@ static s32 e1000_hv_phy_workarounds_ich8lan(struct e1000_hw *hw) | |||
791 | ret_val = hw->phy.ops.acquire_phy(hw); | 1168 | ret_val = hw->phy.ops.acquire_phy(hw); |
792 | if (ret_val) | 1169 | if (ret_val) |
793 | return ret_val; | 1170 | return ret_val; |
1171 | |||
794 | hw->phy.addr = 1; | 1172 | hw->phy.addr = 1; |
795 | e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); | 1173 | ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, 0); |
1174 | if (ret_val) | ||
1175 | goto out; | ||
796 | hw->phy.ops.release_phy(hw); | 1176 | hw->phy.ops.release_phy(hw); |
797 | 1177 | ||
1178 | /* | ||
1179 | * Configure the K1 Si workaround during phy reset assuming there is | ||
1180 | * link so that it disables K1 if link is in 1Gbps. | ||
1181 | */ | ||
1182 | ret_val = e1000_k1_gig_workaround_hv(hw, true); | ||
1183 | |||
1184 | out: | ||
798 | return ret_val; | 1185 | return ret_val; |
799 | } | 1186 | } |
800 | 1187 | ||
@@ -840,11 +1227,8 @@ static void e1000_lan_init_done_ich8lan(struct e1000_hw *hw) | |||
840 | **/ | 1227 | **/ |
841 | static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) | 1228 | static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) |
842 | { | 1229 | { |
843 | struct e1000_phy_info *phy = &hw->phy; | 1230 | s32 ret_val = 0; |
844 | u32 i; | 1231 | u16 reg; |
845 | u32 data, cnf_size, cnf_base_addr, sw_cfg_mask; | ||
846 | s32 ret_val; | ||
847 | u16 word_addr, reg_data, reg_addr, phy_page = 0; | ||
848 | 1232 | ||
849 | ret_val = e1000e_phy_hw_reset_generic(hw); | 1233 | ret_val = e1000e_phy_hw_reset_generic(hw); |
850 | if (ret_val) | 1234 | if (ret_val) |
@@ -859,81 +1243,20 @@ static s32 e1000_phy_hw_reset_ich8lan(struct e1000_hw *hw) | |||
859 | return ret_val; | 1243 | return ret_val; |
860 | } | 1244 | } |
861 | 1245 | ||
862 | /* | 1246 | /* Dummy read to clear the phy wakeup bit after lcd reset */ |
863 | * Initialize the PHY from the NVM on ICH platforms. This | 1247 | if (hw->mac.type == e1000_pchlan) |
864 | * is needed due to an issue where the NVM configuration is | 1248 | e1e_rphy(hw, BM_WUC, ®); |
865 | * not properly autoloaded after power transitions. | ||
866 | * Therefore, after each PHY reset, we will load the | ||
867 | * configuration data out of the NVM manually. | ||
868 | */ | ||
869 | if (hw->mac.type == e1000_ich8lan && phy->type == e1000_phy_igp_3) { | ||
870 | struct e1000_adapter *adapter = hw->adapter; | ||
871 | |||
872 | /* Check if SW needs configure the PHY */ | ||
873 | if ((adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M_AMT) || | ||
874 | (adapter->pdev->device == E1000_DEV_ID_ICH8_IGP_M)) | ||
875 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG_ICH8M; | ||
876 | else | ||
877 | sw_cfg_mask = E1000_FEXTNVM_SW_CONFIG; | ||
878 | |||
879 | data = er32(FEXTNVM); | ||
880 | if (!(data & sw_cfg_mask)) | ||
881 | return 0; | ||
882 | |||
883 | /* Wait for basic configuration completes before proceeding */ | ||
884 | e1000_lan_init_done_ich8lan(hw); | ||
885 | |||
886 | /* | ||
887 | * Make sure HW does not configure LCD from PHY | ||
888 | * extended configuration before SW configuration | ||
889 | */ | ||
890 | data = er32(EXTCNF_CTRL); | ||
891 | if (data & E1000_EXTCNF_CTRL_LCD_WRITE_ENABLE) | ||
892 | return 0; | ||
893 | |||
894 | cnf_size = er32(EXTCNF_SIZE); | ||
895 | cnf_size &= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_MASK; | ||
896 | cnf_size >>= E1000_EXTCNF_SIZE_EXT_PCIE_LENGTH_SHIFT; | ||
897 | if (!cnf_size) | ||
898 | return 0; | ||
899 | |||
900 | cnf_base_addr = data & E1000_EXTCNF_CTRL_EXT_CNF_POINTER_MASK; | ||
901 | cnf_base_addr >>= E1000_EXTCNF_CTRL_EXT_CNF_POINTER_SHIFT; | ||
902 | |||
903 | /* Configure LCD from extended configuration region. */ | ||
904 | |||
905 | /* cnf_base_addr is in DWORD */ | ||
906 | word_addr = (u16)(cnf_base_addr << 1); | ||
907 | |||
908 | for (i = 0; i < cnf_size; i++) { | ||
909 | ret_val = e1000_read_nvm(hw, | ||
910 | (word_addr + i * 2), | ||
911 | 1, | ||
912 | ®_data); | ||
913 | if (ret_val) | ||
914 | return ret_val; | ||
915 | |||
916 | ret_val = e1000_read_nvm(hw, | ||
917 | (word_addr + i * 2 + 1), | ||
918 | 1, | ||
919 | ®_addr); | ||
920 | if (ret_val) | ||
921 | return ret_val; | ||
922 | |||
923 | /* Save off the PHY page for future writes. */ | ||
924 | if (reg_addr == IGP01E1000_PHY_PAGE_SELECT) { | ||
925 | phy_page = reg_data; | ||
926 | continue; | ||
927 | } | ||
928 | 1249 | ||
929 | reg_addr |= phy_page; | 1250 | /* Configure the LCD with the extended configuration region in NVM */ |
1251 | ret_val = e1000_sw_lcd_config_ich8lan(hw); | ||
1252 | if (ret_val) | ||
1253 | goto out; | ||
930 | 1254 | ||
931 | ret_val = e1e_wphy(hw, (u32)reg_addr, reg_data); | 1255 | /* Configure the LCD with the OEM bits in NVM */ |
932 | if (ret_val) | 1256 | if (hw->mac.type == e1000_pchlan) |
933 | return ret_val; | 1257 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); |
934 | } | ||
935 | } | ||
936 | 1258 | ||
1259 | out: | ||
937 | return 0; | 1260 | return 0; |
938 | } | 1261 | } |
939 | 1262 | ||
@@ -1054,6 +1377,38 @@ static s32 e1000_check_polarity_ife_ich8lan(struct e1000_hw *hw) | |||
1054 | } | 1377 | } |
1055 | 1378 | ||
1056 | /** | 1379 | /** |
1380 | * e1000_set_lplu_state_pchlan - Set Low Power Link Up state | ||
1381 | * @hw: pointer to the HW structure | ||
1382 | * @active: true to enable LPLU, false to disable | ||
1383 | * | ||
1384 | * Sets the LPLU state according to the active flag. For PCH, if OEM write | ||
1385 | * bit are disabled in the NVM, writing the LPLU bits in the MAC will not set | ||
1386 | * the phy speed. This function will manually set the LPLU bit and restart | ||
1387 | * auto-neg as hw would do. D3 and D0 LPLU will call the same function | ||
1388 | * since it configures the same bit. | ||
1389 | **/ | ||
1390 | static s32 e1000_set_lplu_state_pchlan(struct e1000_hw *hw, bool active) | ||
1391 | { | ||
1392 | s32 ret_val = 0; | ||
1393 | u16 oem_reg; | ||
1394 | |||
1395 | ret_val = e1e_rphy(hw, HV_OEM_BITS, &oem_reg); | ||
1396 | if (ret_val) | ||
1397 | goto out; | ||
1398 | |||
1399 | if (active) | ||
1400 | oem_reg |= HV_OEM_BITS_LPLU; | ||
1401 | else | ||
1402 | oem_reg &= ~HV_OEM_BITS_LPLU; | ||
1403 | |||
1404 | oem_reg |= HV_OEM_BITS_RESTART_AN; | ||
1405 | ret_val = e1e_wphy(hw, HV_OEM_BITS, oem_reg); | ||
1406 | |||
1407 | out: | ||
1408 | return ret_val; | ||
1409 | } | ||
1410 | |||
1411 | /** | ||
1057 | * e1000_set_d0_lplu_state_ich8lan - Set Low Power Linkup D0 state | 1412 | * e1000_set_d0_lplu_state_ich8lan - Set Low Power Linkup D0 state |
1058 | * @hw: pointer to the HW structure | 1413 | * @hw: pointer to the HW structure |
1059 | * @active: TRUE to enable LPLU, FALSE to disable | 1414 | * @active: TRUE to enable LPLU, FALSE to disable |
@@ -1314,12 +1669,11 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
1314 | if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || | 1669 | if ((offset >= nvm->word_size) || (words > nvm->word_size - offset) || |
1315 | (words == 0)) { | 1670 | (words == 0)) { |
1316 | hw_dbg(hw, "nvm parameter(s) out of bounds\n"); | 1671 | hw_dbg(hw, "nvm parameter(s) out of bounds\n"); |
1317 | return -E1000_ERR_NVM; | 1672 | ret_val = -E1000_ERR_NVM; |
1673 | goto out; | ||
1318 | } | 1674 | } |
1319 | 1675 | ||
1320 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 1676 | nvm->ops.acquire_nvm(hw); |
1321 | if (ret_val) | ||
1322 | goto out; | ||
1323 | 1677 | ||
1324 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); | 1678 | ret_val = e1000_valid_nvm_bank_detect_ich8lan(hw, &bank); |
1325 | if (ret_val) { | 1679 | if (ret_val) { |
@@ -1345,7 +1699,7 @@ static s32 e1000_read_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
1345 | } | 1699 | } |
1346 | } | 1700 | } |
1347 | 1701 | ||
1348 | e1000_release_swflag_ich8lan(hw); | 1702 | nvm->ops.release_nvm(hw); |
1349 | 1703 | ||
1350 | out: | 1704 | out: |
1351 | if (ret_val) | 1705 | if (ret_val) |
@@ -1603,11 +1957,15 @@ static s32 e1000_write_nvm_ich8lan(struct e1000_hw *hw, u16 offset, u16 words, | |||
1603 | return -E1000_ERR_NVM; | 1957 | return -E1000_ERR_NVM; |
1604 | } | 1958 | } |
1605 | 1959 | ||
1960 | nvm->ops.acquire_nvm(hw); | ||
1961 | |||
1606 | for (i = 0; i < words; i++) { | 1962 | for (i = 0; i < words; i++) { |
1607 | dev_spec->shadow_ram[offset+i].modified = 1; | 1963 | dev_spec->shadow_ram[offset+i].modified = 1; |
1608 | dev_spec->shadow_ram[offset+i].value = data[i]; | 1964 | dev_spec->shadow_ram[offset+i].value = data[i]; |
1609 | } | 1965 | } |
1610 | 1966 | ||
1967 | nvm->ops.release_nvm(hw); | ||
1968 | |||
1611 | return 0; | 1969 | return 0; |
1612 | } | 1970 | } |
1613 | 1971 | ||
@@ -1637,9 +1995,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1637 | if (nvm->type != e1000_nvm_flash_sw) | 1995 | if (nvm->type != e1000_nvm_flash_sw) |
1638 | goto out; | 1996 | goto out; |
1639 | 1997 | ||
1640 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 1998 | nvm->ops.acquire_nvm(hw); |
1641 | if (ret_val) | ||
1642 | goto out; | ||
1643 | 1999 | ||
1644 | /* | 2000 | /* |
1645 | * We're writing to the opposite bank so if we're on bank 1, | 2001 | * We're writing to the opposite bank so if we're on bank 1, |
@@ -1657,7 +2013,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1657 | old_bank_offset = 0; | 2013 | old_bank_offset = 0; |
1658 | ret_val = e1000_erase_flash_bank_ich8lan(hw, 1); | 2014 | ret_val = e1000_erase_flash_bank_ich8lan(hw, 1); |
1659 | if (ret_val) { | 2015 | if (ret_val) { |
1660 | e1000_release_swflag_ich8lan(hw); | 2016 | nvm->ops.release_nvm(hw); |
1661 | goto out; | 2017 | goto out; |
1662 | } | 2018 | } |
1663 | } else { | 2019 | } else { |
@@ -1665,7 +2021,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1665 | new_bank_offset = 0; | 2021 | new_bank_offset = 0; |
1666 | ret_val = e1000_erase_flash_bank_ich8lan(hw, 0); | 2022 | ret_val = e1000_erase_flash_bank_ich8lan(hw, 0); |
1667 | if (ret_val) { | 2023 | if (ret_val) { |
1668 | e1000_release_swflag_ich8lan(hw); | 2024 | nvm->ops.release_nvm(hw); |
1669 | goto out; | 2025 | goto out; |
1670 | } | 2026 | } |
1671 | } | 2027 | } |
@@ -1723,7 +2079,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1723 | if (ret_val) { | 2079 | if (ret_val) { |
1724 | /* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */ | 2080 | /* Possibly read-only, see e1000e_write_protect_nvm_ich8lan() */ |
1725 | hw_dbg(hw, "Flash commit failed.\n"); | 2081 | hw_dbg(hw, "Flash commit failed.\n"); |
1726 | e1000_release_swflag_ich8lan(hw); | 2082 | nvm->ops.release_nvm(hw); |
1727 | goto out; | 2083 | goto out; |
1728 | } | 2084 | } |
1729 | 2085 | ||
@@ -1736,7 +2092,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1736 | act_offset = new_bank_offset + E1000_ICH_NVM_SIG_WORD; | 2092 | act_offset = new_bank_offset + E1000_ICH_NVM_SIG_WORD; |
1737 | ret_val = e1000_read_flash_word_ich8lan(hw, act_offset, &data); | 2093 | ret_val = e1000_read_flash_word_ich8lan(hw, act_offset, &data); |
1738 | if (ret_val) { | 2094 | if (ret_val) { |
1739 | e1000_release_swflag_ich8lan(hw); | 2095 | nvm->ops.release_nvm(hw); |
1740 | goto out; | 2096 | goto out; |
1741 | } | 2097 | } |
1742 | data &= 0xBFFF; | 2098 | data &= 0xBFFF; |
@@ -1744,7 +2100,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1744 | act_offset * 2 + 1, | 2100 | act_offset * 2 + 1, |
1745 | (u8)(data >> 8)); | 2101 | (u8)(data >> 8)); |
1746 | if (ret_val) { | 2102 | if (ret_val) { |
1747 | e1000_release_swflag_ich8lan(hw); | 2103 | nvm->ops.release_nvm(hw); |
1748 | goto out; | 2104 | goto out; |
1749 | } | 2105 | } |
1750 | 2106 | ||
@@ -1757,7 +2113,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1757 | act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1; | 2113 | act_offset = (old_bank_offset + E1000_ICH_NVM_SIG_WORD) * 2 + 1; |
1758 | ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset, 0); | 2114 | ret_val = e1000_retry_write_flash_byte_ich8lan(hw, act_offset, 0); |
1759 | if (ret_val) { | 2115 | if (ret_val) { |
1760 | e1000_release_swflag_ich8lan(hw); | 2116 | nvm->ops.release_nvm(hw); |
1761 | goto out; | 2117 | goto out; |
1762 | } | 2118 | } |
1763 | 2119 | ||
@@ -1767,7 +2123,7 @@ static s32 e1000_update_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1767 | dev_spec->shadow_ram[i].value = 0xFFFF; | 2123 | dev_spec->shadow_ram[i].value = 0xFFFF; |
1768 | } | 2124 | } |
1769 | 2125 | ||
1770 | e1000_release_swflag_ich8lan(hw); | 2126 | nvm->ops.release_nvm(hw); |
1771 | 2127 | ||
1772 | /* | 2128 | /* |
1773 | * Reload the EEPROM, or else modifications will not appear | 2129 | * Reload the EEPROM, or else modifications will not appear |
@@ -1831,14 +2187,12 @@ static s32 e1000_validate_nvm_checksum_ich8lan(struct e1000_hw *hw) | |||
1831 | **/ | 2187 | **/ |
1832 | void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) | 2188 | void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) |
1833 | { | 2189 | { |
2190 | struct e1000_nvm_info *nvm = &hw->nvm; | ||
1834 | union ich8_flash_protected_range pr0; | 2191 | union ich8_flash_protected_range pr0; |
1835 | union ich8_hws_flash_status hsfsts; | 2192 | union ich8_hws_flash_status hsfsts; |
1836 | u32 gfpreg; | 2193 | u32 gfpreg; |
1837 | s32 ret_val; | ||
1838 | 2194 | ||
1839 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 2195 | nvm->ops.acquire_nvm(hw); |
1840 | if (ret_val) | ||
1841 | return; | ||
1842 | 2196 | ||
1843 | gfpreg = er32flash(ICH_FLASH_GFPREG); | 2197 | gfpreg = er32flash(ICH_FLASH_GFPREG); |
1844 | 2198 | ||
@@ -1859,7 +2213,7 @@ void e1000e_write_protect_nvm_ich8lan(struct e1000_hw *hw) | |||
1859 | hsfsts.hsf_status.flockdn = true; | 2213 | hsfsts.hsf_status.flockdn = true; |
1860 | ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval); | 2214 | ew32flash(ICH_FLASH_HSFSTS, hsfsts.regval); |
1861 | 2215 | ||
1862 | e1000_release_swflag_ich8lan(hw); | 2216 | nvm->ops.release_nvm(hw); |
1863 | } | 2217 | } |
1864 | 2218 | ||
1865 | /** | 2219 | /** |
@@ -2229,6 +2583,8 @@ static s32 e1000_get_bus_info_ich8lan(struct e1000_hw *hw) | |||
2229 | **/ | 2583 | **/ |
2230 | static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | 2584 | static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) |
2231 | { | 2585 | { |
2586 | struct e1000_dev_spec_ich8lan *dev_spec = &hw->dev_spec.ich8lan; | ||
2587 | u16 reg; | ||
2232 | u32 ctrl, icr, kab; | 2588 | u32 ctrl, icr, kab; |
2233 | s32 ret_val; | 2589 | s32 ret_val; |
2234 | 2590 | ||
@@ -2263,6 +2619,18 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
2263 | ew32(PBS, E1000_PBS_16K); | 2619 | ew32(PBS, E1000_PBS_16K); |
2264 | } | 2620 | } |
2265 | 2621 | ||
2622 | if (hw->mac.type == e1000_pchlan) { | ||
2623 | /* Save the NVM K1 bit setting*/ | ||
2624 | ret_val = e1000_read_nvm(hw, E1000_NVM_K1_CONFIG, 1, ®); | ||
2625 | if (ret_val) | ||
2626 | return ret_val; | ||
2627 | |||
2628 | if (reg & E1000_NVM_K1_ENABLE) | ||
2629 | dev_spec->nvm_k1_enabled = true; | ||
2630 | else | ||
2631 | dev_spec->nvm_k1_enabled = false; | ||
2632 | } | ||
2633 | |||
2266 | ctrl = er32(CTRL); | 2634 | ctrl = er32(CTRL); |
2267 | 2635 | ||
2268 | if (!e1000_check_reset_block(hw)) { | 2636 | if (!e1000_check_reset_block(hw)) { |
@@ -2304,7 +2672,19 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
2304 | hw_dbg(hw, "Auto Read Done did not complete\n"); | 2672 | hw_dbg(hw, "Auto Read Done did not complete\n"); |
2305 | } | 2673 | } |
2306 | } | 2674 | } |
2675 | /* Dummy read to clear the phy wakeup bit after lcd reset */ | ||
2676 | if (hw->mac.type == e1000_pchlan) | ||
2677 | e1e_rphy(hw, BM_WUC, ®); | ||
2307 | 2678 | ||
2679 | ret_val = e1000_sw_lcd_config_ich8lan(hw); | ||
2680 | if (ret_val) | ||
2681 | goto out; | ||
2682 | |||
2683 | if (hw->mac.type == e1000_pchlan) { | ||
2684 | ret_val = e1000_oem_bits_config_ich8lan(hw, true); | ||
2685 | if (ret_val) | ||
2686 | goto out; | ||
2687 | } | ||
2308 | /* | 2688 | /* |
2309 | * For PCH, this write will make sure that any noise | 2689 | * For PCH, this write will make sure that any noise |
2310 | * will be detected as a CRC error and be dropped rather than show up | 2690 | * will be detected as a CRC error and be dropped rather than show up |
@@ -2323,6 +2703,7 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
2323 | if (hw->mac.type == e1000_pchlan) | 2703 | if (hw->mac.type == e1000_pchlan) |
2324 | ret_val = e1000_hv_phy_workarounds_ich8lan(hw); | 2704 | ret_val = e1000_hv_phy_workarounds_ich8lan(hw); |
2325 | 2705 | ||
2706 | out: | ||
2326 | return ret_val; | 2707 | return ret_val; |
2327 | } | 2708 | } |
2328 | 2709 | ||
@@ -2627,14 +3008,6 @@ static s32 e1000_get_link_up_info_ich8lan(struct e1000_hw *hw, u16 *speed, | |||
2627 | if (ret_val) | 3008 | if (ret_val) |
2628 | return ret_val; | 3009 | return ret_val; |
2629 | 3010 | ||
2630 | if ((hw->mac.type == e1000_pchlan) && (*speed == SPEED_1000)) { | ||
2631 | ret_val = e1000e_write_kmrn_reg(hw, | ||
2632 | E1000_KMRNCTRLSTA_K1_CONFIG, | ||
2633 | E1000_KMRNCTRLSTA_K1_DISABLE); | ||
2634 | if (ret_val) | ||
2635 | return ret_val; | ||
2636 | } | ||
2637 | |||
2638 | if ((hw->mac.type == e1000_ich8lan) && | 3011 | if ((hw->mac.type == e1000_ich8lan) && |
2639 | (hw->phy.type == e1000_phy_igp_3) && | 3012 | (hw->phy.type == e1000_phy_igp_3) && |
2640 | (*speed == SPEED_1000)) { | 3013 | (*speed == SPEED_1000)) { |
@@ -2843,9 +3216,8 @@ void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) | |||
2843 | E1000_PHY_CTRL_GBE_DISABLE; | 3216 | E1000_PHY_CTRL_GBE_DISABLE; |
2844 | ew32(PHY_CTRL, phy_ctrl); | 3217 | ew32(PHY_CTRL, phy_ctrl); |
2845 | 3218 | ||
2846 | /* Workaround SWFLAG unexpectedly set during S0->Sx */ | ||
2847 | if (hw->mac.type == e1000_pchlan) | 3219 | if (hw->mac.type == e1000_pchlan) |
2848 | udelay(500); | 3220 | e1000_phy_hw_reset_ich8lan(hw); |
2849 | default: | 3221 | default: |
2850 | break; | 3222 | break; |
2851 | } | 3223 | } |
@@ -3113,9 +3485,9 @@ static struct e1000_phy_operations ich8_phy_ops = { | |||
3113 | }; | 3485 | }; |
3114 | 3486 | ||
3115 | static struct e1000_nvm_operations ich8_nvm_ops = { | 3487 | static struct e1000_nvm_operations ich8_nvm_ops = { |
3116 | .acquire_nvm = e1000_acquire_swflag_ich8lan, | 3488 | .acquire_nvm = e1000_acquire_nvm_ich8lan, |
3117 | .read_nvm = e1000_read_nvm_ich8lan, | 3489 | .read_nvm = e1000_read_nvm_ich8lan, |
3118 | .release_nvm = e1000_release_swflag_ich8lan, | 3490 | .release_nvm = e1000_release_nvm_ich8lan, |
3119 | .update_nvm = e1000_update_nvm_checksum_ich8lan, | 3491 | .update_nvm = e1000_update_nvm_checksum_ich8lan, |
3120 | .valid_led_default = e1000_valid_led_default_ich8lan, | 3492 | .valid_led_default = e1000_valid_led_default_ich8lan, |
3121 | .validate_nvm = e1000_validate_nvm_checksum_ich8lan, | 3493 | .validate_nvm = e1000_validate_nvm_checksum_ich8lan, |
diff --git a/drivers/net/e1000e/phy.c b/drivers/net/e1000e/phy.c index 994401fd0664..03175b3a2c9e 100644 --- a/drivers/net/e1000e/phy.c +++ b/drivers/net/e1000e/phy.c | |||
@@ -95,13 +95,6 @@ static const u16 e1000_igp_2_cable_length_table[] = | |||
95 | /* BM PHY Copper Specific Control 1 */ | 95 | /* BM PHY Copper Specific Control 1 */ |
96 | #define BM_CS_CTRL1 16 | 96 | #define BM_CS_CTRL1 16 |
97 | 97 | ||
98 | /* BM PHY Copper Specific Status */ | ||
99 | #define BM_CS_STATUS 17 | ||
100 | #define BM_CS_STATUS_LINK_UP 0x0400 | ||
101 | #define BM_CS_STATUS_RESOLVED 0x0800 | ||
102 | #define BM_CS_STATUS_SPEED_MASK 0xC000 | ||
103 | #define BM_CS_STATUS_SPEED_1000 0x8000 | ||
104 | |||
105 | #define HV_MUX_DATA_CTRL PHY_REG(776, 16) | 98 | #define HV_MUX_DATA_CTRL PHY_REG(776, 16) |
106 | #define HV_MUX_DATA_CTRL_GEN_TO_MAC 0x0400 | 99 | #define HV_MUX_DATA_CTRL_GEN_TO_MAC 0x0400 |
107 | #define HV_MUX_DATA_CTRL_FORCE_SPEED 0x0004 | 100 | #define HV_MUX_DATA_CTRL_FORCE_SPEED 0x0004 |
@@ -164,16 +157,25 @@ s32 e1000e_get_phy_id(struct e1000_hw *hw) | |||
164 | * MDIC mode. No harm in trying again in this case since | 157 | * MDIC mode. No harm in trying again in this case since |
165 | * the PHY ID is unknown at this point anyway | 158 | * the PHY ID is unknown at this point anyway |
166 | */ | 159 | */ |
160 | ret_val = phy->ops.acquire_phy(hw); | ||
161 | if (ret_val) | ||
162 | goto out; | ||
167 | ret_val = e1000_set_mdio_slow_mode_hv(hw, true); | 163 | ret_val = e1000_set_mdio_slow_mode_hv(hw, true); |
168 | if (ret_val) | 164 | if (ret_val) |
169 | goto out; | 165 | goto out; |
166 | phy->ops.release_phy(hw); | ||
170 | 167 | ||
171 | retry_count++; | 168 | retry_count++; |
172 | } | 169 | } |
173 | out: | 170 | out: |
174 | /* Revert to MDIO fast mode, if applicable */ | 171 | /* Revert to MDIO fast mode, if applicable */ |
175 | if (retry_count) | 172 | if (retry_count) { |
173 | ret_val = phy->ops.acquire_phy(hw); | ||
174 | if (ret_val) | ||
175 | return ret_val; | ||
176 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); | 176 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); |
177 | phy->ops.release_phy(hw); | ||
178 | } | ||
177 | 179 | ||
178 | return ret_val; | 180 | return ret_val; |
179 | } | 181 | } |
@@ -354,94 +356,173 @@ s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data) | |||
354 | } | 356 | } |
355 | 357 | ||
356 | /** | 358 | /** |
357 | * e1000e_read_phy_reg_igp - Read igp PHY register | 359 | * __e1000e_read_phy_reg_igp - Read igp PHY register |
358 | * @hw: pointer to the HW structure | 360 | * @hw: pointer to the HW structure |
359 | * @offset: register offset to be read | 361 | * @offset: register offset to be read |
360 | * @data: pointer to the read data | 362 | * @data: pointer to the read data |
363 | * @locked: semaphore has already been acquired or not | ||
361 | * | 364 | * |
362 | * Acquires semaphore, if necessary, then reads the PHY register at offset | 365 | * Acquires semaphore, if necessary, then reads the PHY register at offset |
363 | * and storing the retrieved information in data. Release any acquired | 366 | * and stores the retrieved information in data. Release any acquired |
364 | * semaphores before exiting. | 367 | * semaphores before exiting. |
365 | **/ | 368 | **/ |
366 | s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) | 369 | static s32 __e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data, |
370 | bool locked) | ||
367 | { | 371 | { |
368 | s32 ret_val; | 372 | s32 ret_val = 0; |
369 | 373 | ||
370 | ret_val = hw->phy.ops.acquire_phy(hw); | 374 | if (!locked) { |
371 | if (ret_val) | 375 | if (!(hw->phy.ops.acquire_phy)) |
372 | return ret_val; | 376 | goto out; |
377 | |||
378 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
379 | if (ret_val) | ||
380 | goto out; | ||
381 | } | ||
373 | 382 | ||
374 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 383 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
375 | ret_val = e1000e_write_phy_reg_mdic(hw, | 384 | ret_val = e1000e_write_phy_reg_mdic(hw, |
376 | IGP01E1000_PHY_PAGE_SELECT, | 385 | IGP01E1000_PHY_PAGE_SELECT, |
377 | (u16)offset); | 386 | (u16)offset); |
378 | if (ret_val) { | 387 | if (ret_val) |
379 | hw->phy.ops.release_phy(hw); | 388 | goto release; |
380 | return ret_val; | ||
381 | } | ||
382 | } | 389 | } |
383 | 390 | ||
384 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 391 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
385 | data); | 392 | data); |
386 | |||
387 | hw->phy.ops.release_phy(hw); | ||
388 | 393 | ||
394 | release: | ||
395 | if (!locked) | ||
396 | hw->phy.ops.release_phy(hw); | ||
397 | out: | ||
389 | return ret_val; | 398 | return ret_val; |
390 | } | 399 | } |
391 | 400 | ||
392 | /** | 401 | /** |
402 | * e1000e_read_phy_reg_igp - Read igp PHY register | ||
403 | * @hw: pointer to the HW structure | ||
404 | * @offset: register offset to be read | ||
405 | * @data: pointer to the read data | ||
406 | * | ||
407 | * Acquires semaphore then reads the PHY register at offset and stores the | ||
408 | * retrieved information in data. | ||
409 | * Release the acquired semaphore before exiting. | ||
410 | **/ | ||
411 | s32 e1000e_read_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 *data) | ||
412 | { | ||
413 | return __e1000e_read_phy_reg_igp(hw, offset, data, false); | ||
414 | } | ||
415 | |||
416 | /** | ||
417 | * e1000e_read_phy_reg_igp_locked - Read igp PHY register | ||
418 | * @hw: pointer to the HW structure | ||
419 | * @offset: register offset to be read | ||
420 | * @data: pointer to the read data | ||
421 | * | ||
422 | * Reads the PHY register at offset and stores the retrieved information | ||
423 | * in data. Assumes semaphore already acquired. | ||
424 | **/ | ||
425 | s32 e1000e_read_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 *data) | ||
426 | { | ||
427 | return __e1000e_read_phy_reg_igp(hw, offset, data, true); | ||
428 | } | ||
429 | |||
430 | /** | ||
393 | * e1000e_write_phy_reg_igp - Write igp PHY register | 431 | * e1000e_write_phy_reg_igp - Write igp PHY register |
394 | * @hw: pointer to the HW structure | 432 | * @hw: pointer to the HW structure |
395 | * @offset: register offset to write to | 433 | * @offset: register offset to write to |
396 | * @data: data to write at register offset | 434 | * @data: data to write at register offset |
435 | * @locked: semaphore has already been acquired or not | ||
397 | * | 436 | * |
398 | * Acquires semaphore, if necessary, then writes the data to PHY register | 437 | * Acquires semaphore, if necessary, then writes the data to PHY register |
399 | * at the offset. Release any acquired semaphores before exiting. | 438 | * at the offset. Release any acquired semaphores before exiting. |
400 | **/ | 439 | **/ |
401 | s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) | 440 | static s32 __e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data, |
441 | bool locked) | ||
402 | { | 442 | { |
403 | s32 ret_val; | 443 | s32 ret_val = 0; |
404 | 444 | ||
405 | ret_val = hw->phy.ops.acquire_phy(hw); | 445 | if (!locked) { |
406 | if (ret_val) | 446 | if (!(hw->phy.ops.acquire_phy)) |
407 | return ret_val; | 447 | goto out; |
448 | |||
449 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
450 | if (ret_val) | ||
451 | goto out; | ||
452 | } | ||
408 | 453 | ||
409 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 454 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
410 | ret_val = e1000e_write_phy_reg_mdic(hw, | 455 | ret_val = e1000e_write_phy_reg_mdic(hw, |
411 | IGP01E1000_PHY_PAGE_SELECT, | 456 | IGP01E1000_PHY_PAGE_SELECT, |
412 | (u16)offset); | 457 | (u16)offset); |
413 | if (ret_val) { | 458 | if (ret_val) |
414 | hw->phy.ops.release_phy(hw); | 459 | goto release; |
415 | return ret_val; | ||
416 | } | ||
417 | } | 460 | } |
418 | 461 | ||
419 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 462 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
420 | data); | 463 | data); |
421 | 464 | ||
422 | hw->phy.ops.release_phy(hw); | 465 | release: |
466 | if (!locked) | ||
467 | hw->phy.ops.release_phy(hw); | ||
423 | 468 | ||
469 | out: | ||
424 | return ret_val; | 470 | return ret_val; |
425 | } | 471 | } |
426 | 472 | ||
427 | /** | 473 | /** |
428 | * e1000e_read_kmrn_reg - Read kumeran register | 474 | * e1000e_write_phy_reg_igp - Write igp PHY register |
475 | * @hw: pointer to the HW structure | ||
476 | * @offset: register offset to write to | ||
477 | * @data: data to write at register offset | ||
478 | * | ||
479 | * Acquires semaphore then writes the data to PHY register | ||
480 | * at the offset. Release any acquired semaphores before exiting. | ||
481 | **/ | ||
482 | s32 e1000e_write_phy_reg_igp(struct e1000_hw *hw, u32 offset, u16 data) | ||
483 | { | ||
484 | return __e1000e_write_phy_reg_igp(hw, offset, data, false); | ||
485 | } | ||
486 | |||
487 | /** | ||
488 | * e1000e_write_phy_reg_igp_locked - Write igp PHY register | ||
489 | * @hw: pointer to the HW structure | ||
490 | * @offset: register offset to write to | ||
491 | * @data: data to write at register offset | ||
492 | * | ||
493 | * Writes the data to PHY register at the offset. | ||
494 | * Assumes semaphore already acquired. | ||
495 | **/ | ||
496 | s32 e1000e_write_phy_reg_igp_locked(struct e1000_hw *hw, u32 offset, u16 data) | ||
497 | { | ||
498 | return __e1000e_write_phy_reg_igp(hw, offset, data, true); | ||
499 | } | ||
500 | |||
501 | /** | ||
502 | * __e1000_read_kmrn_reg - Read kumeran register | ||
429 | * @hw: pointer to the HW structure | 503 | * @hw: pointer to the HW structure |
430 | * @offset: register offset to be read | 504 | * @offset: register offset to be read |
431 | * @data: pointer to the read data | 505 | * @data: pointer to the read data |
506 | * @locked: semaphore has already been acquired or not | ||
432 | * | 507 | * |
433 | * Acquires semaphore, if necessary. Then reads the PHY register at offset | 508 | * Acquires semaphore, if necessary. Then reads the PHY register at offset |
434 | * using the kumeran interface. The information retrieved is stored in data. | 509 | * using the kumeran interface. The information retrieved is stored in data. |
435 | * Release any acquired semaphores before exiting. | 510 | * Release any acquired semaphores before exiting. |
436 | **/ | 511 | **/ |
437 | s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) | 512 | static s32 __e1000_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data, |
513 | bool locked) | ||
438 | { | 514 | { |
439 | u32 kmrnctrlsta; | 515 | u32 kmrnctrlsta; |
440 | s32 ret_val; | 516 | s32 ret_val = 0; |
441 | 517 | ||
442 | ret_val = hw->phy.ops.acquire_phy(hw); | 518 | if (!locked) { |
443 | if (ret_val) | 519 | if (!(hw->phy.ops.acquire_phy)) |
444 | return ret_val; | 520 | goto out; |
521 | |||
522 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
523 | if (ret_val) | ||
524 | goto out; | ||
525 | } | ||
445 | 526 | ||
446 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 527 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
447 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; | 528 | E1000_KMRNCTRLSTA_OFFSET) | E1000_KMRNCTRLSTA_REN; |
@@ -452,41 +533,111 @@ s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) | |||
452 | kmrnctrlsta = er32(KMRNCTRLSTA); | 533 | kmrnctrlsta = er32(KMRNCTRLSTA); |
453 | *data = (u16)kmrnctrlsta; | 534 | *data = (u16)kmrnctrlsta; |
454 | 535 | ||
455 | hw->phy.ops.release_phy(hw); | 536 | if (!locked) |
537 | hw->phy.ops.release_phy(hw); | ||
456 | 538 | ||
539 | out: | ||
457 | return ret_val; | 540 | return ret_val; |
458 | } | 541 | } |
459 | 542 | ||
460 | /** | 543 | /** |
461 | * e1000e_write_kmrn_reg - Write kumeran register | 544 | * e1000e_read_kmrn_reg - Read kumeran register |
545 | * @hw: pointer to the HW structure | ||
546 | * @offset: register offset to be read | ||
547 | * @data: pointer to the read data | ||
548 | * | ||
549 | * Acquires semaphore then reads the PHY register at offset using the | ||
550 | * kumeran interface. The information retrieved is stored in data. | ||
551 | * Release the acquired semaphore before exiting. | ||
552 | **/ | ||
553 | s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data) | ||
554 | { | ||
555 | return __e1000_read_kmrn_reg(hw, offset, data, false); | ||
556 | } | ||
557 | |||
558 | /** | ||
559 | * e1000e_read_kmrn_reg_locked - Read kumeran register | ||
560 | * @hw: pointer to the HW structure | ||
561 | * @offset: register offset to be read | ||
562 | * @data: pointer to the read data | ||
563 | * | ||
564 | * Reads the PHY register at offset using the kumeran interface. The | ||
565 | * information retrieved is stored in data. | ||
566 | * Assumes semaphore already acquired. | ||
567 | **/ | ||
568 | s32 e1000e_read_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 *data) | ||
569 | { | ||
570 | return __e1000_read_kmrn_reg(hw, offset, data, true); | ||
571 | } | ||
572 | |||
573 | /** | ||
574 | * __e1000_write_kmrn_reg - Write kumeran register | ||
462 | * @hw: pointer to the HW structure | 575 | * @hw: pointer to the HW structure |
463 | * @offset: register offset to write to | 576 | * @offset: register offset to write to |
464 | * @data: data to write at register offset | 577 | * @data: data to write at register offset |
578 | * @locked: semaphore has already been acquired or not | ||
465 | * | 579 | * |
466 | * Acquires semaphore, if necessary. Then write the data to PHY register | 580 | * Acquires semaphore, if necessary. Then write the data to PHY register |
467 | * at the offset using the kumeran interface. Release any acquired semaphores | 581 | * at the offset using the kumeran interface. Release any acquired semaphores |
468 | * before exiting. | 582 | * before exiting. |
469 | **/ | 583 | **/ |
470 | s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) | 584 | static s32 __e1000_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data, |
585 | bool locked) | ||
471 | { | 586 | { |
472 | u32 kmrnctrlsta; | 587 | u32 kmrnctrlsta; |
473 | s32 ret_val; | 588 | s32 ret_val = 0; |
474 | 589 | ||
475 | ret_val = hw->phy.ops.acquire_phy(hw); | 590 | if (!locked) { |
476 | if (ret_val) | 591 | if (!(hw->phy.ops.acquire_phy)) |
477 | return ret_val; | 592 | goto out; |
593 | |||
594 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
595 | if (ret_val) | ||
596 | goto out; | ||
597 | } | ||
478 | 598 | ||
479 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & | 599 | kmrnctrlsta = ((offset << E1000_KMRNCTRLSTA_OFFSET_SHIFT) & |
480 | E1000_KMRNCTRLSTA_OFFSET) | data; | 600 | E1000_KMRNCTRLSTA_OFFSET) | data; |
481 | ew32(KMRNCTRLSTA, kmrnctrlsta); | 601 | ew32(KMRNCTRLSTA, kmrnctrlsta); |
482 | 602 | ||
483 | udelay(2); | 603 | udelay(2); |
484 | hw->phy.ops.release_phy(hw); | ||
485 | 604 | ||
605 | if (!locked) | ||
606 | hw->phy.ops.release_phy(hw); | ||
607 | |||
608 | out: | ||
486 | return ret_val; | 609 | return ret_val; |
487 | } | 610 | } |
488 | 611 | ||
489 | /** | 612 | /** |
613 | * e1000e_write_kmrn_reg - Write kumeran register | ||
614 | * @hw: pointer to the HW structure | ||
615 | * @offset: register offset to write to | ||
616 | * @data: data to write at register offset | ||
617 | * | ||
618 | * Acquires semaphore then writes the data to the PHY register at the offset | ||
619 | * using the kumeran interface. Release the acquired semaphore before exiting. | ||
620 | **/ | ||
621 | s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data) | ||
622 | { | ||
623 | return __e1000_write_kmrn_reg(hw, offset, data, false); | ||
624 | } | ||
625 | |||
626 | /** | ||
627 | * e1000e_write_kmrn_reg_locked - Write kumeran register | ||
628 | * @hw: pointer to the HW structure | ||
629 | * @offset: register offset to write to | ||
630 | * @data: data to write at register offset | ||
631 | * | ||
632 | * Write the data to PHY register at the offset using the kumeran interface. | ||
633 | * Assumes semaphore already acquired. | ||
634 | **/ | ||
635 | s32 e1000e_write_kmrn_reg_locked(struct e1000_hw *hw, u32 offset, u16 data) | ||
636 | { | ||
637 | return __e1000_write_kmrn_reg(hw, offset, data, true); | ||
638 | } | ||
639 | |||
640 | /** | ||
490 | * e1000_copper_link_setup_82577 - Setup 82577 PHY for copper link | 641 | * e1000_copper_link_setup_82577 - Setup 82577 PHY for copper link |
491 | * @hw: pointer to the HW structure | 642 | * @hw: pointer to the HW structure |
492 | * | 643 | * |
@@ -2105,6 +2256,10 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) | |||
2105 | u32 page = offset >> IGP_PAGE_SHIFT; | 2256 | u32 page = offset >> IGP_PAGE_SHIFT; |
2106 | u32 page_shift = 0; | 2257 | u32 page_shift = 0; |
2107 | 2258 | ||
2259 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2260 | if (ret_val) | ||
2261 | return ret_val; | ||
2262 | |||
2108 | /* Page 800 works differently than the rest so it has its own func */ | 2263 | /* Page 800 works differently than the rest so it has its own func */ |
2109 | if (page == BM_WUC_PAGE) { | 2264 | if (page == BM_WUC_PAGE) { |
2110 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, | 2265 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, |
@@ -2112,10 +2267,6 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) | |||
2112 | goto out; | 2267 | goto out; |
2113 | } | 2268 | } |
2114 | 2269 | ||
2115 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2116 | if (ret_val) | ||
2117 | goto out; | ||
2118 | |||
2119 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); | 2270 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); |
2120 | 2271 | ||
2121 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 2272 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
@@ -2135,18 +2286,15 @@ s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) | |||
2135 | /* Page is shifted left, PHY expects (page x 32) */ | 2286 | /* Page is shifted left, PHY expects (page x 32) */ |
2136 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, | 2287 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, |
2137 | (page << page_shift)); | 2288 | (page << page_shift)); |
2138 | if (ret_val) { | 2289 | if (ret_val) |
2139 | hw->phy.ops.release_phy(hw); | ||
2140 | goto out; | 2290 | goto out; |
2141 | } | ||
2142 | } | 2291 | } |
2143 | 2292 | ||
2144 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 2293 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
2145 | data); | 2294 | data); |
2146 | 2295 | ||
2147 | hw->phy.ops.release_phy(hw); | ||
2148 | |||
2149 | out: | 2296 | out: |
2297 | hw->phy.ops.release_phy(hw); | ||
2150 | return ret_val; | 2298 | return ret_val; |
2151 | } | 2299 | } |
2152 | 2300 | ||
@@ -2167,6 +2315,10 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2167 | u32 page = offset >> IGP_PAGE_SHIFT; | 2315 | u32 page = offset >> IGP_PAGE_SHIFT; |
2168 | u32 page_shift = 0; | 2316 | u32 page_shift = 0; |
2169 | 2317 | ||
2318 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2319 | if (ret_val) | ||
2320 | return ret_val; | ||
2321 | |||
2170 | /* Page 800 works differently than the rest so it has its own func */ | 2322 | /* Page 800 works differently than the rest so it has its own func */ |
2171 | if (page == BM_WUC_PAGE) { | 2323 | if (page == BM_WUC_PAGE) { |
2172 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, | 2324 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, |
@@ -2174,10 +2326,6 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2174 | goto out; | 2326 | goto out; |
2175 | } | 2327 | } |
2176 | 2328 | ||
2177 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2178 | if (ret_val) | ||
2179 | goto out; | ||
2180 | |||
2181 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); | 2329 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); |
2182 | 2330 | ||
2183 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 2331 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
@@ -2197,17 +2345,14 @@ s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2197 | /* Page is shifted left, PHY expects (page x 32) */ | 2345 | /* Page is shifted left, PHY expects (page x 32) */ |
2198 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, | 2346 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, |
2199 | (page << page_shift)); | 2347 | (page << page_shift)); |
2200 | if (ret_val) { | 2348 | if (ret_val) |
2201 | hw->phy.ops.release_phy(hw); | ||
2202 | goto out; | 2349 | goto out; |
2203 | } | ||
2204 | } | 2350 | } |
2205 | 2351 | ||
2206 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 2352 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
2207 | data); | 2353 | data); |
2208 | hw->phy.ops.release_phy(hw); | ||
2209 | |||
2210 | out: | 2354 | out: |
2355 | hw->phy.ops.release_phy(hw); | ||
2211 | return ret_val; | 2356 | return ret_val; |
2212 | } | 2357 | } |
2213 | 2358 | ||
@@ -2226,17 +2371,17 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2226 | s32 ret_val; | 2371 | s32 ret_val; |
2227 | u16 page = (u16)(offset >> IGP_PAGE_SHIFT); | 2372 | u16 page = (u16)(offset >> IGP_PAGE_SHIFT); |
2228 | 2373 | ||
2374 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2375 | if (ret_val) | ||
2376 | return ret_val; | ||
2377 | |||
2229 | /* Page 800 works differently than the rest so it has its own func */ | 2378 | /* Page 800 works differently than the rest so it has its own func */ |
2230 | if (page == BM_WUC_PAGE) { | 2379 | if (page == BM_WUC_PAGE) { |
2231 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, | 2380 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, |
2232 | true); | 2381 | true); |
2233 | return ret_val; | 2382 | goto out; |
2234 | } | 2383 | } |
2235 | 2384 | ||
2236 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2237 | if (ret_val) | ||
2238 | return ret_val; | ||
2239 | |||
2240 | hw->phy.addr = 1; | 2385 | hw->phy.addr = 1; |
2241 | 2386 | ||
2242 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 2387 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
@@ -2245,16 +2390,14 @@ s32 e1000e_read_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2245 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, | 2390 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, |
2246 | page); | 2391 | page); |
2247 | 2392 | ||
2248 | if (ret_val) { | 2393 | if (ret_val) |
2249 | hw->phy.ops.release_phy(hw); | 2394 | goto out; |
2250 | return ret_val; | ||
2251 | } | ||
2252 | } | 2395 | } |
2253 | 2396 | ||
2254 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 2397 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
2255 | data); | 2398 | data); |
2399 | out: | ||
2256 | hw->phy.ops.release_phy(hw); | 2400 | hw->phy.ops.release_phy(hw); |
2257 | |||
2258 | return ret_val; | 2401 | return ret_val; |
2259 | } | 2402 | } |
2260 | 2403 | ||
@@ -2272,17 +2415,17 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) | |||
2272 | s32 ret_val; | 2415 | s32 ret_val; |
2273 | u16 page = (u16)(offset >> IGP_PAGE_SHIFT); | 2416 | u16 page = (u16)(offset >> IGP_PAGE_SHIFT); |
2274 | 2417 | ||
2418 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2419 | if (ret_val) | ||
2420 | return ret_val; | ||
2421 | |||
2275 | /* Page 800 works differently than the rest so it has its own func */ | 2422 | /* Page 800 works differently than the rest so it has its own func */ |
2276 | if (page == BM_WUC_PAGE) { | 2423 | if (page == BM_WUC_PAGE) { |
2277 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, | 2424 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, |
2278 | false); | 2425 | false); |
2279 | return ret_val; | 2426 | goto out; |
2280 | } | 2427 | } |
2281 | 2428 | ||
2282 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2283 | if (ret_val) | ||
2284 | return ret_val; | ||
2285 | |||
2286 | hw->phy.addr = 1; | 2429 | hw->phy.addr = 1; |
2287 | 2430 | ||
2288 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | 2431 | if (offset > MAX_PHY_MULTI_PAGE_REG) { |
@@ -2290,17 +2433,15 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) | |||
2290 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, | 2433 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_PHY_PAGE_SELECT, |
2291 | page); | 2434 | page); |
2292 | 2435 | ||
2293 | if (ret_val) { | 2436 | if (ret_val) |
2294 | hw->phy.ops.release_phy(hw); | 2437 | goto out; |
2295 | return ret_val; | ||
2296 | } | ||
2297 | } | 2438 | } |
2298 | 2439 | ||
2299 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | 2440 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, |
2300 | data); | 2441 | data); |
2301 | 2442 | ||
2443 | out: | ||
2302 | hw->phy.ops.release_phy(hw); | 2444 | hw->phy.ops.release_phy(hw); |
2303 | |||
2304 | return ret_val; | 2445 | return ret_val; |
2305 | } | 2446 | } |
2306 | 2447 | ||
@@ -2320,6 +2461,8 @@ s32 e1000e_write_phy_reg_bm2(struct e1000_hw *hw, u32 offset, u16 data) | |||
2320 | * 3) Write the address using the address opcode (0x11) | 2461 | * 3) Write the address using the address opcode (0x11) |
2321 | * 4) Read or write the data using the data opcode (0x12) | 2462 | * 4) Read or write the data using the data opcode (0x12) |
2322 | * 5) Restore 769_17.2 to its original value | 2463 | * 5) Restore 769_17.2 to its original value |
2464 | * | ||
2465 | * Assumes semaphore already acquired. | ||
2323 | **/ | 2466 | **/ |
2324 | static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, | 2467 | static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, |
2325 | u16 *data, bool read) | 2468 | u16 *data, bool read) |
@@ -2327,20 +2470,12 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, | |||
2327 | s32 ret_val; | 2470 | s32 ret_val; |
2328 | u16 reg = BM_PHY_REG_NUM(offset); | 2471 | u16 reg = BM_PHY_REG_NUM(offset); |
2329 | u16 phy_reg = 0; | 2472 | u16 phy_reg = 0; |
2330 | u8 phy_acquired = 1; | ||
2331 | |||
2332 | 2473 | ||
2333 | /* Gig must be disabled for MDIO accesses to page 800 */ | 2474 | /* Gig must be disabled for MDIO accesses to page 800 */ |
2334 | if ((hw->mac.type == e1000_pchlan) && | 2475 | if ((hw->mac.type == e1000_pchlan) && |
2335 | (!(er32(PHY_CTRL) & E1000_PHY_CTRL_GBE_DISABLE))) | 2476 | (!(er32(PHY_CTRL) & E1000_PHY_CTRL_GBE_DISABLE))) |
2336 | hw_dbg(hw, "Attempting to access page 800 while gig enabled\n"); | 2477 | hw_dbg(hw, "Attempting to access page 800 while gig enabled\n"); |
2337 | 2478 | ||
2338 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2339 | if (ret_val) { | ||
2340 | phy_acquired = 0; | ||
2341 | goto out; | ||
2342 | } | ||
2343 | |||
2344 | /* All operations in this function are phy address 1 */ | 2479 | /* All operations in this function are phy address 1 */ |
2345 | hw->phy.addr = 1; | 2480 | hw->phy.addr = 1; |
2346 | 2481 | ||
@@ -2397,8 +2532,6 @@ static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, | |||
2397 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); | 2532 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); |
2398 | 2533 | ||
2399 | out: | 2534 | out: |
2400 | if (phy_acquired == 1) | ||
2401 | hw->phy.ops.release_phy(hw); | ||
2402 | return ret_val; | 2535 | return ret_val; |
2403 | } | 2536 | } |
2404 | 2537 | ||
@@ -2439,52 +2572,63 @@ static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active) | |||
2439 | return 0; | 2572 | return 0; |
2440 | } | 2573 | } |
2441 | 2574 | ||
2575 | /** | ||
2576 | * e1000_set_mdio_slow_mode_hv - Set slow MDIO access mode | ||
2577 | * @hw: pointer to the HW structure | ||
2578 | * @slow: true for slow mode, false for normal mode | ||
2579 | * | ||
2580 | * Assumes semaphore already acquired. | ||
2581 | **/ | ||
2442 | s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow) | 2582 | s32 e1000_set_mdio_slow_mode_hv(struct e1000_hw *hw, bool slow) |
2443 | { | 2583 | { |
2444 | s32 ret_val = 0; | 2584 | s32 ret_val = 0; |
2445 | u16 data = 0; | 2585 | u16 data = 0; |
2446 | 2586 | ||
2447 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2448 | if (ret_val) | ||
2449 | return ret_val; | ||
2450 | |||
2451 | /* Set MDIO mode - page 769, register 16: 0x2580==slow, 0x2180==fast */ | 2587 | /* Set MDIO mode - page 769, register 16: 0x2580==slow, 0x2180==fast */ |
2452 | hw->phy.addr = 1; | 2588 | hw->phy.addr = 1; |
2453 | ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, | 2589 | ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, |
2454 | (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT)); | 2590 | (BM_PORT_CTRL_PAGE << IGP_PAGE_SHIFT)); |
2455 | if (ret_val) { | 2591 | if (ret_val) |
2456 | hw->phy.ops.release_phy(hw); | 2592 | goto out; |
2457 | return ret_val; | 2593 | |
2458 | } | ||
2459 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_CS_CTRL1, | 2594 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_CS_CTRL1, |
2460 | (0x2180 | (slow << 10))); | 2595 | (0x2180 | (slow << 10))); |
2596 | if (ret_val) | ||
2597 | goto out; | ||
2461 | 2598 | ||
2462 | /* dummy read when reverting to fast mode - throw away result */ | 2599 | /* dummy read when reverting to fast mode - throw away result */ |
2463 | if (!slow) | 2600 | if (!slow) |
2464 | e1000e_read_phy_reg_mdic(hw, BM_CS_CTRL1, &data); | 2601 | ret_val = e1000e_read_phy_reg_mdic(hw, BM_CS_CTRL1, &data); |
2465 | |||
2466 | hw->phy.ops.release_phy(hw); | ||
2467 | 2602 | ||
2603 | out: | ||
2468 | return ret_val; | 2604 | return ret_val; |
2469 | } | 2605 | } |
2470 | 2606 | ||
2471 | /** | 2607 | /** |
2472 | * e1000_read_phy_reg_hv - Read HV PHY register | 2608 | * __e1000_read_phy_reg_hv - Read HV PHY register |
2473 | * @hw: pointer to the HW structure | 2609 | * @hw: pointer to the HW structure |
2474 | * @offset: register offset to be read | 2610 | * @offset: register offset to be read |
2475 | * @data: pointer to the read data | 2611 | * @data: pointer to the read data |
2612 | * @locked: semaphore has already been acquired or not | ||
2476 | * | 2613 | * |
2477 | * Acquires semaphore, if necessary, then reads the PHY register at offset | 2614 | * Acquires semaphore, if necessary, then reads the PHY register at offset |
2478 | * and storing the retrieved information in data. Release any acquired | 2615 | * and stores the retrieved information in data. Release any acquired |
2479 | * semaphore before exiting. | 2616 | * semaphore before exiting. |
2480 | **/ | 2617 | **/ |
2481 | s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data) | 2618 | static s32 __e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data, |
2619 | bool locked) | ||
2482 | { | 2620 | { |
2483 | s32 ret_val; | 2621 | s32 ret_val; |
2484 | u16 page = BM_PHY_REG_PAGE(offset); | 2622 | u16 page = BM_PHY_REG_PAGE(offset); |
2485 | u16 reg = BM_PHY_REG_NUM(offset); | 2623 | u16 reg = BM_PHY_REG_NUM(offset); |
2486 | bool in_slow_mode = false; | 2624 | bool in_slow_mode = false; |
2487 | 2625 | ||
2626 | if (!locked) { | ||
2627 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2628 | if (ret_val) | ||
2629 | return ret_val; | ||
2630 | } | ||
2631 | |||
2488 | /* Workaround failure in MDIO access while cable is disconnected */ | 2632 | /* Workaround failure in MDIO access while cable is disconnected */ |
2489 | if ((hw->phy.type == e1000_phy_82577) && | 2633 | if ((hw->phy.type == e1000_phy_82577) && |
2490 | !(er32(STATUS) & E1000_STATUS_LU)) { | 2634 | !(er32(STATUS) & E1000_STATUS_LU)) { |
@@ -2508,10 +2652,6 @@ s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2508 | goto out; | 2652 | goto out; |
2509 | } | 2653 | } |
2510 | 2654 | ||
2511 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2512 | if (ret_val) | ||
2513 | goto out; | ||
2514 | |||
2515 | hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); | 2655 | hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); |
2516 | 2656 | ||
2517 | if (page == HV_INTC_FC_PAGE_START) | 2657 | if (page == HV_INTC_FC_PAGE_START) |
@@ -2529,42 +2669,76 @@ s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data) | |||
2529 | ret_val = e1000e_write_phy_reg_mdic(hw, | 2669 | ret_val = e1000e_write_phy_reg_mdic(hw, |
2530 | IGP01E1000_PHY_PAGE_SELECT, | 2670 | IGP01E1000_PHY_PAGE_SELECT, |
2531 | (page << IGP_PAGE_SHIFT)); | 2671 | (page << IGP_PAGE_SHIFT)); |
2532 | if (ret_val) { | ||
2533 | hw->phy.ops.release_phy(hw); | ||
2534 | goto out; | ||
2535 | } | ||
2536 | hw->phy.addr = phy_addr; | 2672 | hw->phy.addr = phy_addr; |
2537 | } | 2673 | } |
2538 | } | 2674 | } |
2539 | 2675 | ||
2540 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, | 2676 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, |
2541 | data); | 2677 | data); |
2542 | hw->phy.ops.release_phy(hw); | ||
2543 | |||
2544 | out: | 2678 | out: |
2545 | /* Revert to MDIO fast mode, if applicable */ | 2679 | /* Revert to MDIO fast mode, if applicable */ |
2546 | if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) | 2680 | if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) |
2547 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); | 2681 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); |
2548 | 2682 | ||
2683 | if (!locked) | ||
2684 | hw->phy.ops.release_phy(hw); | ||
2685 | |||
2549 | return ret_val; | 2686 | return ret_val; |
2550 | } | 2687 | } |
2551 | 2688 | ||
2552 | /** | 2689 | /** |
2553 | * e1000_write_phy_reg_hv - Write HV PHY register | 2690 | * e1000_read_phy_reg_hv - Read HV PHY register |
2691 | * @hw: pointer to the HW structure | ||
2692 | * @offset: register offset to be read | ||
2693 | * @data: pointer to the read data | ||
2694 | * | ||
2695 | * Acquires semaphore then reads the PHY register at offset and stores | ||
2696 | * the retrieved information in data. Release the acquired semaphore | ||
2697 | * before exiting. | ||
2698 | **/ | ||
2699 | s32 e1000_read_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 *data) | ||
2700 | { | ||
2701 | return __e1000_read_phy_reg_hv(hw, offset, data, false); | ||
2702 | } | ||
2703 | |||
2704 | /** | ||
2705 | * e1000_read_phy_reg_hv_locked - Read HV PHY register | ||
2706 | * @hw: pointer to the HW structure | ||
2707 | * @offset: register offset to be read | ||
2708 | * @data: pointer to the read data | ||
2709 | * | ||
2710 | * Reads the PHY register at offset and stores the retrieved information | ||
2711 | * in data. Assumes semaphore already acquired. | ||
2712 | **/ | ||
2713 | s32 e1000_read_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 *data) | ||
2714 | { | ||
2715 | return __e1000_read_phy_reg_hv(hw, offset, data, true); | ||
2716 | } | ||
2717 | |||
2718 | /** | ||
2719 | * __e1000_write_phy_reg_hv - Write HV PHY register | ||
2554 | * @hw: pointer to the HW structure | 2720 | * @hw: pointer to the HW structure |
2555 | * @offset: register offset to write to | 2721 | * @offset: register offset to write to |
2556 | * @data: data to write at register offset | 2722 | * @data: data to write at register offset |
2723 | * @locked: semaphore has already been acquired or not | ||
2557 | * | 2724 | * |
2558 | * Acquires semaphore, if necessary, then writes the data to PHY register | 2725 | * Acquires semaphore, if necessary, then writes the data to PHY register |
2559 | * at the offset. Release any acquired semaphores before exiting. | 2726 | * at the offset. Release any acquired semaphores before exiting. |
2560 | **/ | 2727 | **/ |
2561 | s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) | 2728 | static s32 __e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data, |
2729 | bool locked) | ||
2562 | { | 2730 | { |
2563 | s32 ret_val; | 2731 | s32 ret_val; |
2564 | u16 page = BM_PHY_REG_PAGE(offset); | 2732 | u16 page = BM_PHY_REG_PAGE(offset); |
2565 | u16 reg = BM_PHY_REG_NUM(offset); | 2733 | u16 reg = BM_PHY_REG_NUM(offset); |
2566 | bool in_slow_mode = false; | 2734 | bool in_slow_mode = false; |
2567 | 2735 | ||
2736 | if (!locked) { | ||
2737 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2738 | if (ret_val) | ||
2739 | return ret_val; | ||
2740 | } | ||
2741 | |||
2568 | /* Workaround failure in MDIO access while cable is disconnected */ | 2742 | /* Workaround failure in MDIO access while cable is disconnected */ |
2569 | if ((hw->phy.type == e1000_phy_82577) && | 2743 | if ((hw->phy.type == e1000_phy_82577) && |
2570 | !(er32(STATUS) & E1000_STATUS_LU)) { | 2744 | !(er32(STATUS) & E1000_STATUS_LU)) { |
@@ -2588,10 +2762,6 @@ s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) | |||
2588 | goto out; | 2762 | goto out; |
2589 | } | 2763 | } |
2590 | 2764 | ||
2591 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2592 | if (ret_val) | ||
2593 | goto out; | ||
2594 | |||
2595 | hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); | 2765 | hw->phy.addr = e1000_get_phy_addr_for_hv_page(page); |
2596 | 2766 | ||
2597 | if (page == HV_INTC_FC_PAGE_START) | 2767 | if (page == HV_INTC_FC_PAGE_START) |
@@ -2607,15 +2777,10 @@ s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) | |||
2607 | ((MAX_PHY_REG_ADDRESS & reg) == 0) && | 2777 | ((MAX_PHY_REG_ADDRESS & reg) == 0) && |
2608 | (data & (1 << 11))) { | 2778 | (data & (1 << 11))) { |
2609 | u16 data2 = 0x7EFF; | 2779 | u16 data2 = 0x7EFF; |
2610 | hw->phy.ops.release_phy(hw); | ||
2611 | ret_val = e1000_access_phy_debug_regs_hv(hw, (1 << 6) | 0x3, | 2780 | ret_val = e1000_access_phy_debug_regs_hv(hw, (1 << 6) | 0x3, |
2612 | &data2, false); | 2781 | &data2, false); |
2613 | if (ret_val) | 2782 | if (ret_val) |
2614 | goto out; | 2783 | goto out; |
2615 | |||
2616 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2617 | if (ret_val) | ||
2618 | goto out; | ||
2619 | } | 2784 | } |
2620 | 2785 | ||
2621 | if (reg > MAX_PHY_MULTI_PAGE_REG) { | 2786 | if (reg > MAX_PHY_MULTI_PAGE_REG) { |
@@ -2630,27 +2795,53 @@ s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) | |||
2630 | ret_val = e1000e_write_phy_reg_mdic(hw, | 2795 | ret_val = e1000e_write_phy_reg_mdic(hw, |
2631 | IGP01E1000_PHY_PAGE_SELECT, | 2796 | IGP01E1000_PHY_PAGE_SELECT, |
2632 | (page << IGP_PAGE_SHIFT)); | 2797 | (page << IGP_PAGE_SHIFT)); |
2633 | if (ret_val) { | ||
2634 | hw->phy.ops.release_phy(hw); | ||
2635 | goto out; | ||
2636 | } | ||
2637 | hw->phy.addr = phy_addr; | 2798 | hw->phy.addr = phy_addr; |
2638 | } | 2799 | } |
2639 | } | 2800 | } |
2640 | 2801 | ||
2641 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, | 2802 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & reg, |
2642 | data); | 2803 | data); |
2643 | hw->phy.ops.release_phy(hw); | ||
2644 | 2804 | ||
2645 | out: | 2805 | out: |
2646 | /* Revert to MDIO fast mode, if applicable */ | 2806 | /* Revert to MDIO fast mode, if applicable */ |
2647 | if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) | 2807 | if ((hw->phy.type == e1000_phy_82577) && in_slow_mode) |
2648 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); | 2808 | ret_val = e1000_set_mdio_slow_mode_hv(hw, false); |
2649 | 2809 | ||
2810 | if (!locked) | ||
2811 | hw->phy.ops.release_phy(hw); | ||
2812 | |||
2650 | return ret_val; | 2813 | return ret_val; |
2651 | } | 2814 | } |
2652 | 2815 | ||
2653 | /** | 2816 | /** |
2817 | * e1000_write_phy_reg_hv - Write HV PHY register | ||
2818 | * @hw: pointer to the HW structure | ||
2819 | * @offset: register offset to write to | ||
2820 | * @data: data to write at register offset | ||
2821 | * | ||
2822 | * Acquires semaphore then writes the data to PHY register at the offset. | ||
2823 | * Release the acquired semaphores before exiting. | ||
2824 | **/ | ||
2825 | s32 e1000_write_phy_reg_hv(struct e1000_hw *hw, u32 offset, u16 data) | ||
2826 | { | ||
2827 | return __e1000_write_phy_reg_hv(hw, offset, data, false); | ||
2828 | } | ||
2829 | |||
2830 | /** | ||
2831 | * e1000_write_phy_reg_hv_locked - Write HV PHY register | ||
2832 | * @hw: pointer to the HW structure | ||
2833 | * @offset: register offset to write to | ||
2834 | * @data: data to write at register offset | ||
2835 | * | ||
2836 | * Writes the data to PHY register at the offset. Assumes semaphore | ||
2837 | * already acquired. | ||
2838 | **/ | ||
2839 | s32 e1000_write_phy_reg_hv_locked(struct e1000_hw *hw, u32 offset, u16 data) | ||
2840 | { | ||
2841 | return __e1000_write_phy_reg_hv(hw, offset, data, true); | ||
2842 | } | ||
2843 | |||
2844 | /** | ||
2654 | * e1000_get_phy_addr_for_hv_page - Get PHY adrress based on page | 2845 | * e1000_get_phy_addr_for_hv_page - Get PHY adrress based on page |
2655 | * @page: page to be accessed | 2846 | * @page: page to be accessed |
2656 | **/ | 2847 | **/ |
@@ -2671,10 +2862,9 @@ static u32 e1000_get_phy_addr_for_hv_page(u32 page) | |||
2671 | * @data: pointer to the data to be read or written | 2862 | * @data: pointer to the data to be read or written |
2672 | * @read: determines if operation is read or written | 2863 | * @read: determines if operation is read or written |
2673 | * | 2864 | * |
2674 | * Acquires semaphore, if necessary, then reads the PHY register at offset | 2865 | * Reads the PHY register at offset and stores the retreived information |
2675 | * and storing the retreived information in data. Release any acquired | 2866 | * in data. Assumes semaphore already acquired. Note that the procedure |
2676 | * semaphores before exiting. Note that the procedure to read these regs | 2867 | * to read these regs uses the address port and data port to read/write. |
2677 | * uses the address port and data port to read/write. | ||
2678 | **/ | 2868 | **/ |
2679 | static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, | 2869 | static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, |
2680 | u16 *data, bool read) | 2870 | u16 *data, bool read) |
@@ -2682,20 +2872,12 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, | |||
2682 | s32 ret_val; | 2872 | s32 ret_val; |
2683 | u32 addr_reg = 0; | 2873 | u32 addr_reg = 0; |
2684 | u32 data_reg = 0; | 2874 | u32 data_reg = 0; |
2685 | u8 phy_acquired = 1; | ||
2686 | 2875 | ||
2687 | /* This takes care of the difference with desktop vs mobile phy */ | 2876 | /* This takes care of the difference with desktop vs mobile phy */ |
2688 | addr_reg = (hw->phy.type == e1000_phy_82578) ? | 2877 | addr_reg = (hw->phy.type == e1000_phy_82578) ? |
2689 | I82578_ADDR_REG : I82577_ADDR_REG; | 2878 | I82578_ADDR_REG : I82577_ADDR_REG; |
2690 | data_reg = addr_reg + 1; | 2879 | data_reg = addr_reg + 1; |
2691 | 2880 | ||
2692 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
2693 | if (ret_val) { | ||
2694 | hw_dbg(hw, "Could not acquire PHY\n"); | ||
2695 | phy_acquired = 0; | ||
2696 | goto out; | ||
2697 | } | ||
2698 | |||
2699 | /* All operations in this function are phy address 2 */ | 2881 | /* All operations in this function are phy address 2 */ |
2700 | hw->phy.addr = 2; | 2882 | hw->phy.addr = 2; |
2701 | 2883 | ||
@@ -2718,8 +2900,6 @@ static s32 e1000_access_phy_debug_regs_hv(struct e1000_hw *hw, u32 offset, | |||
2718 | } | 2900 | } |
2719 | 2901 | ||
2720 | out: | 2902 | out: |
2721 | if (phy_acquired == 1) | ||
2722 | hw->phy.ops.release_phy(hw); | ||
2723 | return ret_val; | 2903 | return ret_val; |
2724 | } | 2904 | } |
2725 | 2905 | ||
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index 9c950bb5e90c..f7d9ac8324cb 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c | |||
@@ -223,24 +223,25 @@ struct ethoc_bd { | |||
223 | u32 addr; | 223 | u32 addr; |
224 | }; | 224 | }; |
225 | 225 | ||
226 | static u32 ethoc_read(struct ethoc *dev, loff_t offset) | 226 | static inline u32 ethoc_read(struct ethoc *dev, loff_t offset) |
227 | { | 227 | { |
228 | return ioread32(dev->iobase + offset); | 228 | return ioread32(dev->iobase + offset); |
229 | } | 229 | } |
230 | 230 | ||
231 | static void ethoc_write(struct ethoc *dev, loff_t offset, u32 data) | 231 | static inline void ethoc_write(struct ethoc *dev, loff_t offset, u32 data) |
232 | { | 232 | { |
233 | iowrite32(data, dev->iobase + offset); | 233 | iowrite32(data, dev->iobase + offset); |
234 | } | 234 | } |
235 | 235 | ||
236 | static void ethoc_read_bd(struct ethoc *dev, int index, struct ethoc_bd *bd) | 236 | static inline void ethoc_read_bd(struct ethoc *dev, int index, |
237 | struct ethoc_bd *bd) | ||
237 | { | 238 | { |
238 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); | 239 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); |
239 | bd->stat = ethoc_read(dev, offset + 0); | 240 | bd->stat = ethoc_read(dev, offset + 0); |
240 | bd->addr = ethoc_read(dev, offset + 4); | 241 | bd->addr = ethoc_read(dev, offset + 4); |
241 | } | 242 | } |
242 | 243 | ||
243 | static void ethoc_write_bd(struct ethoc *dev, int index, | 244 | static inline void ethoc_write_bd(struct ethoc *dev, int index, |
244 | const struct ethoc_bd *bd) | 245 | const struct ethoc_bd *bd) |
245 | { | 246 | { |
246 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); | 247 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); |
@@ -248,33 +249,33 @@ static void ethoc_write_bd(struct ethoc *dev, int index, | |||
248 | ethoc_write(dev, offset + 4, bd->addr); | 249 | ethoc_write(dev, offset + 4, bd->addr); |
249 | } | 250 | } |
250 | 251 | ||
251 | static void ethoc_enable_irq(struct ethoc *dev, u32 mask) | 252 | static inline void ethoc_enable_irq(struct ethoc *dev, u32 mask) |
252 | { | 253 | { |
253 | u32 imask = ethoc_read(dev, INT_MASK); | 254 | u32 imask = ethoc_read(dev, INT_MASK); |
254 | imask |= mask; | 255 | imask |= mask; |
255 | ethoc_write(dev, INT_MASK, imask); | 256 | ethoc_write(dev, INT_MASK, imask); |
256 | } | 257 | } |
257 | 258 | ||
258 | static void ethoc_disable_irq(struct ethoc *dev, u32 mask) | 259 | static inline void ethoc_disable_irq(struct ethoc *dev, u32 mask) |
259 | { | 260 | { |
260 | u32 imask = ethoc_read(dev, INT_MASK); | 261 | u32 imask = ethoc_read(dev, INT_MASK); |
261 | imask &= ~mask; | 262 | imask &= ~mask; |
262 | ethoc_write(dev, INT_MASK, imask); | 263 | ethoc_write(dev, INT_MASK, imask); |
263 | } | 264 | } |
264 | 265 | ||
265 | static void ethoc_ack_irq(struct ethoc *dev, u32 mask) | 266 | static inline void ethoc_ack_irq(struct ethoc *dev, u32 mask) |
266 | { | 267 | { |
267 | ethoc_write(dev, INT_SOURCE, mask); | 268 | ethoc_write(dev, INT_SOURCE, mask); |
268 | } | 269 | } |
269 | 270 | ||
270 | static void ethoc_enable_rx_and_tx(struct ethoc *dev) | 271 | static inline void ethoc_enable_rx_and_tx(struct ethoc *dev) |
271 | { | 272 | { |
272 | u32 mode = ethoc_read(dev, MODER); | 273 | u32 mode = ethoc_read(dev, MODER); |
273 | mode |= MODER_RXEN | MODER_TXEN; | 274 | mode |= MODER_RXEN | MODER_TXEN; |
274 | ethoc_write(dev, MODER, mode); | 275 | ethoc_write(dev, MODER, mode); |
275 | } | 276 | } |
276 | 277 | ||
277 | static void ethoc_disable_rx_and_tx(struct ethoc *dev) | 278 | static inline void ethoc_disable_rx_and_tx(struct ethoc *dev) |
278 | { | 279 | { |
279 | u32 mode = ethoc_read(dev, MODER); | 280 | u32 mode = ethoc_read(dev, MODER); |
280 | mode &= ~(MODER_RXEN | MODER_TXEN); | 281 | mode &= ~(MODER_RXEN | MODER_TXEN); |
@@ -508,7 +509,7 @@ static irqreturn_t ethoc_interrupt(int irq, void *dev_id) | |||
508 | return IRQ_NONE; | 509 | return IRQ_NONE; |
509 | } | 510 | } |
510 | 511 | ||
511 | ethoc_ack_irq(priv, INT_MASK_ALL); | 512 | ethoc_ack_irq(priv, pending); |
512 | 513 | ||
513 | if (pending & INT_MASK_BUSY) { | 514 | if (pending & INT_MASK_BUSY) { |
514 | dev_err(&dev->dev, "packet dropped\n"); | 515 | dev_err(&dev->dev, "packet dropped\n"); |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 29234380e6c6..16a1d58419d9 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
@@ -1654,7 +1654,7 @@ static const struct net_device_ops fec_netdev_ops = { | |||
1654 | * | 1654 | * |
1655 | * index is only used in legacy code | 1655 | * index is only used in legacy code |
1656 | */ | 1656 | */ |
1657 | int __init fec_enet_init(struct net_device *dev, int index) | 1657 | static int fec_enet_init(struct net_device *dev, int index) |
1658 | { | 1658 | { |
1659 | struct fec_enet_private *fep = netdev_priv(dev); | 1659 | struct fec_enet_private *fep = netdev_priv(dev); |
1660 | struct bufdesc *cbd_base; | 1660 | struct bufdesc *cbd_base; |
diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c index 801f088c134f..030913f8bd26 100644 --- a/drivers/net/ifb.c +++ b/drivers/net/ifb.c | |||
@@ -98,12 +98,13 @@ static void ri_tasklet(unsigned long dev) | |||
98 | stats->tx_packets++; | 98 | stats->tx_packets++; |
99 | stats->tx_bytes +=skb->len; | 99 | stats->tx_bytes +=skb->len; |
100 | 100 | ||
101 | skb->dev = __dev_get_by_index(&init_net, skb->iif); | 101 | skb->dev = dev_get_by_index(&init_net, skb->iif); |
102 | if (!skb->dev) { | 102 | if (!skb->dev) { |
103 | dev_kfree_skb(skb); | 103 | dev_kfree_skb(skb); |
104 | stats->tx_dropped++; | 104 | stats->tx_dropped++; |
105 | break; | 105 | break; |
106 | } | 106 | } |
107 | dev_put(skb->dev); | ||
107 | skb->iif = _dev->ifindex; | 108 | skb->iif = _dev->ifindex; |
108 | 109 | ||
109 | if (from & AT_EGRESS) { | 110 | if (from & AT_EGRESS) { |
diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c index deaea8fa1032..b243ed3b0c36 100644 --- a/drivers/net/igb/igb_ethtool.c +++ b/drivers/net/igb/igb_ethtool.c | |||
@@ -732,7 +732,7 @@ static int igb_set_ringparam(struct net_device *netdev, | |||
732 | { | 732 | { |
733 | struct igb_adapter *adapter = netdev_priv(netdev); | 733 | struct igb_adapter *adapter = netdev_priv(netdev); |
734 | struct igb_ring *temp_ring; | 734 | struct igb_ring *temp_ring; |
735 | int i, err; | 735 | int i, err = 0; |
736 | u32 new_rx_count, new_tx_count; | 736 | u32 new_rx_count, new_tx_count; |
737 | 737 | ||
738 | if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) | 738 | if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) |
@@ -752,18 +752,30 @@ static int igb_set_ringparam(struct net_device *netdev, | |||
752 | return 0; | 752 | return 0; |
753 | } | 753 | } |
754 | 754 | ||
755 | while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) | ||
756 | msleep(1); | ||
757 | |||
758 | if (!netif_running(adapter->netdev)) { | ||
759 | for (i = 0; i < adapter->num_tx_queues; i++) | ||
760 | adapter->tx_ring[i].count = new_tx_count; | ||
761 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
762 | adapter->rx_ring[i].count = new_rx_count; | ||
763 | adapter->tx_ring_count = new_tx_count; | ||
764 | adapter->rx_ring_count = new_rx_count; | ||
765 | goto clear_reset; | ||
766 | } | ||
767 | |||
755 | if (adapter->num_tx_queues > adapter->num_rx_queues) | 768 | if (adapter->num_tx_queues > adapter->num_rx_queues) |
756 | temp_ring = vmalloc(adapter->num_tx_queues * sizeof(struct igb_ring)); | 769 | temp_ring = vmalloc(adapter->num_tx_queues * sizeof(struct igb_ring)); |
757 | else | 770 | else |
758 | temp_ring = vmalloc(adapter->num_rx_queues * sizeof(struct igb_ring)); | 771 | temp_ring = vmalloc(adapter->num_rx_queues * sizeof(struct igb_ring)); |
759 | if (!temp_ring) | ||
760 | return -ENOMEM; | ||
761 | 772 | ||
762 | while (test_and_set_bit(__IGB_RESETTING, &adapter->state)) | 773 | if (!temp_ring) { |
763 | msleep(1); | 774 | err = -ENOMEM; |
775 | goto clear_reset; | ||
776 | } | ||
764 | 777 | ||
765 | if (netif_running(adapter->netdev)) | 778 | igb_down(adapter); |
766 | igb_down(adapter); | ||
767 | 779 | ||
768 | /* | 780 | /* |
769 | * We can't just free everything and then setup again, | 781 | * We can't just free everything and then setup again, |
@@ -820,14 +832,11 @@ static int igb_set_ringparam(struct net_device *netdev, | |||
820 | 832 | ||
821 | adapter->rx_ring_count = new_rx_count; | 833 | adapter->rx_ring_count = new_rx_count; |
822 | } | 834 | } |
823 | |||
824 | err = 0; | ||
825 | err_setup: | 835 | err_setup: |
826 | if (netif_running(adapter->netdev)) | 836 | igb_up(adapter); |
827 | igb_up(adapter); | ||
828 | |||
829 | clear_bit(__IGB_RESETTING, &adapter->state); | ||
830 | vfree(temp_ring); | 837 | vfree(temp_ring); |
838 | clear_reset: | ||
839 | clear_bit(__IGB_RESETTING, &adapter->state); | ||
831 | return err; | 840 | return err; |
832 | } | 841 | } |
833 | 842 | ||
diff --git a/drivers/net/igbvf/ethtool.c b/drivers/net/igbvf/ethtool.c index ee17a097d1ca..c68265bd0d1a 100644 --- a/drivers/net/igbvf/ethtool.c +++ b/drivers/net/igbvf/ethtool.c | |||
@@ -279,7 +279,7 @@ static int igbvf_set_ringparam(struct net_device *netdev, | |||
279 | { | 279 | { |
280 | struct igbvf_adapter *adapter = netdev_priv(netdev); | 280 | struct igbvf_adapter *adapter = netdev_priv(netdev); |
281 | struct igbvf_ring *temp_ring; | 281 | struct igbvf_ring *temp_ring; |
282 | int err; | 282 | int err = 0; |
283 | u32 new_rx_count, new_tx_count; | 283 | u32 new_rx_count, new_tx_count; |
284 | 284 | ||
285 | if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) | 285 | if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending)) |
@@ -299,15 +299,22 @@ static int igbvf_set_ringparam(struct net_device *netdev, | |||
299 | return 0; | 299 | return 0; |
300 | } | 300 | } |
301 | 301 | ||
302 | temp_ring = vmalloc(sizeof(struct igbvf_ring)); | ||
303 | if (!temp_ring) | ||
304 | return -ENOMEM; | ||
305 | |||
306 | while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state)) | 302 | while (test_and_set_bit(__IGBVF_RESETTING, &adapter->state)) |
307 | msleep(1); | 303 | msleep(1); |
308 | 304 | ||
309 | if (netif_running(adapter->netdev)) | 305 | if (!netif_running(adapter->netdev)) { |
310 | igbvf_down(adapter); | 306 | adapter->tx_ring->count = new_tx_count; |
307 | adapter->rx_ring->count = new_rx_count; | ||
308 | goto clear_reset; | ||
309 | } | ||
310 | |||
311 | temp_ring = vmalloc(sizeof(struct igbvf_ring)); | ||
312 | if (!temp_ring) { | ||
313 | err = -ENOMEM; | ||
314 | goto clear_reset; | ||
315 | } | ||
316 | |||
317 | igbvf_down(adapter); | ||
311 | 318 | ||
312 | /* | 319 | /* |
313 | * We can't just free everything and then setup again, | 320 | * We can't just free everything and then setup again, |
@@ -339,14 +346,11 @@ static int igbvf_set_ringparam(struct net_device *netdev, | |||
339 | 346 | ||
340 | memcpy(adapter->rx_ring, temp_ring,sizeof(struct igbvf_ring)); | 347 | memcpy(adapter->rx_ring, temp_ring,sizeof(struct igbvf_ring)); |
341 | } | 348 | } |
342 | |||
343 | err = 0; | ||
344 | err_setup: | 349 | err_setup: |
345 | if (netif_running(adapter->netdev)) | 350 | igbvf_up(adapter); |
346 | igbvf_up(adapter); | ||
347 | |||
348 | clear_bit(__IGBVF_RESETTING, &adapter->state); | ||
349 | vfree(temp_ring); | 351 | vfree(temp_ring); |
352 | clear_reset: | ||
353 | clear_bit(__IGBVF_RESETTING, &adapter->state); | ||
350 | return err; | 354 | return err; |
351 | } | 355 | } |
352 | 356 | ||
diff --git a/drivers/net/ixgbe/ixgbe_ethtool.c b/drivers/net/ixgbe/ixgbe_ethtool.c index fa314cb005a4..856c18c207f3 100644 --- a/drivers/net/ixgbe/ixgbe_ethtool.c +++ b/drivers/net/ixgbe/ixgbe_ethtool.c | |||
@@ -798,7 +798,7 @@ static int ixgbe_set_ringparam(struct net_device *netdev, | |||
798 | { | 798 | { |
799 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 799 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
800 | struct ixgbe_ring *temp_tx_ring, *temp_rx_ring; | 800 | struct ixgbe_ring *temp_tx_ring, *temp_rx_ring; |
801 | int i, err; | 801 | int i, err = 0; |
802 | u32 new_rx_count, new_tx_count; | 802 | u32 new_rx_count, new_tx_count; |
803 | bool need_update = false; | 803 | bool need_update = false; |
804 | 804 | ||
@@ -822,6 +822,16 @@ static int ixgbe_set_ringparam(struct net_device *netdev, | |||
822 | while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) | 822 | while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state)) |
823 | msleep(1); | 823 | msleep(1); |
824 | 824 | ||
825 | if (!netif_running(adapter->netdev)) { | ||
826 | for (i = 0; i < adapter->num_tx_queues; i++) | ||
827 | adapter->tx_ring[i].count = new_tx_count; | ||
828 | for (i = 0; i < adapter->num_rx_queues; i++) | ||
829 | adapter->rx_ring[i].count = new_rx_count; | ||
830 | adapter->tx_ring_count = new_tx_count; | ||
831 | adapter->rx_ring_count = new_rx_count; | ||
832 | goto err_setup; | ||
833 | } | ||
834 | |||
825 | temp_tx_ring = kcalloc(adapter->num_tx_queues, | 835 | temp_tx_ring = kcalloc(adapter->num_tx_queues, |
826 | sizeof(struct ixgbe_ring), GFP_KERNEL); | 836 | sizeof(struct ixgbe_ring), GFP_KERNEL); |
827 | if (!temp_tx_ring) { | 837 | if (!temp_tx_ring) { |
@@ -879,8 +889,7 @@ static int ixgbe_set_ringparam(struct net_device *netdev, | |||
879 | 889 | ||
880 | /* if rings need to be updated, here's the place to do it in one shot */ | 890 | /* if rings need to be updated, here's the place to do it in one shot */ |
881 | if (need_update) { | 891 | if (need_update) { |
882 | if (netif_running(netdev)) | 892 | ixgbe_down(adapter); |
883 | ixgbe_down(adapter); | ||
884 | 893 | ||
885 | /* tx */ | 894 | /* tx */ |
886 | if (new_tx_count != adapter->tx_ring_count) { | 895 | if (new_tx_count != adapter->tx_ring_count) { |
@@ -897,13 +906,8 @@ static int ixgbe_set_ringparam(struct net_device *netdev, | |||
897 | temp_rx_ring = NULL; | 906 | temp_rx_ring = NULL; |
898 | adapter->rx_ring_count = new_rx_count; | 907 | adapter->rx_ring_count = new_rx_count; |
899 | } | 908 | } |
900 | } | ||
901 | |||
902 | /* success! */ | ||
903 | err = 0; | ||
904 | if (netif_running(netdev)) | ||
905 | ixgbe_up(adapter); | 909 | ixgbe_up(adapter); |
906 | 910 | } | |
907 | err_setup: | 911 | err_setup: |
908 | clear_bit(__IXGBE_RESETTING, &adapter->state); | 912 | clear_bit(__IXGBE_RESETTING, &adapter->state); |
909 | return err; | 913 | return err; |
diff --git a/drivers/net/ks8851.c b/drivers/net/ks8851.c index 237835864357..a23f739d222f 100644 --- a/drivers/net/ks8851.c +++ b/drivers/net/ks8851.c | |||
@@ -171,6 +171,36 @@ static void ks8851_wrreg16(struct ks8851_net *ks, unsigned reg, unsigned val) | |||
171 | } | 171 | } |
172 | 172 | ||
173 | /** | 173 | /** |
174 | * ks8851_wrreg8 - write 8bit register value to chip | ||
175 | * @ks: The chip state | ||
176 | * @reg: The register address | ||
177 | * @val: The value to write | ||
178 | * | ||
179 | * Issue a write to put the value @val into the register specified in @reg. | ||
180 | */ | ||
181 | static void ks8851_wrreg8(struct ks8851_net *ks, unsigned reg, unsigned val) | ||
182 | { | ||
183 | struct spi_transfer *xfer = &ks->spi_xfer1; | ||
184 | struct spi_message *msg = &ks->spi_msg1; | ||
185 | __le16 txb[2]; | ||
186 | int ret; | ||
187 | int bit; | ||
188 | |||
189 | bit = 1 << (reg & 3); | ||
190 | |||
191 | txb[0] = cpu_to_le16(MK_OP(bit, reg) | KS_SPIOP_WR); | ||
192 | txb[1] = val; | ||
193 | |||
194 | xfer->tx_buf = txb; | ||
195 | xfer->rx_buf = NULL; | ||
196 | xfer->len = 3; | ||
197 | |||
198 | ret = spi_sync(ks->spidev, msg); | ||
199 | if (ret < 0) | ||
200 | ks_err(ks, "spi_sync() failed\n"); | ||
201 | } | ||
202 | |||
203 | /** | ||
174 | * ks8851_rx_1msg - select whether to use one or two messages for spi read | 204 | * ks8851_rx_1msg - select whether to use one or two messages for spi read |
175 | * @ks: The device structure | 205 | * @ks: The device structure |
176 | * | 206 | * |
@@ -322,13 +352,12 @@ static void ks8851_soft_reset(struct ks8851_net *ks, unsigned op) | |||
322 | static int ks8851_write_mac_addr(struct net_device *dev) | 352 | static int ks8851_write_mac_addr(struct net_device *dev) |
323 | { | 353 | { |
324 | struct ks8851_net *ks = netdev_priv(dev); | 354 | struct ks8851_net *ks = netdev_priv(dev); |
325 | u16 *mcp = (u16 *)dev->dev_addr; | 355 | int i; |
326 | 356 | ||
327 | mutex_lock(&ks->lock); | 357 | mutex_lock(&ks->lock); |
328 | 358 | ||
329 | ks8851_wrreg16(ks, KS_MARL, mcp[0]); | 359 | for (i = 0; i < ETH_ALEN; i++) |
330 | ks8851_wrreg16(ks, KS_MARM, mcp[1]); | 360 | ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]); |
331 | ks8851_wrreg16(ks, KS_MARH, mcp[2]); | ||
332 | 361 | ||
333 | mutex_unlock(&ks->lock); | 362 | mutex_unlock(&ks->lock); |
334 | 363 | ||
@@ -951,7 +980,7 @@ static void ks8851_set_rx_mode(struct net_device *dev) | |||
951 | mcptr = mcptr->next; | 980 | mcptr = mcptr->next; |
952 | } | 981 | } |
953 | 982 | ||
954 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXAE | RXCR1_RXPAFMA; | 983 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXPAFMA; |
955 | } else { | 984 | } else { |
956 | /* just accept broadcast / unicast */ | 985 | /* just accept broadcast / unicast */ |
957 | rxctrl.rxcr1 = RXCR1_RXPAFMA; | 986 | rxctrl.rxcr1 = RXCR1_RXPAFMA; |
@@ -1239,6 +1268,9 @@ static int __devinit ks8851_probe(struct spi_device *spi) | |||
1239 | ndev->netdev_ops = &ks8851_netdev_ops; | 1268 | ndev->netdev_ops = &ks8851_netdev_ops; |
1240 | ndev->irq = spi->irq; | 1269 | ndev->irq = spi->irq; |
1241 | 1270 | ||
1271 | /* issue a global soft reset to reset the device. */ | ||
1272 | ks8851_soft_reset(ks, GRR_GSR); | ||
1273 | |||
1242 | /* simple check for a valid chip being connected to the bus */ | 1274 | /* simple check for a valid chip being connected to the bus */ |
1243 | 1275 | ||
1244 | if ((ks8851_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { | 1276 | if ((ks8851_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { |
diff --git a/drivers/net/ks8851.h b/drivers/net/ks8851.h index 85abe147afbf..f52c312cc356 100644 --- a/drivers/net/ks8851.h +++ b/drivers/net/ks8851.h | |||
@@ -16,6 +16,7 @@ | |||
16 | #define CCR_32PIN (1 << 0) | 16 | #define CCR_32PIN (1 << 0) |
17 | 17 | ||
18 | /* MAC address registers */ | 18 | /* MAC address registers */ |
19 | #define KS_MAR(_m) 0x15 - (_m) | ||
19 | #define KS_MARL 0x10 | 20 | #define KS_MARL 0x10 |
20 | #define KS_MARM 0x12 | 21 | #define KS_MARM 0x12 |
21 | #define KS_MARH 0x14 | 22 | #define KS_MARH 0x14 |
diff --git a/drivers/net/mlx4/main.c b/drivers/net/mlx4/main.c index 5dd7225b178e..291a505fd4fc 100644 --- a/drivers/net/mlx4/main.c +++ b/drivers/net/mlx4/main.c | |||
@@ -1282,6 +1282,7 @@ static struct pci_device_id mlx4_pci_table[] = { | |||
1282 | { PCI_VDEVICE(MELLANOX, 0x6372) }, /* MT25458 ConnectX EN 10GBASE-T 10GigE */ | 1282 | { PCI_VDEVICE(MELLANOX, 0x6372) }, /* MT25458 ConnectX EN 10GBASE-T 10GigE */ |
1283 | { PCI_VDEVICE(MELLANOX, 0x675a) }, /* MT25458 ConnectX EN 10GBASE-T+Gen2 10GigE */ | 1283 | { PCI_VDEVICE(MELLANOX, 0x675a) }, /* MT25458 ConnectX EN 10GBASE-T+Gen2 10GigE */ |
1284 | { PCI_VDEVICE(MELLANOX, 0x6764) }, /* MT26468 ConnectX EN 10GigE PCIe gen2*/ | 1284 | { PCI_VDEVICE(MELLANOX, 0x6764) }, /* MT26468 ConnectX EN 10GigE PCIe gen2*/ |
1285 | { PCI_VDEVICE(MELLANOX, 0x6746) }, /* MT26438 ConnectX EN 40GigE PCIe gen2 5GT/s */ | ||
1285 | { PCI_VDEVICE(MELLANOX, 0x676e) }, /* MT26478 ConnectX2 40GigE PCIe gen2 */ | 1286 | { PCI_VDEVICE(MELLANOX, 0x676e) }, /* MT26478 ConnectX2 40GigE PCIe gen2 */ |
1286 | { 0, } | 1287 | { 0, } |
1287 | }; | 1288 | }; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index 6930c87f362e..f3624517cb0e 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -75,7 +75,7 @@ | |||
75 | #include "myri10ge_mcp.h" | 75 | #include "myri10ge_mcp.h" |
76 | #include "myri10ge_mcp_gen_header.h" | 76 | #include "myri10ge_mcp_gen_header.h" |
77 | 77 | ||
78 | #define MYRI10GE_VERSION_STR "1.5.0-1.432" | 78 | #define MYRI10GE_VERSION_STR "1.5.1-1.451" |
79 | 79 | ||
80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); | 80 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); |
81 | MODULE_AUTHOR("Maintainer: help@myri.com"); | 81 | MODULE_AUTHOR("Maintainer: help@myri.com"); |
@@ -1624,10 +1624,21 @@ myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) | |||
1624 | return 0; | 1624 | return 0; |
1625 | } | 1625 | } |
1626 | } | 1626 | } |
1627 | if (*ptr == 'R' || *ptr == 'Q') { | 1627 | if (*ptr == '2') |
1628 | /* We've found either an XFP or quad ribbon fiber */ | 1628 | ptr++; |
1629 | if (*ptr == 'R' || *ptr == 'Q' || *ptr == 'S') { | ||
1630 | /* We've found either an XFP, quad ribbon fiber, or SFP+ */ | ||
1629 | cmd->port = PORT_FIBRE; | 1631 | cmd->port = PORT_FIBRE; |
1632 | cmd->supported |= SUPPORTED_FIBRE; | ||
1633 | cmd->advertising |= ADVERTISED_FIBRE; | ||
1634 | } else { | ||
1635 | cmd->port = PORT_OTHER; | ||
1630 | } | 1636 | } |
1637 | if (*ptr == 'R' || *ptr == 'S') | ||
1638 | cmd->transceiver = XCVR_EXTERNAL; | ||
1639 | else | ||
1640 | cmd->transceiver = XCVR_INTERNAL; | ||
1641 | |||
1631 | return 0; | 1642 | return 0; |
1632 | } | 1643 | } |
1633 | 1644 | ||
diff --git a/drivers/net/netxen/netxen_nic_hdr.h b/drivers/net/netxen/netxen_nic_hdr.h index 7a7177421d7c..1c46da632125 100644 --- a/drivers/net/netxen/netxen_nic_hdr.h +++ b/drivers/net/netxen/netxen_nic_hdr.h | |||
@@ -419,6 +419,7 @@ enum { | |||
419 | #define NETXEN_CRB_ROMUSB \ | 419 | #define NETXEN_CRB_ROMUSB \ |
420 | NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_ROMUSB) | 420 | NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_ROMUSB) |
421 | #define NETXEN_CRB_I2Q NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_I2Q) | 421 | #define NETXEN_CRB_I2Q NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_I2Q) |
422 | #define NETXEN_CRB_I2C0 NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_I2C0) | ||
422 | #define NETXEN_CRB_SMB NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_SMB) | 423 | #define NETXEN_CRB_SMB NETXEN_PCI_CRB_WINDOW(NETXEN_HW_PX_MAP_CRB_SMB) |
423 | #define NETXEN_CRB_MAX NETXEN_PCI_CRB_WINDOW(64) | 424 | #define NETXEN_CRB_MAX NETXEN_PCI_CRB_WINDOW(64) |
424 | 425 | ||
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 32314000dfcd..3185a98b0917 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -1901,22 +1901,16 @@ netxen_setup_hwops(struct netxen_adapter *adapter) | |||
1901 | 1901 | ||
1902 | int netxen_nic_get_board_info(struct netxen_adapter *adapter) | 1902 | int netxen_nic_get_board_info(struct netxen_adapter *adapter) |
1903 | { | 1903 | { |
1904 | int offset, board_type, magic, header_version; | 1904 | int offset, board_type, magic; |
1905 | struct pci_dev *pdev = adapter->pdev; | 1905 | struct pci_dev *pdev = adapter->pdev; |
1906 | 1906 | ||
1907 | offset = NX_FW_MAGIC_OFFSET; | 1907 | offset = NX_FW_MAGIC_OFFSET; |
1908 | if (netxen_rom_fast_read(adapter, offset, &magic)) | 1908 | if (netxen_rom_fast_read(adapter, offset, &magic)) |
1909 | return -EIO; | 1909 | return -EIO; |
1910 | 1910 | ||
1911 | offset = NX_HDR_VERSION_OFFSET; | 1911 | if (magic != NETXEN_BDINFO_MAGIC) { |
1912 | if (netxen_rom_fast_read(adapter, offset, &header_version)) | 1912 | dev_err(&pdev->dev, "invalid board config, magic=%08x\n", |
1913 | return -EIO; | 1913 | magic); |
1914 | |||
1915 | if (magic != NETXEN_BDINFO_MAGIC || | ||
1916 | header_version != NETXEN_BDINFO_VERSION) { | ||
1917 | dev_err(&pdev->dev, | ||
1918 | "invalid board config, magic=%08x, version=%08x\n", | ||
1919 | magic, header_version); | ||
1920 | return -EIO; | 1914 | return -EIO; |
1921 | } | 1915 | } |
1922 | 1916 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 91c2bc61c8eb..e40b914d6faf 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -531,6 +531,8 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
531 | continue; | 531 | continue; |
532 | 532 | ||
533 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { | 533 | if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { |
534 | if (off == (NETXEN_CRB_I2C0 + 0x1c)) | ||
535 | continue; | ||
534 | /* do not reset PCI */ | 536 | /* do not reset PCI */ |
535 | if (off == (ROMUSB_GLB + 0xbc)) | 537 | if (off == (ROMUSB_GLB + 0xbc)) |
536 | continue; | 538 | continue; |
@@ -553,12 +555,6 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
553 | continue; | 555 | continue; |
554 | } | 556 | } |
555 | 557 | ||
556 | if (off == NETXEN_ADDR_ERROR) { | ||
557 | printk(KERN_ERR "%s: Err: Unknown addr: 0x%08x\n", | ||
558 | netxen_nic_driver_name, buf[i].addr); | ||
559 | continue; | ||
560 | } | ||
561 | |||
562 | init_delay = 1; | 558 | init_delay = 1; |
563 | /* After writing this register, HW needs time for CRB */ | 559 | /* After writing this register, HW needs time for CRB */ |
564 | /* to quiet down (else crb_window returns 0xffffffff) */ | 560 | /* to quiet down (else crb_window returns 0xffffffff) */ |
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c index 7fc15e9e8adb..0b4a56a8c8d5 100644 --- a/drivers/net/netxen/netxen_nic_main.c +++ b/drivers/net/netxen/netxen_nic_main.c | |||
@@ -1919,6 +1919,7 @@ static void netxen_tx_timeout_task(struct work_struct *work) | |||
1919 | 1919 | ||
1920 | request_reset: | 1920 | request_reset: |
1921 | adapter->need_fw_reset = 1; | 1921 | adapter->need_fw_reset = 1; |
1922 | clear_bit(__NX_RESETTING, &adapter->state); | ||
1922 | } | 1923 | } |
1923 | 1924 | ||
1924 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) | 1925 | struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index f9364d0678f2..d6c7ac68f6ea 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -3545,7 +3545,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
3545 | rp->rcr_index = index; | 3545 | rp->rcr_index = index; |
3546 | 3546 | ||
3547 | skb_reserve(skb, NET_IP_ALIGN); | 3547 | skb_reserve(skb, NET_IP_ALIGN); |
3548 | __pskb_pull_tail(skb, min(len, NIU_RXPULL_MAX)); | 3548 | __pskb_pull_tail(skb, min(len, VLAN_ETH_HLEN)); |
3549 | 3549 | ||
3550 | rp->rx_packets++; | 3550 | rp->rx_packets++; |
3551 | rp->rx_bytes += skb->len; | 3551 | rp->rx_bytes += skb->len; |
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index bd3447f04902..94c9ad2746bc 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c | |||
@@ -1760,7 +1760,7 @@ static struct pcmcia_device_id pcnet_ids[] = { | |||
1760 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), | 1760 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), |
1761 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), | 1761 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), |
1762 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), | 1762 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), |
1763 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "PE-200.cis"), | 1763 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"), |
1764 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), | 1764 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), |
1765 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), | 1765 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), |
1766 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", | 1766 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", |
diff --git a/drivers/net/pppoe.c b/drivers/net/pppoe.c index 7cbf6f9b51de..2559991eea6a 100644 --- a/drivers/net/pppoe.c +++ b/drivers/net/pppoe.c | |||
@@ -111,9 +111,6 @@ struct pppoe_net { | |||
111 | rwlock_t hash_lock; | 111 | rwlock_t hash_lock; |
112 | }; | 112 | }; |
113 | 113 | ||
114 | /* to eliminate a race btw pppoe_flush_dev and pppoe_release */ | ||
115 | static DEFINE_SPINLOCK(flush_lock); | ||
116 | |||
117 | /* | 114 | /* |
118 | * PPPoE could be in the following stages: | 115 | * PPPoE could be in the following stages: |
119 | * 1) Discovery stage (to obtain remote MAC and Session ID) | 116 | * 1) Discovery stage (to obtain remote MAC and Session ID) |
@@ -303,45 +300,48 @@ static void pppoe_flush_dev(struct net_device *dev) | |||
303 | write_lock_bh(&pn->hash_lock); | 300 | write_lock_bh(&pn->hash_lock); |
304 | for (i = 0; i < PPPOE_HASH_SIZE; i++) { | 301 | for (i = 0; i < PPPOE_HASH_SIZE; i++) { |
305 | struct pppox_sock *po = pn->hash_table[i]; | 302 | struct pppox_sock *po = pn->hash_table[i]; |
303 | struct sock *sk; | ||
306 | 304 | ||
307 | while (po != NULL) { | 305 | while (po) { |
308 | struct sock *sk; | 306 | while (po && po->pppoe_dev != dev) { |
309 | if (po->pppoe_dev != dev) { | ||
310 | po = po->next; | 307 | po = po->next; |
311 | continue; | ||
312 | } | 308 | } |
309 | |||
310 | if (!po) | ||
311 | break; | ||
312 | |||
313 | sk = sk_pppox(po); | 313 | sk = sk_pppox(po); |
314 | spin_lock(&flush_lock); | ||
315 | po->pppoe_dev = NULL; | ||
316 | spin_unlock(&flush_lock); | ||
317 | dev_put(dev); | ||
318 | 314 | ||
319 | /* We always grab the socket lock, followed by the | 315 | /* We always grab the socket lock, followed by the |
320 | * hash_lock, in that order. Since we should | 316 | * hash_lock, in that order. Since we should hold the |
321 | * hold the sock lock while doing any unbinding, | 317 | * sock lock while doing any unbinding, we need to |
322 | * we need to release the lock we're holding. | 318 | * release the lock we're holding. Hold a reference to |
323 | * Hold a reference to the sock so it doesn't disappear | 319 | * the sock so it doesn't disappear as we're jumping |
324 | * as we're jumping between locks. | 320 | * between locks. |
325 | */ | 321 | */ |
326 | 322 | ||
327 | sock_hold(sk); | 323 | sock_hold(sk); |
328 | |||
329 | write_unlock_bh(&pn->hash_lock); | 324 | write_unlock_bh(&pn->hash_lock); |
330 | lock_sock(sk); | 325 | lock_sock(sk); |
331 | 326 | ||
332 | if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) { | 327 | if (po->pppoe_dev == dev |
328 | && sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) { | ||
333 | pppox_unbind_sock(sk); | 329 | pppox_unbind_sock(sk); |
334 | sk->sk_state = PPPOX_ZOMBIE; | 330 | sk->sk_state = PPPOX_ZOMBIE; |
335 | sk->sk_state_change(sk); | 331 | sk->sk_state_change(sk); |
332 | po->pppoe_dev = NULL; | ||
333 | dev_put(dev); | ||
336 | } | 334 | } |
337 | 335 | ||
338 | release_sock(sk); | 336 | release_sock(sk); |
339 | sock_put(sk); | 337 | sock_put(sk); |
340 | 338 | ||
341 | /* Restart scan at the beginning of this hash chain. | 339 | /* Restart the process from the start of the current |
342 | * While the lock was dropped the chain contents may | 340 | * hash chain. We dropped locks so the world may have |
343 | * have changed. | 341 | * change from underneath us. |
344 | */ | 342 | */ |
343 | |||
344 | BUG_ON(pppoe_pernet(dev_net(dev)) == NULL); | ||
345 | write_lock_bh(&pn->hash_lock); | 345 | write_lock_bh(&pn->hash_lock); |
346 | po = pn->hash_table[i]; | 346 | po = pn->hash_table[i]; |
347 | } | 347 | } |
@@ -388,11 +388,16 @@ static int pppoe_rcv_core(struct sock *sk, struct sk_buff *skb) | |||
388 | struct pppox_sock *po = pppox_sk(sk); | 388 | struct pppox_sock *po = pppox_sk(sk); |
389 | struct pppox_sock *relay_po; | 389 | struct pppox_sock *relay_po; |
390 | 390 | ||
391 | /* Backlog receive. Semantics of backlog rcv preclude any code from | ||
392 | * executing in lock_sock()/release_sock() bounds; meaning sk->sk_state | ||
393 | * can't change. | ||
394 | */ | ||
395 | |||
391 | if (sk->sk_state & PPPOX_BOUND) { | 396 | if (sk->sk_state & PPPOX_BOUND) { |
392 | ppp_input(&po->chan, skb); | 397 | ppp_input(&po->chan, skb); |
393 | } else if (sk->sk_state & PPPOX_RELAY) { | 398 | } else if (sk->sk_state & PPPOX_RELAY) { |
394 | relay_po = get_item_by_addr(dev_net(po->pppoe_dev), | 399 | relay_po = get_item_by_addr(sock_net(sk), |
395 | &po->pppoe_relay); | 400 | &po->pppoe_relay); |
396 | if (relay_po == NULL) | 401 | if (relay_po == NULL) |
397 | goto abort_kfree; | 402 | goto abort_kfree; |
398 | 403 | ||
@@ -447,6 +452,10 @@ static int pppoe_rcv(struct sk_buff *skb, struct net_device *dev, | |||
447 | goto drop; | 452 | goto drop; |
448 | 453 | ||
449 | pn = pppoe_pernet(dev_net(dev)); | 454 | pn = pppoe_pernet(dev_net(dev)); |
455 | |||
456 | /* Note that get_item does a sock_hold(), so sk_pppox(po) | ||
457 | * is known to be safe. | ||
458 | */ | ||
450 | po = get_item(pn, ph->sid, eth_hdr(skb)->h_source, dev->ifindex); | 459 | po = get_item(pn, ph->sid, eth_hdr(skb)->h_source, dev->ifindex); |
451 | if (!po) | 460 | if (!po) |
452 | goto drop; | 461 | goto drop; |
@@ -561,6 +570,7 @@ static int pppoe_release(struct socket *sock) | |||
561 | struct sock *sk = sock->sk; | 570 | struct sock *sk = sock->sk; |
562 | struct pppox_sock *po; | 571 | struct pppox_sock *po; |
563 | struct pppoe_net *pn; | 572 | struct pppoe_net *pn; |
573 | struct net *net = NULL; | ||
564 | 574 | ||
565 | if (!sk) | 575 | if (!sk) |
566 | return 0; | 576 | return 0; |
@@ -571,44 +581,28 @@ static int pppoe_release(struct socket *sock) | |||
571 | return -EBADF; | 581 | return -EBADF; |
572 | } | 582 | } |
573 | 583 | ||
584 | po = pppox_sk(sk); | ||
585 | |||
586 | if (sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND)) { | ||
587 | dev_put(po->pppoe_dev); | ||
588 | po->pppoe_dev = NULL; | ||
589 | } | ||
590 | |||
574 | pppox_unbind_sock(sk); | 591 | pppox_unbind_sock(sk); |
575 | 592 | ||
576 | /* Signal the death of the socket. */ | 593 | /* Signal the death of the socket. */ |
577 | sk->sk_state = PPPOX_DEAD; | 594 | sk->sk_state = PPPOX_DEAD; |
578 | 595 | ||
579 | /* | 596 | net = sock_net(sk); |
580 | * pppoe_flush_dev could lead to a race with | 597 | pn = pppoe_pernet(net); |
581 | * this routine so we use flush_lock to eliminate | ||
582 | * such a case (we only need per-net specific data) | ||
583 | */ | ||
584 | spin_lock(&flush_lock); | ||
585 | po = pppox_sk(sk); | ||
586 | if (!po->pppoe_dev) { | ||
587 | spin_unlock(&flush_lock); | ||
588 | goto out; | ||
589 | } | ||
590 | pn = pppoe_pernet(dev_net(po->pppoe_dev)); | ||
591 | spin_unlock(&flush_lock); | ||
592 | 598 | ||
593 | /* | 599 | /* |
594 | * protect "po" from concurrent updates | 600 | * protect "po" from concurrent updates |
595 | * on pppoe_flush_dev | 601 | * on pppoe_flush_dev |
596 | */ | 602 | */ |
597 | write_lock_bh(&pn->hash_lock); | 603 | delete_item(pn, po->pppoe_pa.sid, po->pppoe_pa.remote, |
604 | po->pppoe_ifindex); | ||
598 | 605 | ||
599 | po = pppox_sk(sk); | ||
600 | if (stage_session(po->pppoe_pa.sid)) | ||
601 | __delete_item(pn, po->pppoe_pa.sid, po->pppoe_pa.remote, | ||
602 | po->pppoe_ifindex); | ||
603 | |||
604 | if (po->pppoe_dev) { | ||
605 | dev_put(po->pppoe_dev); | ||
606 | po->pppoe_dev = NULL; | ||
607 | } | ||
608 | |||
609 | write_unlock_bh(&pn->hash_lock); | ||
610 | |||
611 | out: | ||
612 | sock_orphan(sk); | 606 | sock_orphan(sk); |
613 | sock->sk = NULL; | 607 | sock->sk = NULL; |
614 | 608 | ||
@@ -625,8 +619,9 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
625 | struct sock *sk = sock->sk; | 619 | struct sock *sk = sock->sk; |
626 | struct sockaddr_pppox *sp = (struct sockaddr_pppox *)uservaddr; | 620 | struct sockaddr_pppox *sp = (struct sockaddr_pppox *)uservaddr; |
627 | struct pppox_sock *po = pppox_sk(sk); | 621 | struct pppox_sock *po = pppox_sk(sk); |
628 | struct net_device *dev; | 622 | struct net_device *dev = NULL; |
629 | struct pppoe_net *pn; | 623 | struct pppoe_net *pn; |
624 | struct net *net = NULL; | ||
630 | int error; | 625 | int error; |
631 | 626 | ||
632 | lock_sock(sk); | 627 | lock_sock(sk); |
@@ -652,12 +647,14 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
652 | /* Delete the old binding */ | 647 | /* Delete the old binding */ |
653 | if (stage_session(po->pppoe_pa.sid)) { | 648 | if (stage_session(po->pppoe_pa.sid)) { |
654 | pppox_unbind_sock(sk); | 649 | pppox_unbind_sock(sk); |
650 | pn = pppoe_pernet(sock_net(sk)); | ||
651 | delete_item(pn, po->pppoe_pa.sid, | ||
652 | po->pppoe_pa.remote, po->pppoe_ifindex); | ||
655 | if (po->pppoe_dev) { | 653 | if (po->pppoe_dev) { |
656 | pn = pppoe_pernet(dev_net(po->pppoe_dev)); | ||
657 | delete_item(pn, po->pppoe_pa.sid, | ||
658 | po->pppoe_pa.remote, po->pppoe_ifindex); | ||
659 | dev_put(po->pppoe_dev); | 654 | dev_put(po->pppoe_dev); |
655 | po->pppoe_dev = NULL; | ||
660 | } | 656 | } |
657 | |||
661 | memset(sk_pppox(po) + 1, 0, | 658 | memset(sk_pppox(po) + 1, 0, |
662 | sizeof(struct pppox_sock) - sizeof(struct sock)); | 659 | sizeof(struct pppox_sock) - sizeof(struct sock)); |
663 | sk->sk_state = PPPOX_NONE; | 660 | sk->sk_state = PPPOX_NONE; |
@@ -666,16 +663,15 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
666 | /* Re-bind in session stage only */ | 663 | /* Re-bind in session stage only */ |
667 | if (stage_session(sp->sa_addr.pppoe.sid)) { | 664 | if (stage_session(sp->sa_addr.pppoe.sid)) { |
668 | error = -ENODEV; | 665 | error = -ENODEV; |
669 | dev = dev_get_by_name(sock_net(sk), sp->sa_addr.pppoe.dev); | 666 | net = sock_net(sk); |
667 | dev = dev_get_by_name(net, sp->sa_addr.pppoe.dev); | ||
670 | if (!dev) | 668 | if (!dev) |
671 | goto end; | 669 | goto err_put; |
672 | 670 | ||
673 | po->pppoe_dev = dev; | 671 | po->pppoe_dev = dev; |
674 | po->pppoe_ifindex = dev->ifindex; | 672 | po->pppoe_ifindex = dev->ifindex; |
675 | pn = pppoe_pernet(dev_net(dev)); | 673 | pn = pppoe_pernet(net); |
676 | write_lock_bh(&pn->hash_lock); | ||
677 | if (!(dev->flags & IFF_UP)) { | 674 | if (!(dev->flags & IFF_UP)) { |
678 | write_unlock_bh(&pn->hash_lock); | ||
679 | goto err_put; | 675 | goto err_put; |
680 | } | 676 | } |
681 | 677 | ||
@@ -683,6 +679,7 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
683 | &sp->sa_addr.pppoe, | 679 | &sp->sa_addr.pppoe, |
684 | sizeof(struct pppoe_addr)); | 680 | sizeof(struct pppoe_addr)); |
685 | 681 | ||
682 | write_lock_bh(&pn->hash_lock); | ||
686 | error = __set_item(pn, po); | 683 | error = __set_item(pn, po); |
687 | write_unlock_bh(&pn->hash_lock); | 684 | write_unlock_bh(&pn->hash_lock); |
688 | if (error < 0) | 685 | if (error < 0) |
@@ -696,8 +693,11 @@ static int pppoe_connect(struct socket *sock, struct sockaddr *uservaddr, | |||
696 | po->chan.ops = &pppoe_chan_ops; | 693 | po->chan.ops = &pppoe_chan_ops; |
697 | 694 | ||
698 | error = ppp_register_net_channel(dev_net(dev), &po->chan); | 695 | error = ppp_register_net_channel(dev_net(dev), &po->chan); |
699 | if (error) | 696 | if (error) { |
697 | delete_item(pn, po->pppoe_pa.sid, | ||
698 | po->pppoe_pa.remote, po->pppoe_ifindex); | ||
700 | goto err_put; | 699 | goto err_put; |
700 | } | ||
701 | 701 | ||
702 | sk->sk_state = PPPOX_CONNECTED; | 702 | sk->sk_state = PPPOX_CONNECTED; |
703 | } | 703 | } |
@@ -915,6 +915,14 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb) | |||
915 | struct pppoe_hdr *ph; | 915 | struct pppoe_hdr *ph; |
916 | int data_len = skb->len; | 916 | int data_len = skb->len; |
917 | 917 | ||
918 | /* The higher-level PPP code (ppp_unregister_channel()) ensures the PPP | ||
919 | * xmit operations conclude prior to an unregistration call. Thus | ||
920 | * sk->sk_state cannot change, so we don't need to do lock_sock(). | ||
921 | * But, we also can't do a lock_sock since that introduces a potential | ||
922 | * deadlock as we'd reverse the lock ordering used when calling | ||
923 | * ppp_unregister_channel(). | ||
924 | */ | ||
925 | |||
918 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) | 926 | if (sock_flag(sk, SOCK_DEAD) || !(sk->sk_state & PPPOX_CONNECTED)) |
919 | goto abort; | 927 | goto abort; |
920 | 928 | ||
@@ -944,7 +952,6 @@ static int __pppoe_xmit(struct sock *sk, struct sk_buff *skb) | |||
944 | po->pppoe_pa.remote, NULL, data_len); | 952 | po->pppoe_pa.remote, NULL, data_len); |
945 | 953 | ||
946 | dev_queue_xmit(skb); | 954 | dev_queue_xmit(skb); |
947 | |||
948 | return 1; | 955 | return 1; |
949 | 956 | ||
950 | abort: | 957 | abort: |
diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h index e7285f01bd04..c2383adcd527 100644 --- a/drivers/net/qlge/qlge.h +++ b/drivers/net/qlge/qlge.h | |||
@@ -95,6 +95,7 @@ enum { | |||
95 | 95 | ||
96 | /* Misc. stuff */ | 96 | /* Misc. stuff */ |
97 | MAILBOX_COUNT = 16, | 97 | MAILBOX_COUNT = 16, |
98 | MAILBOX_TIMEOUT = 5, | ||
98 | 99 | ||
99 | PROC_ADDR_RDY = (1 << 31), | 100 | PROC_ADDR_RDY = (1 << 31), |
100 | PROC_ADDR_R = (1 << 30), | 101 | PROC_ADDR_R = (1 << 30), |
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c index 48b45df85ec9..cea7531f4f40 100644 --- a/drivers/net/qlge/qlge_main.c +++ b/drivers/net/qlge/qlge_main.c | |||
@@ -3916,6 +3916,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev, | |||
3916 | goto err_out; | 3916 | goto err_out; |
3917 | } | 3917 | } |
3918 | 3918 | ||
3919 | pci_save_state(pdev); | ||
3919 | qdev->reg_base = | 3920 | qdev->reg_base = |
3920 | ioremap_nocache(pci_resource_start(pdev, 1), | 3921 | ioremap_nocache(pci_resource_start(pdev, 1), |
3921 | pci_resource_len(pdev, 1)); | 3922 | pci_resource_len(pdev, 1)); |
@@ -4070,6 +4071,33 @@ static void __devexit qlge_remove(struct pci_dev *pdev) | |||
4070 | free_netdev(ndev); | 4071 | free_netdev(ndev); |
4071 | } | 4072 | } |
4072 | 4073 | ||
4074 | /* Clean up resources without touching hardware. */ | ||
4075 | static void ql_eeh_close(struct net_device *ndev) | ||
4076 | { | ||
4077 | int i; | ||
4078 | struct ql_adapter *qdev = netdev_priv(ndev); | ||
4079 | |||
4080 | if (netif_carrier_ok(ndev)) { | ||
4081 | netif_carrier_off(ndev); | ||
4082 | netif_stop_queue(ndev); | ||
4083 | } | ||
4084 | |||
4085 | if (test_bit(QL_ADAPTER_UP, &qdev->flags)) | ||
4086 | cancel_delayed_work_sync(&qdev->asic_reset_work); | ||
4087 | cancel_delayed_work_sync(&qdev->mpi_reset_work); | ||
4088 | cancel_delayed_work_sync(&qdev->mpi_work); | ||
4089 | cancel_delayed_work_sync(&qdev->mpi_idc_work); | ||
4090 | cancel_delayed_work_sync(&qdev->mpi_port_cfg_work); | ||
4091 | |||
4092 | for (i = 0; i < qdev->rss_ring_count; i++) | ||
4093 | netif_napi_del(&qdev->rx_ring[i].napi); | ||
4094 | |||
4095 | clear_bit(QL_ADAPTER_UP, &qdev->flags); | ||
4096 | ql_tx_ring_clean(qdev); | ||
4097 | ql_free_rx_buffers(qdev); | ||
4098 | ql_release_adapter_resources(qdev); | ||
4099 | } | ||
4100 | |||
4073 | /* | 4101 | /* |
4074 | * This callback is called by the PCI subsystem whenever | 4102 | * This callback is called by the PCI subsystem whenever |
4075 | * a PCI bus error is detected. | 4103 | * a PCI bus error is detected. |
@@ -4078,17 +4106,21 @@ static pci_ers_result_t qlge_io_error_detected(struct pci_dev *pdev, | |||
4078 | enum pci_channel_state state) | 4106 | enum pci_channel_state state) |
4079 | { | 4107 | { |
4080 | struct net_device *ndev = pci_get_drvdata(pdev); | 4108 | struct net_device *ndev = pci_get_drvdata(pdev); |
4081 | struct ql_adapter *qdev = netdev_priv(ndev); | ||
4082 | |||
4083 | netif_device_detach(ndev); | ||
4084 | 4109 | ||
4085 | if (state == pci_channel_io_perm_failure) | 4110 | switch (state) { |
4111 | case pci_channel_io_normal: | ||
4112 | return PCI_ERS_RESULT_CAN_RECOVER; | ||
4113 | case pci_channel_io_frozen: | ||
4114 | netif_device_detach(ndev); | ||
4115 | if (netif_running(ndev)) | ||
4116 | ql_eeh_close(ndev); | ||
4117 | pci_disable_device(pdev); | ||
4118 | return PCI_ERS_RESULT_NEED_RESET; | ||
4119 | case pci_channel_io_perm_failure: | ||
4120 | dev_err(&pdev->dev, | ||
4121 | "%s: pci_channel_io_perm_failure.\n", __func__); | ||
4086 | return PCI_ERS_RESULT_DISCONNECT; | 4122 | return PCI_ERS_RESULT_DISCONNECT; |
4087 | 4123 | } | |
4088 | if (netif_running(ndev)) | ||
4089 | ql_adapter_down(qdev); | ||
4090 | |||
4091 | pci_disable_device(pdev); | ||
4092 | 4124 | ||
4093 | /* Request a slot reset. */ | 4125 | /* Request a slot reset. */ |
4094 | return PCI_ERS_RESULT_NEED_RESET; | 4126 | return PCI_ERS_RESULT_NEED_RESET; |
@@ -4105,25 +4137,15 @@ static pci_ers_result_t qlge_io_slot_reset(struct pci_dev *pdev) | |||
4105 | struct net_device *ndev = pci_get_drvdata(pdev); | 4137 | struct net_device *ndev = pci_get_drvdata(pdev); |
4106 | struct ql_adapter *qdev = netdev_priv(ndev); | 4138 | struct ql_adapter *qdev = netdev_priv(ndev); |
4107 | 4139 | ||
4140 | pdev->error_state = pci_channel_io_normal; | ||
4141 | |||
4142 | pci_restore_state(pdev); | ||
4108 | if (pci_enable_device(pdev)) { | 4143 | if (pci_enable_device(pdev)) { |
4109 | QPRINTK(qdev, IFUP, ERR, | 4144 | QPRINTK(qdev, IFUP, ERR, |
4110 | "Cannot re-enable PCI device after reset.\n"); | 4145 | "Cannot re-enable PCI device after reset.\n"); |
4111 | return PCI_ERS_RESULT_DISCONNECT; | 4146 | return PCI_ERS_RESULT_DISCONNECT; |
4112 | } | 4147 | } |
4113 | |||
4114 | pci_set_master(pdev); | 4148 | pci_set_master(pdev); |
4115 | |||
4116 | netif_carrier_off(ndev); | ||
4117 | ql_adapter_reset(qdev); | ||
4118 | |||
4119 | /* Make sure the EEPROM is good */ | ||
4120 | memcpy(ndev->perm_addr, ndev->dev_addr, ndev->addr_len); | ||
4121 | |||
4122 | if (!is_valid_ether_addr(ndev->perm_addr)) { | ||
4123 | QPRINTK(qdev, IFUP, ERR, "After reset, invalid MAC address.\n"); | ||
4124 | return PCI_ERS_RESULT_DISCONNECT; | ||
4125 | } | ||
4126 | |||
4127 | return PCI_ERS_RESULT_RECOVERED; | 4149 | return PCI_ERS_RESULT_RECOVERED; |
4128 | } | 4150 | } |
4129 | 4151 | ||
@@ -4131,17 +4153,21 @@ static void qlge_io_resume(struct pci_dev *pdev) | |||
4131 | { | 4153 | { |
4132 | struct net_device *ndev = pci_get_drvdata(pdev); | 4154 | struct net_device *ndev = pci_get_drvdata(pdev); |
4133 | struct ql_adapter *qdev = netdev_priv(ndev); | 4155 | struct ql_adapter *qdev = netdev_priv(ndev); |
4156 | int err = 0; | ||
4134 | 4157 | ||
4135 | pci_set_master(pdev); | 4158 | if (ql_adapter_reset(qdev)) |
4136 | 4159 | QPRINTK(qdev, DRV, ERR, "reset FAILED!\n"); | |
4137 | if (netif_running(ndev)) { | 4160 | if (netif_running(ndev)) { |
4138 | if (ql_adapter_up(qdev)) { | 4161 | err = qlge_open(ndev); |
4162 | if (err) { | ||
4139 | QPRINTK(qdev, IFUP, ERR, | 4163 | QPRINTK(qdev, IFUP, ERR, |
4140 | "Device initialization failed after reset.\n"); | 4164 | "Device initialization failed after reset.\n"); |
4141 | return; | 4165 | return; |
4142 | } | 4166 | } |
4167 | } else { | ||
4168 | QPRINTK(qdev, IFUP, ERR, | ||
4169 | "Device was not running prior to EEH.\n"); | ||
4143 | } | 4170 | } |
4144 | |||
4145 | netif_device_attach(ndev); | 4171 | netif_device_attach(ndev); |
4146 | } | 4172 | } |
4147 | 4173 | ||
diff --git a/drivers/net/qlge/qlge_mpi.c b/drivers/net/qlge/qlge_mpi.c index 99e58e3f8e22..bcf13c96f73f 100644 --- a/drivers/net/qlge/qlge_mpi.c +++ b/drivers/net/qlge/qlge_mpi.c | |||
@@ -470,7 +470,8 @@ end: | |||
470 | */ | 470 | */ |
471 | static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | 471 | static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) |
472 | { | 472 | { |
473 | int status, count; | 473 | int status; |
474 | unsigned long count; | ||
474 | 475 | ||
475 | 476 | ||
476 | /* Begin polled mode for MPI */ | 477 | /* Begin polled mode for MPI */ |
@@ -491,9 +492,9 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
491 | /* Wait for the command to complete. We loop | 492 | /* Wait for the command to complete. We loop |
492 | * here because some AEN might arrive while | 493 | * here because some AEN might arrive while |
493 | * we're waiting for the mailbox command to | 494 | * we're waiting for the mailbox command to |
494 | * complete. If more than 5 arrive then we can | 495 | * complete. If more than 5 seconds expire we can |
495 | * assume something is wrong. */ | 496 | * assume something is wrong. */ |
496 | count = 5; | 497 | count = jiffies + HZ * MAILBOX_TIMEOUT; |
497 | do { | 498 | do { |
498 | /* Wait for the interrupt to come in. */ | 499 | /* Wait for the interrupt to come in. */ |
499 | status = ql_wait_mbx_cmd_cmplt(qdev); | 500 | status = ql_wait_mbx_cmd_cmplt(qdev); |
@@ -517,15 +518,15 @@ static int ql_mailbox_command(struct ql_adapter *qdev, struct mbox_params *mbcp) | |||
517 | MB_CMD_STS_GOOD) || | 518 | MB_CMD_STS_GOOD) || |
518 | ((mbcp->mbox_out[0] & 0x0000f000) == | 519 | ((mbcp->mbox_out[0] & 0x0000f000) == |
519 | MB_CMD_STS_INTRMDT)) | 520 | MB_CMD_STS_INTRMDT)) |
520 | break; | 521 | goto done; |
521 | } while (--count); | 522 | } while (time_before(jiffies, count)); |
522 | 523 | ||
523 | if (!count) { | 524 | QPRINTK(qdev, DRV, ERR, |
524 | QPRINTK(qdev, DRV, ERR, | 525 | "Timed out waiting for mailbox complete.\n"); |
525 | "Timed out waiting for mailbox complete.\n"); | 526 | status = -ETIMEDOUT; |
526 | status = -ETIMEDOUT; | 527 | goto end; |
527 | goto end; | 528 | |
528 | } | 529 | done: |
529 | 530 | ||
530 | /* Now we can clear the interrupt condition | 531 | /* Now we can clear the interrupt condition |
531 | * and look at our status. | 532 | * and look at our status. |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 83c47d95c3aa..fa4935678488 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -1029,7 +1029,10 @@ static void rtl8169_vlan_rx_register(struct net_device *dev, | |||
1029 | 1029 | ||
1030 | spin_lock_irqsave(&tp->lock, flags); | 1030 | spin_lock_irqsave(&tp->lock, flags); |
1031 | tp->vlgrp = grp; | 1031 | tp->vlgrp = grp; |
1032 | if (tp->vlgrp) | 1032 | /* |
1033 | * Do not disable RxVlan on 8110SCd. | ||
1034 | */ | ||
1035 | if (tp->vlgrp || (tp->mac_version == RTL_GIGA_MAC_VER_05)) | ||
1033 | tp->cp_cmd |= RxVlan; | 1036 | tp->cp_cmd |= RxVlan; |
1034 | else | 1037 | else |
1035 | tp->cp_cmd &= ~RxVlan; | 1038 | tp->cp_cmd &= ~RxVlan; |
@@ -3197,6 +3200,14 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3197 | } | 3200 | } |
3198 | 3201 | ||
3199 | rtl8169_init_phy(dev, tp); | 3202 | rtl8169_init_phy(dev, tp); |
3203 | |||
3204 | /* | ||
3205 | * Pretend we are using VLANs; This bypasses a nasty bug where | ||
3206 | * Interrupts stop flowing on high load on 8110SCd controllers. | ||
3207 | */ | ||
3208 | if (tp->mac_version == RTL_GIGA_MAC_VER_05) | ||
3209 | RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | RxVlan); | ||
3210 | |||
3200 | device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL); | 3211 | device_set_wakeup_enable(&pdev->dev, tp->features & RTL_FEATURE_WOL); |
3201 | 3212 | ||
3202 | out: | 3213 | out: |
@@ -3368,7 +3379,7 @@ static u16 rtl_rw_cpluscmd(void __iomem *ioaddr) | |||
3368 | static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz) | 3379 | static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz) |
3369 | { | 3380 | { |
3370 | /* Low hurts. Let's disable the filtering. */ | 3381 | /* Low hurts. Let's disable the filtering. */ |
3371 | RTL_W16(RxMaxSize, rx_buf_sz); | 3382 | RTL_W16(RxMaxSize, rx_buf_sz + 1); |
3372 | } | 3383 | } |
3373 | 3384 | ||
3374 | static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version) | 3385 | static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version) |
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c index 01f9432c31ef..98bff5ada09a 100644 --- a/drivers/net/sfc/rx.c +++ b/drivers/net/sfc/rx.c | |||
@@ -444,7 +444,8 @@ static void efx_rx_packet__check_len(struct efx_rx_queue *rx_queue, | |||
444 | * the appropriate LRO method | 444 | * the appropriate LRO method |
445 | */ | 445 | */ |
446 | static void efx_rx_packet_lro(struct efx_channel *channel, | 446 | static void efx_rx_packet_lro(struct efx_channel *channel, |
447 | struct efx_rx_buffer *rx_buf) | 447 | struct efx_rx_buffer *rx_buf, |
448 | bool checksummed) | ||
448 | { | 449 | { |
449 | struct napi_struct *napi = &channel->napi_str; | 450 | struct napi_struct *napi = &channel->napi_str; |
450 | 451 | ||
@@ -466,7 +467,8 @@ static void efx_rx_packet_lro(struct efx_channel *channel, | |||
466 | skb->len = rx_buf->len; | 467 | skb->len = rx_buf->len; |
467 | skb->data_len = rx_buf->len; | 468 | skb->data_len = rx_buf->len; |
468 | skb->truesize += rx_buf->len; | 469 | skb->truesize += rx_buf->len; |
469 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 470 | skb->ip_summed = |
471 | checksummed ? CHECKSUM_UNNECESSARY : CHECKSUM_NONE; | ||
470 | 472 | ||
471 | napi_gro_frags(napi); | 473 | napi_gro_frags(napi); |
472 | 474 | ||
@@ -475,6 +477,7 @@ out: | |||
475 | rx_buf->page = NULL; | 477 | rx_buf->page = NULL; |
476 | } else { | 478 | } else { |
477 | EFX_BUG_ON_PARANOID(!rx_buf->skb); | 479 | EFX_BUG_ON_PARANOID(!rx_buf->skb); |
480 | EFX_BUG_ON_PARANOID(!checksummed); | ||
478 | 481 | ||
479 | napi_gro_receive(napi, rx_buf->skb); | 482 | napi_gro_receive(napi, rx_buf->skb); |
480 | rx_buf->skb = NULL; | 483 | rx_buf->skb = NULL; |
@@ -570,7 +573,7 @@ void __efx_rx_packet(struct efx_channel *channel, | |||
570 | } | 573 | } |
571 | 574 | ||
572 | if (likely(checksummed || rx_buf->page)) { | 575 | if (likely(checksummed || rx_buf->page)) { |
573 | efx_rx_packet_lro(channel, rx_buf); | 576 | efx_rx_packet_lro(channel, rx_buf, checksummed); |
574 | goto done; | 577 | goto done; |
575 | } | 578 | } |
576 | 579 | ||
diff --git a/drivers/net/sh_eth.c b/drivers/net/sh_eth.c index f49d0800c1d1..528b912a4b0d 100644 --- a/drivers/net/sh_eth.c +++ b/drivers/net/sh_eth.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/phy.h> | 30 | #include <linux/phy.h> |
31 | #include <linux/cache.h> | 31 | #include <linux/cache.h> |
32 | #include <linux/io.h> | 32 | #include <linux/io.h> |
33 | #include <asm/cacheflush.h> | ||
33 | 34 | ||
34 | #include "sh_eth.h" | 35 | #include "sh_eth.h" |
35 | 36 | ||
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 2ab5c39f33ca..6a10d7ba5877 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c | |||
@@ -4538,6 +4538,8 @@ static int __devinit sky2_probe(struct pci_dev *pdev, | |||
4538 | goto err_out_free_netdev; | 4538 | goto err_out_free_netdev; |
4539 | } | 4539 | } |
4540 | 4540 | ||
4541 | netif_carrier_off(dev); | ||
4542 | |||
4541 | netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT); | 4543 | netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT); |
4542 | 4544 | ||
4543 | err = request_irq(pdev->irq, sky2_intr, | 4545 | err = request_irq(pdev->irq, sky2_intr, |
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 36cb2423bcf1..75fa32e34fd0 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c | |||
@@ -1144,9 +1144,16 @@ static void dir_open_adapter (struct net_device *dev) | |||
1144 | } else { | 1144 | } else { |
1145 | char **prphase = printphase; | 1145 | char **prphase = printphase; |
1146 | char **prerror = printerror; | 1146 | char **prerror = printerror; |
1147 | int pnr = err / 16 - 1; | ||
1148 | int enr = err % 16 - 1; | ||
1147 | DPRINTK("TR Adapter misc open failure, error code = "); | 1149 | DPRINTK("TR Adapter misc open failure, error code = "); |
1148 | printk("0x%x, Phase: %s, Error: %s\n", | 1150 | if (pnr < 0 || pnr >= ARRAY_SIZE(printphase) || |
1149 | err, prphase[err/16 -1], prerror[err%16 -1]); | 1151 | enr < 0 || |
1152 | enr >= ARRAY_SIZE(printerror)) | ||
1153 | printk("0x%x, invalid Phase/Error.", err); | ||
1154 | else | ||
1155 | printk("0x%x, Phase: %s, Error: %s\n", err, | ||
1156 | prphase[pnr], prerror[enr]); | ||
1150 | printk(" retrying after %ds delay...\n", | 1157 | printk(" retrying after %ds delay...\n", |
1151 | TR_RETRY_INTERVAL/HZ); | 1158 | TR_RETRY_INTERVAL/HZ); |
1152 | } | 1159 | } |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 72470f77f556..a2b30a10064f 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -649,6 +649,10 @@ static const struct usb_device_id products[] = { | |||
649 | USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */ | 649 | USB_DEVICE(0x0fe6, 0x8101), /* DM9601 USB to Fast Ethernet Adapter */ |
650 | .driver_info = (unsigned long)&dm9601_info, | 650 | .driver_info = (unsigned long)&dm9601_info, |
651 | }, | 651 | }, |
652 | { | ||
653 | USB_DEVICE(0x0a46, 0x9000), /* DM9000E */ | ||
654 | .driver_info = (unsigned long)&dm9601_info, | ||
655 | }, | ||
652 | {}, // END | 656 | {}, // END |
653 | }; | 657 | }; |
654 | 658 | ||
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 0caa8008c51c..f56dec6119c3 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -362,12 +362,12 @@ generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | |||
362 | retval = -EINVAL; | 362 | retval = -EINVAL; |
363 | goto halt_fail_and_release; | 363 | goto halt_fail_and_release; |
364 | } | 364 | } |
365 | dev->hard_mtu = tmp; | ||
366 | net->mtu = dev->hard_mtu - net->hard_header_len; | ||
367 | dev_warn(&intf->dev, | 365 | dev_warn(&intf->dev, |
368 | "dev can't take %u byte packets (max %u), " | 366 | "dev can't take %u byte packets (max %u), " |
369 | "adjusting MTU to %u\n", | 367 | "adjusting MTU to %u\n", |
370 | dev->hard_mtu, tmp, net->mtu); | 368 | dev->hard_mtu, tmp, tmp - net->hard_header_len); |
369 | dev->hard_mtu = tmp; | ||
370 | net->mtu = dev->hard_mtu - net->hard_header_len; | ||
371 | } | 371 | } |
372 | 372 | ||
373 | /* REVISIT: peripheral "alignment" request is ignored ... */ | 373 | /* REVISIT: peripheral "alignment" request is ignored ... */ |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8d009760277c..05630f2f6930 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
@@ -22,7 +22,6 @@ | |||
22 | #include <linux/ethtool.h> | 22 | #include <linux/ethtool.h> |
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/virtio.h> | 24 | #include <linux/virtio.h> |
25 | #include <linux/virtio_ids.h> | ||
26 | #include <linux/virtio_net.h> | 25 | #include <linux/virtio_net.h> |
27 | #include <linux/scatterlist.h> | 26 | #include <linux/scatterlist.h> |
28 | #include <linux/if_vlan.h> | 27 | #include <linux/if_vlan.h> |
@@ -454,7 +453,7 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi) | |||
454 | vi->dev->stats.tx_bytes += skb->len; | 453 | vi->dev->stats.tx_bytes += skb->len; |
455 | vi->dev->stats.tx_packets++; | 454 | vi->dev->stats.tx_packets++; |
456 | tot_sgs += skb_vnet_hdr(skb)->num_sg; | 455 | tot_sgs += skb_vnet_hdr(skb)->num_sg; |
457 | kfree_skb(skb); | 456 | dev_kfree_skb_any(skb); |
458 | } | 457 | } |
459 | return tot_sgs; | 458 | return tot_sgs; |
460 | } | 459 | } |
@@ -517,8 +516,7 @@ again: | |||
517 | /* Free up any pending old buffers before queueing new ones. */ | 516 | /* Free up any pending old buffers before queueing new ones. */ |
518 | free_old_xmit_skbs(vi); | 517 | free_old_xmit_skbs(vi); |
519 | 518 | ||
520 | /* Put new one in send queue and do transmit */ | 519 | /* Try to transmit */ |
521 | __skb_queue_head(&vi->send, skb); | ||
522 | capacity = xmit_skb(vi, skb); | 520 | capacity = xmit_skb(vi, skb); |
523 | 521 | ||
524 | /* This can happen with OOM and indirect buffers. */ | 522 | /* This can happen with OOM and indirect buffers. */ |
@@ -532,8 +530,17 @@ again: | |||
532 | } | 530 | } |
533 | return NETDEV_TX_BUSY; | 531 | return NETDEV_TX_BUSY; |
534 | } | 532 | } |
535 | |||
536 | vi->svq->vq_ops->kick(vi->svq); | 533 | vi->svq->vq_ops->kick(vi->svq); |
534 | |||
535 | /* | ||
536 | * Put new one in send queue. You'd expect we'd need this before | ||
537 | * xmit_skb calls add_buf(), since the callback can be triggered | ||
538 | * immediately after that. But since the callback just triggers | ||
539 | * another call back here, normal network xmit locking prevents the | ||
540 | * race. | ||
541 | */ | ||
542 | __skb_queue_head(&vi->send, skb); | ||
543 | |||
537 | /* Don't wait up for transmitted skbs to be freed. */ | 544 | /* Don't wait up for transmitted skbs to be freed. */ |
538 | skb_orphan(skb); | 545 | skb_orphan(skb); |
539 | nf_reset(skb); | 546 | nf_reset(skb); |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 6a16f76f277e..004353a46af0 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
@@ -481,7 +481,8 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
481 | } | 481 | } |
482 | rq->uncommitted[ring_idx] += num_allocated; | 482 | rq->uncommitted[ring_idx] += num_allocated; |
483 | 483 | ||
484 | dprintk(KERN_ERR "alloc_rx_buf: %d allocated, next2fill %u, next2comp " | 484 | dev_dbg(&adapter->netdev->dev, |
485 | "alloc_rx_buf: %d allocated, next2fill %u, next2comp " | ||
485 | "%u, uncommited %u\n", num_allocated, ring->next2fill, | 486 | "%u, uncommited %u\n", num_allocated, ring->next2fill, |
486 | ring->next2comp, rq->uncommitted[ring_idx]); | 487 | ring->next2comp, rq->uncommitted[ring_idx]); |
487 | 488 | ||
@@ -539,7 +540,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
539 | tbi = tq->buf_info + tq->tx_ring.next2fill; | 540 | tbi = tq->buf_info + tq->tx_ring.next2fill; |
540 | tbi->map_type = VMXNET3_MAP_NONE; | 541 | tbi->map_type = VMXNET3_MAP_NONE; |
541 | 542 | ||
542 | dprintk(KERN_ERR "txd[%u]: 0x%Lx 0x%x 0x%x\n", | 543 | dev_dbg(&adapter->netdev->dev, |
544 | "txd[%u]: 0x%Lx 0x%x 0x%x\n", | ||
543 | tq->tx_ring.next2fill, ctx->sop_txd->txd.addr, | 545 | tq->tx_ring.next2fill, ctx->sop_txd->txd.addr, |
544 | ctx->sop_txd->dword[2], ctx->sop_txd->dword[3]); | 546 | ctx->sop_txd->dword[2], ctx->sop_txd->dword[3]); |
545 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 547 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
@@ -572,7 +574,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
572 | gdesc->dword[2] = dw2 | buf_size; | 574 | gdesc->dword[2] = dw2 | buf_size; |
573 | gdesc->dword[3] = 0; | 575 | gdesc->dword[3] = 0; |
574 | 576 | ||
575 | dprintk(KERN_ERR "txd[%u]: 0x%Lx 0x%x 0x%x\n", | 577 | dev_dbg(&adapter->netdev->dev, |
578 | "txd[%u]: 0x%Lx 0x%x 0x%x\n", | ||
576 | tq->tx_ring.next2fill, gdesc->txd.addr, | 579 | tq->tx_ring.next2fill, gdesc->txd.addr, |
577 | gdesc->dword[2], gdesc->dword[3]); | 580 | gdesc->dword[2], gdesc->dword[3]); |
578 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 581 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
@@ -600,7 +603,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
600 | gdesc->dword[2] = dw2 | frag->size; | 603 | gdesc->dword[2] = dw2 | frag->size; |
601 | gdesc->dword[3] = 0; | 604 | gdesc->dword[3] = 0; |
602 | 605 | ||
603 | dprintk(KERN_ERR "txd[%u]: 0x%llu %u %u\n", | 606 | dev_dbg(&adapter->netdev->dev, |
607 | "txd[%u]: 0x%llu %u %u\n", | ||
604 | tq->tx_ring.next2fill, gdesc->txd.addr, | 608 | tq->tx_ring.next2fill, gdesc->txd.addr, |
605 | gdesc->dword[2], gdesc->dword[3]); | 609 | gdesc->dword[2], gdesc->dword[3]); |
606 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 610 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
@@ -697,7 +701,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
697 | tdd = tq->data_ring.base + tq->tx_ring.next2fill; | 701 | tdd = tq->data_ring.base + tq->tx_ring.next2fill; |
698 | 702 | ||
699 | memcpy(tdd->data, skb->data, ctx->copy_size); | 703 | memcpy(tdd->data, skb->data, ctx->copy_size); |
700 | dprintk(KERN_ERR "copy %u bytes to dataRing[%u]\n", | 704 | dev_dbg(&adapter->netdev->dev, |
705 | "copy %u bytes to dataRing[%u]\n", | ||
701 | ctx->copy_size, tq->tx_ring.next2fill); | 706 | ctx->copy_size, tq->tx_ring.next2fill); |
702 | return 1; | 707 | return 1; |
703 | 708 | ||
@@ -808,7 +813,8 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
808 | 813 | ||
809 | if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { | 814 | if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { |
810 | tq->stats.tx_ring_full++; | 815 | tq->stats.tx_ring_full++; |
811 | dprintk(KERN_ERR "tx queue stopped on %s, next2comp %u" | 816 | dev_dbg(&adapter->netdev->dev, |
817 | "tx queue stopped on %s, next2comp %u" | ||
812 | " next2fill %u\n", adapter->netdev->name, | 818 | " next2fill %u\n", adapter->netdev->name, |
813 | tq->tx_ring.next2comp, tq->tx_ring.next2fill); | 819 | tq->tx_ring.next2comp, tq->tx_ring.next2fill); |
814 | 820 | ||
@@ -853,7 +859,8 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
853 | 859 | ||
854 | /* finally flips the GEN bit of the SOP desc */ | 860 | /* finally flips the GEN bit of the SOP desc */ |
855 | gdesc->dword[2] ^= VMXNET3_TXD_GEN; | 861 | gdesc->dword[2] ^= VMXNET3_TXD_GEN; |
856 | dprintk(KERN_ERR "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n", | 862 | dev_dbg(&adapter->netdev->dev, |
863 | "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n", | ||
857 | (u32)((union Vmxnet3_GenericDesc *)ctx.sop_txd - | 864 | (u32)((union Vmxnet3_GenericDesc *)ctx.sop_txd - |
858 | tq->tx_ring.base), gdesc->txd.addr, gdesc->dword[2], | 865 | tq->tx_ring.base), gdesc->txd.addr, gdesc->dword[2], |
859 | gdesc->dword[3]); | 866 | gdesc->dword[3]); |
@@ -990,7 +997,8 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
990 | if (unlikely(rcd->len == 0)) { | 997 | if (unlikely(rcd->len == 0)) { |
991 | /* Pretend the rx buffer is skipped. */ | 998 | /* Pretend the rx buffer is skipped. */ |
992 | BUG_ON(!(rcd->sop && rcd->eop)); | 999 | BUG_ON(!(rcd->sop && rcd->eop)); |
993 | dprintk(KERN_ERR "rxRing[%u][%u] 0 length\n", | 1000 | dev_dbg(&adapter->netdev->dev, |
1001 | "rxRing[%u][%u] 0 length\n", | ||
994 | ring_idx, idx); | 1002 | ring_idx, idx); |
995 | goto rcd_done; | 1003 | goto rcd_done; |
996 | } | 1004 | } |
@@ -1683,7 +1691,8 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) | |||
1683 | int err; | 1691 | int err; |
1684 | u32 ret; | 1692 | u32 ret; |
1685 | 1693 | ||
1686 | dprintk(KERN_ERR "%s: skb_buf_size %d, rx_buf_per_pkt %d, ring sizes" | 1694 | dev_dbg(&adapter->netdev->dev, |
1695 | "%s: skb_buf_size %d, rx_buf_per_pkt %d, ring sizes" | ||
1687 | " %u %u %u\n", adapter->netdev->name, adapter->skb_buf_size, | 1696 | " %u %u %u\n", adapter->netdev->name, adapter->skb_buf_size, |
1688 | adapter->rx_buf_per_pkt, adapter->tx_queue.tx_ring.size, | 1697 | adapter->rx_buf_per_pkt, adapter->tx_queue.tx_ring.size, |
1689 | adapter->rx_queue.rx_ring[0].size, | 1698 | adapter->rx_queue.rx_ring[0].size, |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 6bb91576e999..3c0d70d58111 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | #include <linux/ethtool.h> | 31 | #include <linux/ethtool.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | #include <linux/device.h> | ||
33 | #include <linux/netdevice.h> | 34 | #include <linux/netdevice.h> |
34 | #include <linux/pci.h> | 35 | #include <linux/pci.h> |
35 | #include <linux/ethtool.h> | 36 | #include <linux/ethtool.h> |
@@ -59,7 +60,6 @@ | |||
59 | #include <linux/if_vlan.h> | 60 | #include <linux/if_vlan.h> |
60 | #include <linux/if_arp.h> | 61 | #include <linux/if_arp.h> |
61 | #include <linux/inetdevice.h> | 62 | #include <linux/inetdevice.h> |
62 | #include <linux/dst.h> | ||
63 | 63 | ||
64 | #include "vmxnet3_defs.h" | 64 | #include "vmxnet3_defs.h" |
65 | 65 | ||
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c index 7116a1aa20ce..abf896a7390e 100644 --- a/drivers/net/wireless/airo.c +++ b/drivers/net/wireless/airo.c | |||
@@ -4790,9 +4790,8 @@ static int proc_stats_rid_open( struct inode *inode, | |||
4790 | static int get_dec_u16( char *buffer, int *start, int limit ) { | 4790 | static int get_dec_u16( char *buffer, int *start, int limit ) { |
4791 | u16 value; | 4791 | u16 value; |
4792 | int valid = 0; | 4792 | int valid = 0; |
4793 | for( value = 0; buffer[*start] >= '0' && | 4793 | for (value = 0; *start < limit && buffer[*start] >= '0' && |
4794 | buffer[*start] <= '9' && | 4794 | buffer[*start] <= '9'; (*start)++) { |
4795 | *start < limit; (*start)++ ) { | ||
4796 | valid = 1; | 4795 | valid = 1; |
4797 | value *= 10; | 4796 | value *= 10; |
4798 | value += buffer[*start] - '0'; | 4797 | value += buffer[*start] - '0'; |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index 16a271787b85..1895d63aad0a 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -679,7 +679,7 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc, | |||
679 | return rate; | 679 | return rate; |
680 | 680 | ||
681 | if (rate_table->info[rate].valid_single_stream && | 681 | if (rate_table->info[rate].valid_single_stream && |
682 | !(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG)); | 682 | !(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG)) |
683 | return rate; | 683 | return rate; |
684 | 684 | ||
685 | /* This should not happen */ | 685 | /* This should not happen */ |
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 8701034569fa..de4e804bedf0 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
@@ -1157,8 +1157,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot) | |||
1157 | } | 1157 | } |
1158 | 1158 | ||
1159 | static int dma_tx_fragment(struct b43_dmaring *ring, | 1159 | static int dma_tx_fragment(struct b43_dmaring *ring, |
1160 | struct sk_buff *skb) | 1160 | struct sk_buff **in_skb) |
1161 | { | 1161 | { |
1162 | struct sk_buff *skb = *in_skb; | ||
1162 | const struct b43_dma_ops *ops = ring->ops; | 1163 | const struct b43_dma_ops *ops = ring->ops; |
1163 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1164 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1164 | u8 *header; | 1165 | u8 *header; |
@@ -1224,8 +1225,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1224 | } | 1225 | } |
1225 | 1226 | ||
1226 | memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); | 1227 | memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len); |
1228 | memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb)); | ||
1229 | bounce_skb->dev = skb->dev; | ||
1230 | skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb)); | ||
1231 | info = IEEE80211_SKB_CB(bounce_skb); | ||
1232 | |||
1227 | dev_kfree_skb_any(skb); | 1233 | dev_kfree_skb_any(skb); |
1228 | skb = bounce_skb; | 1234 | skb = bounce_skb; |
1235 | *in_skb = bounce_skb; | ||
1229 | meta->skb = skb; | 1236 | meta->skb = skb; |
1230 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | 1237 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); |
1231 | if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { | 1238 | if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) { |
@@ -1355,7 +1362,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb) | |||
1355 | * static, so we don't need to store it per frame. */ | 1362 | * static, so we don't need to store it per frame. */ |
1356 | ring->queue_prio = skb_get_queue_mapping(skb); | 1363 | ring->queue_prio = skb_get_queue_mapping(skb); |
1357 | 1364 | ||
1358 | err = dma_tx_fragment(ring, skb); | 1365 | /* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing |
1366 | * into the skb data or cb now. */ | ||
1367 | hdr = NULL; | ||
1368 | info = NULL; | ||
1369 | err = dma_tx_fragment(ring, &skb); | ||
1359 | if (unlikely(err == -ENOKEY)) { | 1370 | if (unlikely(err == -ENOKEY)) { |
1360 | /* Drop this packet, as we don't have the encryption key | 1371 | /* Drop this packet, as we don't have the encryption key |
1361 | * anymore and must not transmit it unencrypted. */ | 1372 | * anymore and must not transmit it unencrypted. */ |
diff --git a/drivers/net/wireless/b43/leds.h b/drivers/net/wireless/b43/leds.h index 4c56187810fc..32b66d53cdac 100644 --- a/drivers/net/wireless/b43/leds.h +++ b/drivers/net/wireless/b43/leds.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef B43_LEDS_H_ | 1 | #ifndef B43_LEDS_H_ |
2 | #define B43_LEDS_H_ | 2 | #define B43_LEDS_H_ |
3 | 3 | ||
4 | struct b43_wl; | ||
4 | struct b43_wldev; | 5 | struct b43_wldev; |
5 | 6 | ||
6 | #ifdef CONFIG_B43_LEDS | 7 | #ifdef CONFIG_B43_LEDS |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index df6b26a0c05e..86f35827f008 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -4501,7 +4501,6 @@ static void b43_op_stop(struct ieee80211_hw *hw) | |||
4501 | 4501 | ||
4502 | cancel_work_sync(&(wl->beacon_update_trigger)); | 4502 | cancel_work_sync(&(wl->beacon_update_trigger)); |
4503 | 4503 | ||
4504 | wiphy_rfkill_stop_polling(hw->wiphy); | ||
4505 | mutex_lock(&wl->mutex); | 4504 | mutex_lock(&wl->mutex); |
4506 | if (b43_status(dev) >= B43_STAT_STARTED) { | 4505 | if (b43_status(dev) >= B43_STAT_STARTED) { |
4507 | dev = b43_wireless_core_stop(dev); | 4506 | dev = b43_wireless_core_stop(dev); |
diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c index 7a3218c5ba7d..ffdce6f3c909 100644 --- a/drivers/net/wireless/b43/rfkill.c +++ b/drivers/net/wireless/b43/rfkill.c | |||
@@ -33,7 +33,8 @@ bool b43_is_hw_radio_enabled(struct b43_wldev *dev) | |||
33 | & B43_MMIO_RADIO_HWENABLED_HI_MASK)) | 33 | & B43_MMIO_RADIO_HWENABLED_HI_MASK)) |
34 | return 1; | 34 | return 1; |
35 | } else { | 35 | } else { |
36 | if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) | 36 | if (b43_status(dev) >= B43_STAT_STARTED && |
37 | b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO) | ||
37 | & B43_MMIO_RADIO_HWENABLED_LO_MASK) | 38 | & B43_MMIO_RADIO_HWENABLED_LO_MASK) |
38 | return 1; | 39 | return 1; |
39 | } | 40 | } |
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c index 240cff1e6979..a741d37fd96f 100644 --- a/drivers/net/wireless/ipw2x00/ipw2100.c +++ b/drivers/net/wireless/ipw2x00/ipw2100.c | |||
@@ -6325,8 +6325,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev, | |||
6325 | 6325 | ||
6326 | fail: | 6326 | fail: |
6327 | if (dev) { | 6327 | if (dev) { |
6328 | if (registered) | 6328 | if (registered) { |
6329 | unregister_ieee80211(priv->ieee); | ||
6329 | unregister_netdev(dev); | 6330 | unregister_netdev(dev); |
6331 | } | ||
6330 | 6332 | ||
6331 | ipw2100_hw_stop_adapter(priv); | 6333 | ipw2100_hw_stop_adapter(priv); |
6332 | 6334 | ||
@@ -6383,6 +6385,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev) | |||
6383 | /* Unregister the device first - this results in close() | 6385 | /* Unregister the device first - this results in close() |
6384 | * being called if the device is open. If we free storage | 6386 | * being called if the device is open. If we free storage |
6385 | * first, then close() will crash. */ | 6387 | * first, then close() will crash. */ |
6388 | unregister_ieee80211(priv->ieee); | ||
6386 | unregister_netdev(dev); | 6389 | unregister_netdev(dev); |
6387 | 6390 | ||
6388 | /* ipw2100_down will ensure that there is no more pending work | 6391 | /* ipw2100_down will ensure that there is no more pending work |
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c index 827824d45de9..9b0f2c0646e0 100644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c +++ b/drivers/net/wireless/ipw2x00/ipw2200.c | |||
@@ -11822,6 +11822,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev, | |||
11822 | if (err) { | 11822 | if (err) { |
11823 | IPW_ERROR("Failed to register promiscuous network " | 11823 | IPW_ERROR("Failed to register promiscuous network " |
11824 | "device (error %d).\n", err); | 11824 | "device (error %d).\n", err); |
11825 | unregister_ieee80211(priv->ieee); | ||
11825 | unregister_netdev(priv->net_dev); | 11826 | unregister_netdev(priv->net_dev); |
11826 | goto out_remove_sysfs; | 11827 | goto out_remove_sysfs; |
11827 | } | 11828 | } |
@@ -11872,6 +11873,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev) | |||
11872 | 11873 | ||
11873 | mutex_unlock(&priv->mutex); | 11874 | mutex_unlock(&priv->mutex); |
11874 | 11875 | ||
11876 | unregister_ieee80211(priv->ieee); | ||
11875 | unregister_netdev(priv->net_dev); | 11877 | unregister_netdev(priv->net_dev); |
11876 | 11878 | ||
11877 | if (priv->rxq) { | 11879 | if (priv->rxq) { |
diff --git a/drivers/net/wireless/ipw2x00/libipw.h b/drivers/net/wireless/ipw2x00/libipw.h index bf45391172f3..f42ade6c2d3e 100644 --- a/drivers/net/wireless/ipw2x00/libipw.h +++ b/drivers/net/wireless/ipw2x00/libipw.h | |||
@@ -1020,6 +1020,7 @@ static inline int libipw_is_cck_rate(u8 rate) | |||
1020 | /* ieee80211.c */ | 1020 | /* ieee80211.c */ |
1021 | extern void free_ieee80211(struct net_device *dev, int monitor); | 1021 | extern void free_ieee80211(struct net_device *dev, int monitor); |
1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); | 1022 | extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor); |
1023 | extern void unregister_ieee80211(struct libipw_device *ieee); | ||
1023 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); | 1024 | extern int libipw_change_mtu(struct net_device *dev, int new_mtu); |
1024 | 1025 | ||
1025 | extern void libipw_networks_age(struct libipw_device *ieee, | 1026 | extern void libipw_networks_age(struct libipw_device *ieee, |
diff --git a/drivers/net/wireless/ipw2x00/libipw_module.c b/drivers/net/wireless/ipw2x00/libipw_module.c index a0e9f6aed7da..be5b809ec97a 100644 --- a/drivers/net/wireless/ipw2x00/libipw_module.c +++ b/drivers/net/wireless/ipw2x00/libipw_module.c | |||
@@ -235,16 +235,19 @@ void free_ieee80211(struct net_device *dev, int monitor) | |||
235 | libipw_networks_free(ieee); | 235 | libipw_networks_free(ieee); |
236 | 236 | ||
237 | /* free cfg80211 resources */ | 237 | /* free cfg80211 resources */ |
238 | if (!monitor) { | 238 | if (!monitor) |
239 | wiphy_unregister(ieee->wdev.wiphy); | ||
240 | kfree(ieee->a_band.channels); | ||
241 | kfree(ieee->bg_band.channels); | ||
242 | wiphy_free(ieee->wdev.wiphy); | 239 | wiphy_free(ieee->wdev.wiphy); |
243 | } | ||
244 | 240 | ||
245 | free_netdev(dev); | 241 | free_netdev(dev); |
246 | } | 242 | } |
247 | 243 | ||
244 | void unregister_ieee80211(struct libipw_device *ieee) | ||
245 | { | ||
246 | wiphy_unregister(ieee->wdev.wiphy); | ||
247 | kfree(ieee->a_band.channels); | ||
248 | kfree(ieee->bg_band.channels); | ||
249 | } | ||
250 | |||
248 | #ifdef CONFIG_LIBIPW_DEBUG | 251 | #ifdef CONFIG_LIBIPW_DEBUG |
249 | 252 | ||
250 | static int debug = 0; | 253 | static int debug = 0; |
@@ -330,3 +333,4 @@ module_init(libipw_init); | |||
330 | 333 | ||
331 | EXPORT_SYMBOL(alloc_ieee80211); | 334 | EXPORT_SYMBOL(alloc_ieee80211); |
332 | EXPORT_SYMBOL(free_ieee80211); | 335 | EXPORT_SYMBOL(free_ieee80211); |
336 | EXPORT_SYMBOL(unregister_ieee80211); | ||
diff --git a/drivers/net/wireless/libertas/if_spi.c b/drivers/net/wireless/libertas/if_spi.c index cb8be8d7abc1..5b3672c4d0cc 100644 --- a/drivers/net/wireless/libertas/if_spi.c +++ b/drivers/net/wireless/libertas/if_spi.c | |||
@@ -134,7 +134,7 @@ static void spu_transaction_finish(struct if_spi_card *card) | |||
134 | static int spu_write(struct if_spi_card *card, u16 reg, const u8 *buf, int len) | 134 | static int spu_write(struct if_spi_card *card, u16 reg, const u8 *buf, int len) |
135 | { | 135 | { |
136 | int err = 0; | 136 | int err = 0; |
137 | u16 reg_out = cpu_to_le16(reg | IF_SPI_WRITE_OPERATION_MASK); | 137 | __le16 reg_out = cpu_to_le16(reg | IF_SPI_WRITE_OPERATION_MASK); |
138 | struct spi_message m; | 138 | struct spi_message m; |
139 | struct spi_transfer reg_trans; | 139 | struct spi_transfer reg_trans; |
140 | struct spi_transfer data_trans; | 140 | struct spi_transfer data_trans; |
@@ -166,7 +166,7 @@ static int spu_write(struct if_spi_card *card, u16 reg, const u8 *buf, int len) | |||
166 | 166 | ||
167 | static inline int spu_write_u16(struct if_spi_card *card, u16 reg, u16 val) | 167 | static inline int spu_write_u16(struct if_spi_card *card, u16 reg, u16 val) |
168 | { | 168 | { |
169 | u16 buff; | 169 | __le16 buff; |
170 | 170 | ||
171 | buff = cpu_to_le16(val); | 171 | buff = cpu_to_le16(val); |
172 | return spu_write(card, reg, (u8 *)&buff, sizeof(u16)); | 172 | return spu_write(card, reg, (u8 *)&buff, sizeof(u16)); |
@@ -188,7 +188,7 @@ static int spu_read(struct if_spi_card *card, u16 reg, u8 *buf, int len) | |||
188 | { | 188 | { |
189 | unsigned int delay; | 189 | unsigned int delay; |
190 | int err = 0; | 190 | int err = 0; |
191 | u16 reg_out = cpu_to_le16(reg | IF_SPI_READ_OPERATION_MASK); | 191 | __le16 reg_out = cpu_to_le16(reg | IF_SPI_READ_OPERATION_MASK); |
192 | struct spi_message m; | 192 | struct spi_message m; |
193 | struct spi_transfer reg_trans; | 193 | struct spi_transfer reg_trans; |
194 | struct spi_transfer dummy_trans; | 194 | struct spi_transfer dummy_trans; |
@@ -235,7 +235,7 @@ static int spu_read(struct if_spi_card *card, u16 reg, u8 *buf, int len) | |||
235 | /* Read 16 bits from an SPI register */ | 235 | /* Read 16 bits from an SPI register */ |
236 | static inline int spu_read_u16(struct if_spi_card *card, u16 reg, u16 *val) | 236 | static inline int spu_read_u16(struct if_spi_card *card, u16 reg, u16 *val) |
237 | { | 237 | { |
238 | u16 buf; | 238 | __le16 buf; |
239 | int ret; | 239 | int ret; |
240 | 240 | ||
241 | ret = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); | 241 | ret = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); |
@@ -248,7 +248,7 @@ static inline int spu_read_u16(struct if_spi_card *card, u16 reg, u16 *val) | |||
248 | * The low 16 bits are read first. */ | 248 | * The low 16 bits are read first. */ |
249 | static int spu_read_u32(struct if_spi_card *card, u16 reg, u32 *val) | 249 | static int spu_read_u32(struct if_spi_card *card, u16 reg, u32 *val) |
250 | { | 250 | { |
251 | u32 buf; | 251 | __le32 buf; |
252 | int err; | 252 | int err; |
253 | 253 | ||
254 | err = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); | 254 | err = spu_read(card, reg, (u8 *)&buf, sizeof(buf)); |
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index 92bc8c5f1ca2..3fac4efa5ac8 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c | |||
@@ -508,7 +508,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp, | |||
508 | /* Fill the receive configuration URB and initialise the Rx call back */ | 508 | /* Fill the receive configuration URB and initialise the Rx call back */ |
509 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, | 509 | usb_fill_bulk_urb(cardp->rx_urb, cardp->udev, |
510 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), | 510 | usb_rcvbulkpipe(cardp->udev, cardp->ep_in), |
511 | (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET), | 511 | skb->data + IPFIELD_ALIGN_OFFSET, |
512 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, | 512 | MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, |
513 | cardp); | 513 | cardp); |
514 | 514 | ||
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c index 88cd58eb3b9f..1c88c2ea59aa 100644 --- a/drivers/net/wireless/ray_cs.c +++ b/drivers/net/wireless/ray_cs.c | |||
@@ -2879,7 +2879,7 @@ static int write_essid(struct file *file, const char __user *buffer, | |||
2879 | unsigned long count, void *data) | 2879 | unsigned long count, void *data) |
2880 | { | 2880 | { |
2881 | static char proc_essid[33]; | 2881 | static char proc_essid[33]; |
2882 | int len = count; | 2882 | unsigned int len = count; |
2883 | 2883 | ||
2884 | if (len > 32) | 2884 | if (len > 32) |
2885 | len = 32; | 2885 | len = 32; |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index a084077a1c61..9fe770f7d7bb 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -1994,7 +1994,7 @@ static void rt2800usb_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1994 | rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->ba_size); | 1994 | rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->ba_size); |
1995 | rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID, | 1995 | rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID, |
1996 | test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags) ? | 1996 | test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags) ? |
1997 | (skbdesc->entry->entry_idx + 1) : 0xff); | 1997 | txdesc->key_idx : 0xff); |
1998 | rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, | 1998 | rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, |
1999 | skb->len - txdesc->l2pad); | 1999 | skb->len - txdesc->l2pad); |
2000 | rt2x00_set_field32(&word, TXWI_W1_PACKETID, | 2000 | rt2x00_set_field32(&word, TXWI_W1_PACKETID, |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index b8f5ee33445e..14e7bb210075 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -2389,10 +2389,13 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
2389 | { USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) }, | 2389 | { USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) }, |
2390 | { USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) }, | 2390 | { USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) }, |
2391 | /* MSI */ | 2391 | /* MSI */ |
2392 | { USB_DEVICE(0x0db0, 0x4600), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2392 | { USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) }, | 2393 | { USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) }, |
2393 | { USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) }, | 2394 | { USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) }, |
2394 | { USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) }, | 2395 | { USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) }, |
2395 | { USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) }, | 2396 | { USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) }, |
2397 | /* Ovislink */ | ||
2398 | { USB_DEVICE(0x1b75, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2396 | /* Ralink */ | 2399 | /* Ralink */ |
2397 | { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, | 2400 | { USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) }, |
2398 | { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, | 2401 | { USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) }, |
@@ -2420,6 +2423,8 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
2420 | /* Planex */ | 2423 | /* Planex */ |
2421 | { USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) }, | 2424 | { USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) }, |
2422 | { USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) }, | 2425 | { USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) }, |
2426 | /* WideTell */ | ||
2427 | { USB_DEVICE(0x7167, 0x3840), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2423 | /* Zcom */ | 2428 | /* Zcom */ |
2424 | { USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) }, | 2429 | { USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) }, |
2425 | /* ZyXEL */ | 2430 | /* ZyXEL */ |
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c index bacaa536fd51..4b22ba568b19 100644 --- a/drivers/of/of_mdio.c +++ b/drivers/of/of_mdio.c | |||
@@ -97,6 +97,12 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | |||
97 | } | 97 | } |
98 | EXPORT_SYMBOL(of_mdiobus_register); | 98 | EXPORT_SYMBOL(of_mdiobus_register); |
99 | 99 | ||
100 | /* Helper function for of_phy_find_device */ | ||
101 | static int of_phy_match(struct device *dev, void *phy_np) | ||
102 | { | ||
103 | return dev_archdata_get_node(&dev->archdata) == phy_np; | ||
104 | } | ||
105 | |||
100 | /** | 106 | /** |
101 | * of_phy_find_device - Give a PHY node, find the phy_device | 107 | * of_phy_find_device - Give a PHY node, find the phy_device |
102 | * @phy_np: Pointer to the phy's device tree node | 108 | * @phy_np: Pointer to the phy's device tree node |
@@ -106,15 +112,10 @@ EXPORT_SYMBOL(of_mdiobus_register); | |||
106 | struct phy_device *of_phy_find_device(struct device_node *phy_np) | 112 | struct phy_device *of_phy_find_device(struct device_node *phy_np) |
107 | { | 113 | { |
108 | struct device *d; | 114 | struct device *d; |
109 | int match(struct device *dev, void *phy_np) | ||
110 | { | ||
111 | return dev_archdata_get_node(&dev->archdata) == phy_np; | ||
112 | } | ||
113 | |||
114 | if (!phy_np) | 115 | if (!phy_np) |
115 | return NULL; | 116 | return NULL; |
116 | 117 | ||
117 | d = bus_find_device(&mdio_bus_type, NULL, phy_np, match); | 118 | d = bus_find_device(&mdio_bus_type, NULL, phy_np, of_phy_match); |
118 | return d ? to_phy_device(d) : NULL; | 119 | return d ? to_phy_device(d) : NULL; |
119 | } | 120 | } |
120 | EXPORT_SYMBOL(of_phy_find_device); | 121 | EXPORT_SYMBOL(of_phy_find_device); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index a790b1771f9f..245d2cdb4765 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1009,7 +1009,7 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, | |||
1009 | 1009 | ||
1010 | static void __devinit quirk_amd_ide_mode(struct pci_dev *pdev) | 1010 | static void __devinit quirk_amd_ide_mode(struct pci_dev *pdev) |
1011 | { | 1011 | { |
1012 | /* set SBX00 SATA in IDE mode to AHCI mode */ | 1012 | /* set SBX00/Hudson-2 SATA in IDE mode to AHCI mode */ |
1013 | u8 tmp; | 1013 | u8 tmp; |
1014 | 1014 | ||
1015 | pci_read_config_byte(pdev, PCI_CLASS_DEVICE, &tmp); | 1015 | pci_read_config_byte(pdev, PCI_CLASS_DEVICE, &tmp); |
@@ -1028,8 +1028,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk | |||
1028 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode); | 1028 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode); |
1029 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); | 1029 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); |
1030 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); | 1030 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); |
1031 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SB900_SATA_IDE, quirk_amd_ide_mode); | 1031 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE, quirk_amd_ide_mode); |
1032 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_SB900_SATA_IDE, quirk_amd_ide_mode); | 1032 | DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_HUDSON2_SATA_IDE, quirk_amd_ide_mode); |
1033 | 1033 | ||
1034 | /* | 1034 | /* |
1035 | * Serverworks CSB5 IDE does not fully support native mode | 1035 | * Serverworks CSB5 IDE does not fully support native mode |
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 0959430534b2..cb1a027eb552 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -299,17 +299,8 @@ static struct resource *find_free_bus_resource(struct pci_bus *bus, unsigned lon | |||
299 | r = bus->resource[i]; | 299 | r = bus->resource[i]; |
300 | if (r == &ioport_resource || r == &iomem_resource) | 300 | if (r == &ioport_resource || r == &iomem_resource) |
301 | continue; | 301 | continue; |
302 | if (r && (r->flags & type_mask) == type) { | 302 | if (r && (r->flags & type_mask) == type && !r->parent) |
303 | if (!r->parent) | 303 | return r; |
304 | return r; | ||
305 | /* | ||
306 | * if there is no child under that, we should release | ||
307 | * and use it. don't need to reset it, pbus_size_* will | ||
308 | * set it again | ||
309 | */ | ||
310 | if (!r->child && !release_resource(r)) | ||
311 | return r; | ||
312 | } | ||
313 | } | 304 | } |
314 | return NULL; | 305 | return NULL; |
315 | } | 306 | } |
diff --git a/drivers/pcmcia/cistpl.c b/drivers/pcmcia/cistpl.c index 4a110b7b2673..6c4a4fc83630 100644 --- a/drivers/pcmcia/cistpl.c +++ b/drivers/pcmcia/cistpl.c | |||
@@ -1463,7 +1463,9 @@ int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, cisdata_t | |||
1463 | return -ENOMEM; | 1463 | return -ENOMEM; |
1464 | } | 1464 | } |
1465 | tuple.DesiredTuple = code; | 1465 | tuple.DesiredTuple = code; |
1466 | tuple.Attributes = TUPLE_RETURN_COMMON; | 1466 | tuple.Attributes = 0; |
1467 | if (function == BIND_FN_ALL) | ||
1468 | tuple.Attributes = TUPLE_RETURN_COMMON; | ||
1467 | ret = pccard_get_first_tuple(s, function, &tuple); | 1469 | ret = pccard_get_first_tuple(s, function, &tuple); |
1468 | if (ret != 0) | 1470 | if (ret != 0) |
1469 | goto done; | 1471 | goto done; |
@@ -1490,7 +1492,7 @@ EXPORT_SYMBOL(pccard_read_tuple); | |||
1490 | 1492 | ||
1491 | ======================================================================*/ | 1493 | ======================================================================*/ |
1492 | 1494 | ||
1493 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned int *info) | 1495 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *info) |
1494 | { | 1496 | { |
1495 | tuple_t *tuple; | 1497 | tuple_t *tuple; |
1496 | cisparse_t *p; | 1498 | cisparse_t *p; |
@@ -1515,30 +1517,30 @@ int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, unsigned | |||
1515 | count = reserved = 0; | 1517 | count = reserved = 0; |
1516 | tuple->DesiredTuple = RETURN_FIRST_TUPLE; | 1518 | tuple->DesiredTuple = RETURN_FIRST_TUPLE; |
1517 | tuple->Attributes = TUPLE_RETURN_COMMON; | 1519 | tuple->Attributes = TUPLE_RETURN_COMMON; |
1518 | ret = pccard_get_first_tuple(s, function, tuple); | 1520 | ret = pccard_get_first_tuple(s, BIND_FN_ALL, tuple); |
1519 | if (ret != 0) | 1521 | if (ret != 0) |
1520 | goto done; | 1522 | goto done; |
1521 | 1523 | ||
1522 | /* First tuple should be DEVICE; we should really have either that | 1524 | /* First tuple should be DEVICE; we should really have either that |
1523 | or a CFTABLE_ENTRY of some sort */ | 1525 | or a CFTABLE_ENTRY of some sort */ |
1524 | if ((tuple->TupleCode == CISTPL_DEVICE) || | 1526 | if ((tuple->TupleCode == CISTPL_DEVICE) || |
1525 | (pccard_read_tuple(s, function, CISTPL_CFTABLE_ENTRY, p) == 0) || | 1527 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY, p) == 0) || |
1526 | (pccard_read_tuple(s, function, CISTPL_CFTABLE_ENTRY_CB, p) == 0)) | 1528 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_CFTABLE_ENTRY_CB, p) == 0)) |
1527 | dev_ok++; | 1529 | dev_ok++; |
1528 | 1530 | ||
1529 | /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2 | 1531 | /* All cards should have a MANFID tuple, and/or a VERS_1 or VERS_2 |
1530 | tuple, for card identification. Certain old D-Link and Linksys | 1532 | tuple, for card identification. Certain old D-Link and Linksys |
1531 | cards have only a broken VERS_2 tuple; hence the bogus test. */ | 1533 | cards have only a broken VERS_2 tuple; hence the bogus test. */ |
1532 | if ((pccard_read_tuple(s, function, CISTPL_MANFID, p) == 0) || | 1534 | if ((pccard_read_tuple(s, BIND_FN_ALL, CISTPL_MANFID, p) == 0) || |
1533 | (pccard_read_tuple(s, function, CISTPL_VERS_1, p) == 0) || | 1535 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_1, p) == 0) || |
1534 | (pccard_read_tuple(s, function, CISTPL_VERS_2, p) != -ENOSPC)) | 1536 | (pccard_read_tuple(s, BIND_FN_ALL, CISTPL_VERS_2, p) != -ENOSPC)) |
1535 | ident_ok++; | 1537 | ident_ok++; |
1536 | 1538 | ||
1537 | if (!dev_ok && !ident_ok) | 1539 | if (!dev_ok && !ident_ok) |
1538 | goto done; | 1540 | goto done; |
1539 | 1541 | ||
1540 | for (count = 1; count < MAX_TUPLES; count++) { | 1542 | for (count = 1; count < MAX_TUPLES; count++) { |
1541 | ret = pccard_get_next_tuple(s, function, tuple); | 1543 | ret = pccard_get_next_tuple(s, BIND_FN_ALL, tuple); |
1542 | if (ret != 0) | 1544 | if (ret != 0) |
1543 | break; | 1545 | break; |
1544 | if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) || | 1546 | if (((tuple->TupleCode > 0x23) && (tuple->TupleCode < 0x40)) || |
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index 934d4bee39a0..698d75cda084 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c | |||
@@ -98,10 +98,13 @@ EXPORT_SYMBOL(pcmcia_socket_list_rwsem); | |||
98 | * These functions check for the appropriate struct pcmcia_soket arrays, | 98 | * These functions check for the appropriate struct pcmcia_soket arrays, |
99 | * and pass them to the low-level functions pcmcia_{suspend,resume}_socket | 99 | * and pass them to the low-level functions pcmcia_{suspend,resume}_socket |
100 | */ | 100 | */ |
101 | static int socket_early_resume(struct pcmcia_socket *skt); | ||
102 | static int socket_late_resume(struct pcmcia_socket *skt); | ||
101 | static int socket_resume(struct pcmcia_socket *skt); | 103 | static int socket_resume(struct pcmcia_socket *skt); |
102 | static int socket_suspend(struct pcmcia_socket *skt); | 104 | static int socket_suspend(struct pcmcia_socket *skt); |
103 | 105 | ||
104 | int pcmcia_socket_dev_suspend(struct device *dev) | 106 | static void pcmcia_socket_dev_run(struct device *dev, |
107 | int (*cb)(struct pcmcia_socket *)) | ||
105 | { | 108 | { |
106 | struct pcmcia_socket *socket; | 109 | struct pcmcia_socket *socket; |
107 | 110 | ||
@@ -110,29 +113,34 @@ int pcmcia_socket_dev_suspend(struct device *dev) | |||
110 | if (socket->dev.parent != dev) | 113 | if (socket->dev.parent != dev) |
111 | continue; | 114 | continue; |
112 | mutex_lock(&socket->skt_mutex); | 115 | mutex_lock(&socket->skt_mutex); |
113 | socket_suspend(socket); | 116 | cb(socket); |
114 | mutex_unlock(&socket->skt_mutex); | 117 | mutex_unlock(&socket->skt_mutex); |
115 | } | 118 | } |
116 | up_read(&pcmcia_socket_list_rwsem); | 119 | up_read(&pcmcia_socket_list_rwsem); |
120 | } | ||
117 | 121 | ||
122 | int pcmcia_socket_dev_suspend(struct device *dev) | ||
123 | { | ||
124 | pcmcia_socket_dev_run(dev, socket_suspend); | ||
118 | return 0; | 125 | return 0; |
119 | } | 126 | } |
120 | EXPORT_SYMBOL(pcmcia_socket_dev_suspend); | 127 | EXPORT_SYMBOL(pcmcia_socket_dev_suspend); |
121 | 128 | ||
122 | int pcmcia_socket_dev_resume(struct device *dev) | 129 | void pcmcia_socket_dev_early_resume(struct device *dev) |
123 | { | 130 | { |
124 | struct pcmcia_socket *socket; | 131 | pcmcia_socket_dev_run(dev, socket_early_resume); |
132 | } | ||
133 | EXPORT_SYMBOL(pcmcia_socket_dev_early_resume); | ||
125 | 134 | ||
126 | down_read(&pcmcia_socket_list_rwsem); | 135 | void pcmcia_socket_dev_late_resume(struct device *dev) |
127 | list_for_each_entry(socket, &pcmcia_socket_list, socket_list) { | 136 | { |
128 | if (socket->dev.parent != dev) | 137 | pcmcia_socket_dev_run(dev, socket_late_resume); |
129 | continue; | 138 | } |
130 | mutex_lock(&socket->skt_mutex); | 139 | EXPORT_SYMBOL(pcmcia_socket_dev_late_resume); |
131 | socket_resume(socket); | ||
132 | mutex_unlock(&socket->skt_mutex); | ||
133 | } | ||
134 | up_read(&pcmcia_socket_list_rwsem); | ||
135 | 140 | ||
141 | int pcmcia_socket_dev_resume(struct device *dev) | ||
142 | { | ||
143 | pcmcia_socket_dev_run(dev, socket_resume); | ||
136 | return 0; | 144 | return 0; |
137 | } | 145 | } |
138 | EXPORT_SYMBOL(pcmcia_socket_dev_resume); | 146 | EXPORT_SYMBOL(pcmcia_socket_dev_resume); |
@@ -546,29 +554,24 @@ static int socket_suspend(struct pcmcia_socket *skt) | |||
546 | return 0; | 554 | return 0; |
547 | } | 555 | } |
548 | 556 | ||
549 | /* | 557 | static int socket_early_resume(struct pcmcia_socket *skt) |
550 | * Resume a socket. If a card is present, verify its CIS against | ||
551 | * our cached copy. If they are different, the card has been | ||
552 | * replaced, and we need to tell the drivers. | ||
553 | */ | ||
554 | static int socket_resume(struct pcmcia_socket *skt) | ||
555 | { | 558 | { |
556 | int ret; | ||
557 | |||
558 | if (!(skt->state & SOCKET_SUSPEND)) | ||
559 | return -EBUSY; | ||
560 | |||
561 | skt->socket = dead_socket; | 559 | skt->socket = dead_socket; |
562 | skt->ops->init(skt); | 560 | skt->ops->init(skt); |
563 | skt->ops->set_socket(skt, &skt->socket); | 561 | skt->ops->set_socket(skt, &skt->socket); |
562 | if (skt->state & SOCKET_PRESENT) | ||
563 | skt->resume_status = socket_setup(skt, resume_delay); | ||
564 | return 0; | ||
565 | } | ||
564 | 566 | ||
567 | static int socket_late_resume(struct pcmcia_socket *skt) | ||
568 | { | ||
565 | if (!(skt->state & SOCKET_PRESENT)) { | 569 | if (!(skt->state & SOCKET_PRESENT)) { |
566 | skt->state &= ~SOCKET_SUSPEND; | 570 | skt->state &= ~SOCKET_SUSPEND; |
567 | return socket_insert(skt); | 571 | return socket_insert(skt); |
568 | } | 572 | } |
569 | 573 | ||
570 | ret = socket_setup(skt, resume_delay); | 574 | if (skt->resume_status == 0) { |
571 | if (ret == 0) { | ||
572 | /* | 575 | /* |
573 | * FIXME: need a better check here for cardbus cards. | 576 | * FIXME: need a better check here for cardbus cards. |
574 | */ | 577 | */ |
@@ -596,6 +599,20 @@ static int socket_resume(struct pcmcia_socket *skt) | |||
596 | return 0; | 599 | return 0; |
597 | } | 600 | } |
598 | 601 | ||
602 | /* | ||
603 | * Resume a socket. If a card is present, verify its CIS against | ||
604 | * our cached copy. If they are different, the card has been | ||
605 | * replaced, and we need to tell the drivers. | ||
606 | */ | ||
607 | static int socket_resume(struct pcmcia_socket *skt) | ||
608 | { | ||
609 | if (!(skt->state & SOCKET_SUSPEND)) | ||
610 | return -EBUSY; | ||
611 | |||
612 | socket_early_resume(skt); | ||
613 | return socket_late_resume(skt); | ||
614 | } | ||
615 | |||
599 | static void socket_remove(struct pcmcia_socket *skt) | 616 | static void socket_remove(struct pcmcia_socket *skt) |
600 | { | 617 | { |
601 | dev_printk(KERN_NOTICE, &skt->dev, | 618 | dev_printk(KERN_NOTICE, &skt->dev, |
diff --git a/drivers/pcmcia/cs_internal.h b/drivers/pcmcia/cs_internal.h index 79615e6d540b..1f4098f1354d 100644 --- a/drivers/pcmcia/cs_internal.h +++ b/drivers/pcmcia/cs_internal.h | |||
@@ -197,8 +197,7 @@ int pccard_read_tuple(struct pcmcia_socket *s, unsigned int function, | |||
197 | cisdata_t code, void *parse); | 197 | cisdata_t code, void *parse); |
198 | int pcmcia_replace_cis(struct pcmcia_socket *s, | 198 | int pcmcia_replace_cis(struct pcmcia_socket *s, |
199 | const u8 *data, const size_t len); | 199 | const u8 *data, const size_t len); |
200 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int function, | 200 | int pccard_validate_cis(struct pcmcia_socket *s, unsigned int *count); |
201 | unsigned int *count); | ||
202 | 201 | ||
203 | /* rsrc_mgr.c */ | 202 | /* rsrc_mgr.c */ |
204 | int pcmcia_validate_mem(struct pcmcia_socket *s); | 203 | int pcmcia_validate_mem(struct pcmcia_socket *s); |
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 9f300d3cb125..f5b7079f13d3 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -547,7 +547,7 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev) | |||
547 | if (!vers1) | 547 | if (!vers1) |
548 | return -ENOMEM; | 548 | return -ENOMEM; |
549 | 549 | ||
550 | if (!pccard_read_tuple(p_dev->socket, p_dev->func, | 550 | if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, |
551 | CISTPL_MANFID, &manf_id)) { | 551 | CISTPL_MANFID, &manf_id)) { |
552 | p_dev->manf_id = manf_id.manf; | 552 | p_dev->manf_id = manf_id.manf; |
553 | p_dev->card_id = manf_id.card; | 553 | p_dev->card_id = manf_id.card; |
@@ -581,9 +581,9 @@ static int pcmcia_device_query(struct pcmcia_device *p_dev) | |||
581 | kfree(devgeo); | 581 | kfree(devgeo); |
582 | } | 582 | } |
583 | 583 | ||
584 | if (!pccard_read_tuple(p_dev->socket, p_dev->func, CISTPL_VERS_1, | 584 | if (!pccard_read_tuple(p_dev->socket, BIND_FN_ALL, CISTPL_VERS_1, |
585 | vers1)) { | 585 | vers1)) { |
586 | for (i=0; i < vers1->ns; i++) { | 586 | for (i = 0; i < min_t(unsigned int, 4, vers1->ns); i++) { |
587 | char *tmp; | 587 | char *tmp; |
588 | unsigned int length; | 588 | unsigned int length; |
589 | 589 | ||
@@ -733,7 +733,7 @@ static int pcmcia_card_add(struct pcmcia_socket *s) | |||
733 | return -EAGAIN; /* try again, but later... */ | 733 | return -EAGAIN; /* try again, but later... */ |
734 | } | 734 | } |
735 | 735 | ||
736 | ret = pccard_validate_cis(s, BIND_FN_ALL, &no_chains); | 736 | ret = pccard_validate_cis(s, &no_chains); |
737 | if (ret || !no_chains) { | 737 | if (ret || !no_chains) { |
738 | ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n"); | 738 | ds_dev_dbg(0, &s->dev, "invalid CIS or invalid resources\n"); |
739 | return -ENODEV; | 739 | return -ENODEV; |
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index b906abe26ad0..a4aacb830b80 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
@@ -1053,8 +1053,8 @@ static int i365_set_io_map(u_short sock, struct pccard_io_map *io) | |||
1053 | u_char map, ioctl; | 1053 | u_char map, ioctl; |
1054 | 1054 | ||
1055 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " | 1055 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " |
1056 | "%#x-%#x)\n", sock, io->map, io->flags, | 1056 | "%#llx-%#llx)\n", sock, io->map, io->flags, io->speed, |
1057 | io->speed, io->start, io->stop); | 1057 | (unsigned long long)io->start, (unsigned long long)io->stop); |
1058 | map = io->map; | 1058 | map = io->map; |
1059 | if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || | 1059 | if ((map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || |
1060 | (io->stop < io->start)) return -EINVAL; | 1060 | (io->stop < io->start)) return -EINVAL; |
diff --git a/drivers/pcmcia/m32r_cfc.c b/drivers/pcmcia/m32r_cfc.c index d1d89c4491ad..7dfbee1dcd76 100644 --- a/drivers/pcmcia/m32r_cfc.c +++ b/drivers/pcmcia/m32r_cfc.c | |||
@@ -537,8 +537,9 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io) | |||
537 | u_char map; | 537 | u_char map; |
538 | 538 | ||
539 | debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, " | 539 | debug(3, "m32r_cfc: SetIOMap(%d, %d, %#2.2x, %d ns, " |
540 | "%#lx-%#lx)\n", sock, io->map, io->flags, | 540 | "%#llx-%#llx)\n", sock, io->map, io->flags, |
541 | io->speed, io->start, io->stop); | 541 | io->speed, (unsigned long long)io->start, |
542 | (unsigned long long)io->stop); | ||
542 | map = io->map; | 543 | map = io->map; |
543 | 544 | ||
544 | return 0; | 545 | return 0; |
@@ -554,8 +555,9 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
554 | pcc_socket_t *t = &socket[sock]; | 555 | pcc_socket_t *t = &socket[sock]; |
555 | 556 | ||
556 | debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, " | 557 | debug(3, "m32r_cfc: SetMemMap(%d, %d, %#2.2x, %d ns, " |
557 | "%#lx, %#x)\n", sock, map, mem->flags, | 558 | "%#llx, %#x)\n", sock, map, mem->flags, |
558 | mem->speed, mem->static_start, mem->card_start); | 559 | mem->speed, (unsigned long long)mem->static_start, |
560 | mem->card_start); | ||
559 | 561 | ||
560 | /* | 562 | /* |
561 | * sanity check | 563 | * sanity check |
diff --git a/drivers/pcmcia/m32r_pcc.c b/drivers/pcmcia/m32r_pcc.c index a0655839c8d3..c6524f99ccc3 100644 --- a/drivers/pcmcia/m32r_pcc.c +++ b/drivers/pcmcia/m32r_pcc.c | |||
@@ -492,8 +492,9 @@ static int _pcc_set_io_map(u_short sock, struct pccard_io_map *io) | |||
492 | u_char map; | 492 | u_char map; |
493 | 493 | ||
494 | debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, " | 494 | debug(3, "m32r-pcc: SetIOMap(%d, %d, %#2.2x, %d ns, " |
495 | "%#x-%#x)\n", sock, io->map, io->flags, | 495 | "%#llx-%#llx)\n", sock, io->map, io->flags, |
496 | io->speed, io->start, io->stop); | 496 | io->speed, (unsigned long long)io->start, |
497 | (unsigned long long)io->stop); | ||
497 | map = io->map; | 498 | map = io->map; |
498 | 499 | ||
499 | return 0; | 500 | return 0; |
@@ -515,8 +516,9 @@ static int _pcc_set_mem_map(u_short sock, struct pccard_mem_map *mem) | |||
515 | #endif | 516 | #endif |
516 | 517 | ||
517 | debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, " | 518 | debug(3, "m32r-pcc: SetMemMap(%d, %d, %#2.2x, %d ns, " |
518 | "%#lx, %#x)\n", sock, map, mem->flags, | 519 | "%#llx, %#x)\n", sock, map, mem->flags, |
519 | mem->speed, mem->static_start, mem->card_start); | 520 | mem->speed, (unsigned long long)mem->static_start, |
521 | mem->card_start); | ||
520 | 522 | ||
521 | /* | 523 | /* |
522 | * sanity check | 524 | * sanity check |
diff --git a/drivers/pcmcia/m8xx_pcmcia.c b/drivers/pcmcia/m8xx_pcmcia.c index c69f2c4fe520..403559ba49dd 100644 --- a/drivers/pcmcia/m8xx_pcmcia.c +++ b/drivers/pcmcia/m8xx_pcmcia.c | |||
@@ -975,8 +975,9 @@ static int m8xx_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io) | |||
975 | #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start) | 975 | #define M8XX_BASE (PCMCIA_IO_WIN_BASE + io->start) |
976 | 976 | ||
977 | dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, " | 977 | dprintk("SetIOMap(%d, %d, %#2.2x, %d ns, " |
978 | "%#4.4x-%#4.4x)\n", lsock, io->map, io->flags, | 978 | "%#4.4llx-%#4.4llx)\n", lsock, io->map, io->flags, |
979 | io->speed, io->start, io->stop); | 979 | io->speed, (unsigned long long)io->start, |
980 | (unsigned long long)io->stop); | ||
980 | 981 | ||
981 | if ((io->map >= PCMCIA_IO_WIN_NO) || (io->start > 0xffff) | 982 | if ((io->map >= PCMCIA_IO_WIN_NO) || (io->start > 0xffff) |
982 | || (io->stop > 0xffff) || (io->stop < io->start)) | 983 | || (io->stop > 0xffff) || (io->stop < io->start)) |
@@ -1055,8 +1056,9 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock, | |||
1055 | pcmconf8xx_t *pcmcia = s->pcmcia; | 1056 | pcmconf8xx_t *pcmcia = s->pcmcia; |
1056 | 1057 | ||
1057 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " | 1058 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " |
1058 | "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags, | 1059 | "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, |
1059 | mem->speed, mem->static_start, mem->card_start); | 1060 | mem->speed, (unsigned long long)mem->static_start, |
1061 | mem->card_start); | ||
1060 | 1062 | ||
1061 | if ((mem->map >= PCMCIA_MEM_WIN_NO) | 1063 | if ((mem->map >= PCMCIA_MEM_WIN_NO) |
1062 | // || ((mem->s) >= PCMCIA_MEM_WIN_SIZE) | 1064 | // || ((mem->s) >= PCMCIA_MEM_WIN_SIZE) |
@@ -1107,8 +1109,9 @@ static int m8xx_set_mem_map(struct pcmcia_socket *sock, | |||
1107 | } | 1109 | } |
1108 | 1110 | ||
1109 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " | 1111 | dprintk("SetMemMap(%d, %d, %#2.2x, %d ns, " |
1110 | "%#5.5lx, %#5.5x)\n", lsock, mem->map, mem->flags, | 1112 | "%#5.5llx, %#5.5x)\n", lsock, mem->map, mem->flags, |
1111 | mem->speed, mem->static_start, mem->card_start); | 1113 | mem->speed, (unsigned long long)mem->static_start, |
1114 | mem->card_start); | ||
1112 | 1115 | ||
1113 | /* copy the struct and modify the copy */ | 1116 | /* copy the struct and modify the copy */ |
1114 | 1117 | ||
diff --git a/drivers/pcmcia/pcmcia_ioctl.c b/drivers/pcmcia/pcmcia_ioctl.c index 32c44040c1e8..30cf71d2ee23 100644 --- a/drivers/pcmcia/pcmcia_ioctl.c +++ b/drivers/pcmcia/pcmcia_ioctl.c | |||
@@ -881,7 +881,7 @@ static int ds_ioctl(struct inode * inode, struct file * file, | |||
881 | mutex_lock(&s->skt_mutex); | 881 | mutex_lock(&s->skt_mutex); |
882 | pcmcia_validate_mem(s); | 882 | pcmcia_validate_mem(s); |
883 | mutex_unlock(&s->skt_mutex); | 883 | mutex_unlock(&s->skt_mutex); |
884 | ret = pccard_validate_cis(s, BIND_FN_ALL, &buf->cisinfo.Chains); | 884 | ret = pccard_validate_cis(s, &buf->cisinfo.Chains); |
885 | break; | 885 | break; |
886 | case DS_SUSPEND_CARD: | 886 | case DS_SUSPEND_CARD: |
887 | ret = pcmcia_suspend_card(s); | 887 | ret = pcmcia_suspend_card(s); |
diff --git a/drivers/pcmcia/pd6729.c b/drivers/pcmcia/pd6729.c index 1c39d3438f20..70a33468bcd0 100644 --- a/drivers/pcmcia/pd6729.c +++ b/drivers/pcmcia/pd6729.c | |||
@@ -641,6 +641,12 @@ static int __devinit pd6729_pci_probe(struct pci_dev *dev, | |||
641 | if ((ret = pci_enable_device(dev))) | 641 | if ((ret = pci_enable_device(dev))) |
642 | goto err_out_free_mem; | 642 | goto err_out_free_mem; |
643 | 643 | ||
644 | if (!pci_resource_start(dev, 0)) { | ||
645 | printk(KERN_INFO "pd6729: refusing to load the driver " | ||
646 | "as the io_base is 0.\n"); | ||
647 | goto err_out_free_mem; | ||
648 | } | ||
649 | |||
644 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " | 650 | printk(KERN_INFO "pd6729: Cirrus PD6729 PCI to PCMCIA Bridge " |
645 | "at 0x%llx on irq %d\n", | 651 | "at 0x%llx on irq %d\n", |
646 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); | 652 | (unsigned long long)pci_resource_start(dev, 0), dev->irq); |
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 9ca22c7aafb2..7039f3cf5b77 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
@@ -206,6 +206,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
206 | /* First, what does a floating port look like? */ | 206 | /* First, what does a floating port look like? */ |
207 | b = kzalloc(256, GFP_KERNEL); | 207 | b = kzalloc(256, GFP_KERNEL); |
208 | if (!b) { | 208 | if (!b) { |
209 | printk("\n"); | ||
209 | dev_printk(KERN_ERR, &s->dev, | 210 | dev_printk(KERN_ERR, &s->dev, |
210 | "do_io_probe: unable to kmalloc 256 bytes"); | 211 | "do_io_probe: unable to kmalloc 256 bytes"); |
211 | return; | 212 | return; |
@@ -275,7 +276,7 @@ static int readable(struct pcmcia_socket *s, struct resource *res, | |||
275 | s->cis_mem.res = res; | 276 | s->cis_mem.res = res; |
276 | s->cis_virt = ioremap(res->start, s->map_size); | 277 | s->cis_virt = ioremap(res->start, s->map_size); |
277 | if (s->cis_virt) { | 278 | if (s->cis_virt) { |
278 | ret = pccard_validate_cis(s, BIND_FN_ALL, count); | 279 | ret = pccard_validate_cis(s, count); |
279 | /* invalidate mapping and CIS cache */ | 280 | /* invalidate mapping and CIS cache */ |
280 | iounmap(s->cis_virt); | 281 | iounmap(s->cis_virt); |
281 | s->cis_virt = NULL; | 282 | s->cis_virt = NULL; |
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c index 163cf98e2386..ef7e9e58782b 100644 --- a/drivers/pcmcia/soc_common.c +++ b/drivers/pcmcia/soc_common.c | |||
@@ -336,8 +336,9 @@ soc_common_pcmcia_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *m | |||
336 | struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); | 336 | struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); |
337 | unsigned short speed = map->speed; | 337 | unsigned short speed = map->speed; |
338 | 338 | ||
339 | debug(skt, 2, "map %u speed %u start 0x%08x stop 0x%08x\n", | 339 | debug(skt, 2, "map %u speed %u start 0x%08llx stop 0x%08llx\n", |
340 | map->map, map->speed, map->start, map->stop); | 340 | map->map, map->speed, (unsigned long long)map->start, |
341 | (unsigned long long)map->stop); | ||
341 | debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", | 342 | debug(skt, 2, "flags: %s%s%s%s%s%s%s%s\n", |
342 | (map->flags==0)?"<NONE>":"", | 343 | (map->flags==0)?"<NONE>":"", |
343 | (map->flags&MAP_ACTIVE)?"ACTIVE ":"", | 344 | (map->flags&MAP_ACTIVE)?"ACTIVE ":"", |
diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c index ff9a3bb3c88d..78d5aab542f7 100644 --- a/drivers/pcmcia/socket_sysfs.c +++ b/drivers/pcmcia/socket_sysfs.c | |||
@@ -300,7 +300,7 @@ static ssize_t pccard_show_cis(struct kobject *kobj, | |||
300 | 300 | ||
301 | if (!(s->state & SOCKET_PRESENT)) | 301 | if (!(s->state & SOCKET_PRESENT)) |
302 | return -ENODEV; | 302 | return -ENODEV; |
303 | if (pccard_validate_cis(s, BIND_FN_ALL, &chains)) | 303 | if (pccard_validate_cis(s, &chains)) |
304 | return -EIO; | 304 | return -EIO; |
305 | if (!chains) | 305 | if (!chains) |
306 | return -ENODATA; | 306 | return -ENODATA; |
diff --git a/drivers/pcmcia/tcic.c b/drivers/pcmcia/tcic.c index 582413fcb62f..6918849d511e 100644 --- a/drivers/pcmcia/tcic.c +++ b/drivers/pcmcia/tcic.c | |||
@@ -732,8 +732,8 @@ static int tcic_set_io_map(struct pcmcia_socket *sock, struct pccard_io_map *io) | |||
732 | u_short base, len, ioctl; | 732 | u_short base, len, ioctl; |
733 | 733 | ||
734 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " | 734 | debug(1, "SetIOMap(%d, %d, %#2.2x, %d ns, " |
735 | "%#x-%#x)\n", psock, io->map, io->flags, | 735 | "%#llx-%#llx)\n", psock, io->map, io->flags, io->speed, |
736 | io->speed, io->start, io->stop); | 736 | (unsigned long long)io->start, (unsigned long long)io->stop); |
737 | if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || | 737 | if ((io->map > 1) || (io->start > 0xffff) || (io->stop > 0xffff) || |
738 | (io->stop < io->start)) return -EINVAL; | 738 | (io->stop < io->start)) return -EINVAL; |
739 | tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT)); | 739 | tcic_setw(TCIC_ADDR+2, TCIC_ADR2_INDREG | (psock << TCIC_SS_SHFT)); |
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index abe0e44c6e9e..8be4cc447a17 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -1275,16 +1275,26 @@ static int yenta_dev_resume_noirq(struct device *dev) | |||
1275 | if (socket->type && socket->type->restore_state) | 1275 | if (socket->type && socket->type->restore_state) |
1276 | socket->type->restore_state(socket); | 1276 | socket->type->restore_state(socket); |
1277 | 1277 | ||
1278 | return pcmcia_socket_dev_resume(dev); | 1278 | pcmcia_socket_dev_early_resume(dev); |
1279 | return 0; | ||
1280 | } | ||
1281 | |||
1282 | static int yenta_dev_resume(struct device *dev) | ||
1283 | { | ||
1284 | pcmcia_socket_dev_late_resume(dev); | ||
1285 | return 0; | ||
1279 | } | 1286 | } |
1280 | 1287 | ||
1281 | static struct dev_pm_ops yenta_pm_ops = { | 1288 | static struct dev_pm_ops yenta_pm_ops = { |
1282 | .suspend_noirq = yenta_dev_suspend_noirq, | 1289 | .suspend_noirq = yenta_dev_suspend_noirq, |
1283 | .resume_noirq = yenta_dev_resume_noirq, | 1290 | .resume_noirq = yenta_dev_resume_noirq, |
1291 | .resume = yenta_dev_resume, | ||
1284 | .freeze_noirq = yenta_dev_suspend_noirq, | 1292 | .freeze_noirq = yenta_dev_suspend_noirq, |
1285 | .thaw_noirq = yenta_dev_resume_noirq, | 1293 | .thaw_noirq = yenta_dev_resume_noirq, |
1294 | .thaw = yenta_dev_resume, | ||
1286 | .poweroff_noirq = yenta_dev_suspend_noirq, | 1295 | .poweroff_noirq = yenta_dev_suspend_noirq, |
1287 | .restore_noirq = yenta_dev_resume_noirq, | 1296 | .restore_noirq = yenta_dev_resume_noirq, |
1297 | .restore = yenta_dev_resume, | ||
1288 | }; | 1298 | }; |
1289 | 1299 | ||
1290 | #define YENTA_PM_OPS (¥ta_pm_ops) | 1300 | #define YENTA_PM_OPS (¥ta_pm_ops) |
diff --git a/drivers/platform/x86/eeepc-laptop.c b/drivers/platform/x86/eeepc-laptop.c index d379e74a05d0..4226e5352738 100644 --- a/drivers/platform/x86/eeepc-laptop.c +++ b/drivers/platform/x86/eeepc-laptop.c | |||
@@ -150,8 +150,6 @@ struct eeepc_hotk { | |||
150 | /* The actual device the driver binds to */ | 150 | /* The actual device the driver binds to */ |
151 | static struct eeepc_hotk *ehotk; | 151 | static struct eeepc_hotk *ehotk; |
152 | 152 | ||
153 | static void eeepc_rfkill_hotplug(bool real); | ||
154 | |||
155 | /* Platform device/driver */ | 153 | /* Platform device/driver */ |
156 | static int eeepc_hotk_thaw(struct device *device); | 154 | static int eeepc_hotk_thaw(struct device *device); |
157 | static int eeepc_hotk_restore(struct device *device); | 155 | static int eeepc_hotk_restore(struct device *device); |
@@ -345,16 +343,7 @@ static bool eeepc_wlan_rfkill_blocked(void) | |||
345 | static int eeepc_rfkill_set(void *data, bool blocked) | 343 | static int eeepc_rfkill_set(void *data, bool blocked) |
346 | { | 344 | { |
347 | unsigned long asl = (unsigned long)data; | 345 | unsigned long asl = (unsigned long)data; |
348 | int ret; | 346 | return set_acpi(asl, !blocked); |
349 | |||
350 | if (asl != CM_ASL_WLAN) | ||
351 | return set_acpi(asl, !blocked); | ||
352 | |||
353 | /* hack to avoid panic with rt2860sta */ | ||
354 | if (blocked) | ||
355 | eeepc_rfkill_hotplug(false); | ||
356 | ret = set_acpi(asl, !blocked); | ||
357 | return ret; | ||
358 | } | 347 | } |
359 | 348 | ||
360 | static const struct rfkill_ops eeepc_rfkill_ops = { | 349 | static const struct rfkill_ops eeepc_rfkill_ops = { |
@@ -367,7 +356,8 @@ static void __devinit eeepc_enable_camera(void) | |||
367 | * If the following call to set_acpi() fails, it's because there's no | 356 | * If the following call to set_acpi() fails, it's because there's no |
368 | * camera so we can ignore the error. | 357 | * camera so we can ignore the error. |
369 | */ | 358 | */ |
370 | set_acpi(CM_ASL_CAMERA, 1); | 359 | if (get_acpi(CM_ASL_CAMERA) == 0) |
360 | set_acpi(CM_ASL_CAMERA, 1); | ||
371 | } | 361 | } |
372 | 362 | ||
373 | /* | 363 | /* |
@@ -654,13 +644,13 @@ static int eeepc_get_adapter_status(struct hotplug_slot *hotplug_slot, | |||
654 | return 0; | 644 | return 0; |
655 | } | 645 | } |
656 | 646 | ||
657 | static void eeepc_rfkill_hotplug(bool real) | 647 | static void eeepc_rfkill_hotplug(void) |
658 | { | 648 | { |
659 | struct pci_dev *dev; | 649 | struct pci_dev *dev; |
660 | struct pci_bus *bus; | 650 | struct pci_bus *bus; |
661 | bool blocked = real ? eeepc_wlan_rfkill_blocked() : true; | 651 | bool blocked = eeepc_wlan_rfkill_blocked(); |
662 | 652 | ||
663 | if (real && ehotk->wlan_rfkill) | 653 | if (ehotk->wlan_rfkill) |
664 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); | 654 | rfkill_set_sw_state(ehotk->wlan_rfkill, blocked); |
665 | 655 | ||
666 | mutex_lock(&ehotk->hotplug_lock); | 656 | mutex_lock(&ehotk->hotplug_lock); |
@@ -703,7 +693,7 @@ static void eeepc_rfkill_notify(acpi_handle handle, u32 event, void *data) | |||
703 | if (event != ACPI_NOTIFY_BUS_CHECK) | 693 | if (event != ACPI_NOTIFY_BUS_CHECK) |
704 | return; | 694 | return; |
705 | 695 | ||
706 | eeepc_rfkill_hotplug(true); | 696 | eeepc_rfkill_hotplug(); |
707 | } | 697 | } |
708 | 698 | ||
709 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) | 699 | static void eeepc_hotk_notify(struct acpi_device *device, u32 event) |
@@ -861,7 +851,7 @@ static int eeepc_hotk_restore(struct device *device) | |||
861 | { | 851 | { |
862 | /* Refresh both wlan rfkill state and pci hotplug */ | 852 | /* Refresh both wlan rfkill state and pci hotplug */ |
863 | if (ehotk->wlan_rfkill) | 853 | if (ehotk->wlan_rfkill) |
864 | eeepc_rfkill_hotplug(true); | 854 | eeepc_rfkill_hotplug(); |
865 | 855 | ||
866 | if (ehotk->bluetooth_rfkill) | 856 | if (ehotk->bluetooth_rfkill) |
867 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, | 857 | rfkill_set_sw_state(ehotk->bluetooth_rfkill, |
@@ -1004,7 +994,7 @@ static void eeepc_rfkill_exit(void) | |||
1004 | * Refresh pci hotplug in case the rfkill state was changed after | 994 | * Refresh pci hotplug in case the rfkill state was changed after |
1005 | * eeepc_unregister_rfkill_notifier() | 995 | * eeepc_unregister_rfkill_notifier() |
1006 | */ | 996 | */ |
1007 | eeepc_rfkill_hotplug(true); | 997 | eeepc_rfkill_hotplug(); |
1008 | if (ehotk->hotplug_slot) | 998 | if (ehotk->hotplug_slot) |
1009 | pci_hp_deregister(ehotk->hotplug_slot); | 999 | pci_hp_deregister(ehotk->hotplug_slot); |
1010 | 1000 | ||
@@ -1120,7 +1110,7 @@ static int eeepc_rfkill_init(struct device *dev) | |||
1120 | * Refresh pci hotplug in case the rfkill state was changed during | 1110 | * Refresh pci hotplug in case the rfkill state was changed during |
1121 | * setup. | 1111 | * setup. |
1122 | */ | 1112 | */ |
1123 | eeepc_rfkill_hotplug(true); | 1113 | eeepc_rfkill_hotplug(); |
1124 | 1114 | ||
1125 | exit: | 1115 | exit: |
1126 | if (result && result != -ENODEV) | 1116 | if (result && result != -ENODEV) |
diff --git a/drivers/s390/char/sclp_async.c b/drivers/s390/char/sclp_async.c index a4f68e5b9c96..b44462a6c6d3 100644 --- a/drivers/s390/char/sclp_async.c +++ b/drivers/s390/char/sclp_async.c | |||
@@ -26,7 +26,6 @@ static struct sclp_async_sccb *sccb; | |||
26 | static int sclp_async_send_wait(char *message); | 26 | static int sclp_async_send_wait(char *message); |
27 | static struct ctl_table_header *callhome_sysctl_header; | 27 | static struct ctl_table_header *callhome_sysctl_header; |
28 | static DEFINE_SPINLOCK(sclp_async_lock); | 28 | static DEFINE_SPINLOCK(sclp_async_lock); |
29 | static char nodename[64]; | ||
30 | #define SCLP_NORMAL_WRITE 0x00 | 29 | #define SCLP_NORMAL_WRITE 0x00 |
31 | 30 | ||
32 | struct async_evbuf { | 31 | struct async_evbuf { |
@@ -52,9 +51,10 @@ static struct sclp_register sclp_async_register = { | |||
52 | static int call_home_on_panic(struct notifier_block *self, | 51 | static int call_home_on_panic(struct notifier_block *self, |
53 | unsigned long event, void *data) | 52 | unsigned long event, void *data) |
54 | { | 53 | { |
55 | strncat(data, nodename, strlen(nodename)); | 54 | strncat(data, init_utsname()->nodename, |
56 | sclp_async_send_wait(data); | 55 | sizeof(init_utsname()->nodename)); |
57 | return NOTIFY_DONE; | 56 | sclp_async_send_wait(data); |
57 | return NOTIFY_DONE; | ||
58 | } | 58 | } |
59 | 59 | ||
60 | static struct notifier_block call_home_panic_nb = { | 60 | static struct notifier_block call_home_panic_nb = { |
@@ -68,15 +68,14 @@ static int proc_handler_callhome(struct ctl_table *ctl, int write, | |||
68 | { | 68 | { |
69 | unsigned long val; | 69 | unsigned long val; |
70 | int len, rc; | 70 | int len, rc; |
71 | char buf[2]; | 71 | char buf[3]; |
72 | 72 | ||
73 | if (!*count | (*ppos && !write)) { | 73 | if (!*count || (*ppos && !write)) { |
74 | *count = 0; | 74 | *count = 0; |
75 | return 0; | 75 | return 0; |
76 | } | 76 | } |
77 | if (!write) { | 77 | if (!write) { |
78 | len = sprintf(buf, "%d\n", callhome_enabled); | 78 | len = snprintf(buf, sizeof(buf), "%d\n", callhome_enabled); |
79 | buf[len] = '\0'; | ||
80 | rc = copy_to_user(buffer, buf, sizeof(buf)); | 79 | rc = copy_to_user(buffer, buf, sizeof(buf)); |
81 | if (rc != 0) | 80 | if (rc != 0) |
82 | return -EFAULT; | 81 | return -EFAULT; |
@@ -171,39 +170,29 @@ static int __init sclp_async_init(void) | |||
171 | rc = sclp_register(&sclp_async_register); | 170 | rc = sclp_register(&sclp_async_register); |
172 | if (rc) | 171 | if (rc) |
173 | return rc; | 172 | return rc; |
174 | callhome_sysctl_header = register_sysctl_table(kern_dir_table); | 173 | rc = -EOPNOTSUPP; |
175 | if (!callhome_sysctl_header) { | 174 | if (!(sclp_async_register.sclp_receive_mask & EVTYP_ASYNC_MASK)) |
176 | rc = -ENOMEM; | ||
177 | goto out_sclp; | ||
178 | } | ||
179 | if (!(sclp_async_register.sclp_receive_mask & EVTYP_ASYNC_MASK)) { | ||
180 | rc = -EOPNOTSUPP; | ||
181 | goto out_sclp; | 175 | goto out_sclp; |
182 | } | ||
183 | rc = -ENOMEM; | 176 | rc = -ENOMEM; |
177 | callhome_sysctl_header = register_sysctl_table(kern_dir_table); | ||
178 | if (!callhome_sysctl_header) | ||
179 | goto out_sclp; | ||
184 | request = kzalloc(sizeof(struct sclp_req), GFP_KERNEL); | 180 | request = kzalloc(sizeof(struct sclp_req), GFP_KERNEL); |
185 | if (!request) | ||
186 | goto out_sys; | ||
187 | sccb = (struct sclp_async_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA); | 181 | sccb = (struct sclp_async_sccb *) get_zeroed_page(GFP_KERNEL | GFP_DMA); |
188 | if (!sccb) | 182 | if (!request || !sccb) |
189 | goto out_mem; | 183 | goto out_mem; |
190 | rc = atomic_notifier_chain_register(&panic_notifier_list, | 184 | rc = atomic_notifier_chain_register(&panic_notifier_list, |
191 | &call_home_panic_nb); | 185 | &call_home_panic_nb); |
192 | if (rc) | 186 | if (!rc) |
193 | goto out_mem; | 187 | goto out; |
194 | |||
195 | strncpy(nodename, init_utsname()->nodename, 64); | ||
196 | return 0; | ||
197 | |||
198 | out_mem: | 188 | out_mem: |
199 | kfree(request); | 189 | kfree(request); |
200 | free_page((unsigned long) sccb); | 190 | free_page((unsigned long) sccb); |
201 | out_sys: | ||
202 | unregister_sysctl_table(callhome_sysctl_header); | 191 | unregister_sysctl_table(callhome_sysctl_header); |
203 | out_sclp: | 192 | out_sclp: |
204 | sclp_unregister(&sclp_async_register); | 193 | sclp_unregister(&sclp_async_register); |
194 | out: | ||
205 | return rc; | 195 | return rc; |
206 | |||
207 | } | 196 | } |
208 | module_init(sclp_async_init); | 197 | module_init(sclp_async_init); |
209 | 198 | ||
diff --git a/drivers/s390/net/smsgiucv.c b/drivers/s390/net/smsgiucv.c index 102000d1af6f..3012355f8304 100644 --- a/drivers/s390/net/smsgiucv.c +++ b/drivers/s390/net/smsgiucv.c | |||
@@ -158,7 +158,12 @@ static int smsg_pm_restore_thaw(struct device *dev) | |||
158 | smsg_path->flags = 0; | 158 | smsg_path->flags = 0; |
159 | rc = iucv_path_connect(smsg_path, &smsg_handler, "*MSG ", | 159 | rc = iucv_path_connect(smsg_path, &smsg_handler, "*MSG ", |
160 | NULL, NULL, NULL); | 160 | NULL, NULL, NULL); |
161 | printk(KERN_ERR "iucv_path_connect returned with rc %i\n", rc); | 161 | #ifdef CONFIG_PM_DEBUG |
162 | if (rc) | ||
163 | printk(KERN_ERR | ||
164 | "iucv_path_connect returned with rc %i\n", rc); | ||
165 | #endif | ||
166 | cpcmd("SET SMSG IUCV", NULL, 0, NULL); | ||
162 | } | 167 | } |
163 | return 0; | 168 | return 0; |
164 | } | 169 | } |
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 0f79f3af4f54..2889e5f2dfd3 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -128,12 +128,13 @@ out_ccwdev: | |||
128 | static void __init zfcp_init_device_setup(char *devstr) | 128 | static void __init zfcp_init_device_setup(char *devstr) |
129 | { | 129 | { |
130 | char *token; | 130 | char *token; |
131 | char *str; | 131 | char *str, *str_saved; |
132 | char busid[ZFCP_BUS_ID_SIZE]; | 132 | char busid[ZFCP_BUS_ID_SIZE]; |
133 | u64 wwpn, lun; | 133 | u64 wwpn, lun; |
134 | 134 | ||
135 | /* duplicate devstr and keep the original for sysfs presentation*/ | 135 | /* duplicate devstr and keep the original for sysfs presentation*/ |
136 | str = kmalloc(strlen(devstr) + 1, GFP_KERNEL); | 136 | str_saved = kmalloc(strlen(devstr) + 1, GFP_KERNEL); |
137 | str = str_saved; | ||
137 | if (!str) | 138 | if (!str) |
138 | return; | 139 | return; |
139 | 140 | ||
@@ -152,12 +153,12 @@ static void __init zfcp_init_device_setup(char *devstr) | |||
152 | if (!token || strict_strtoull(token, 0, (unsigned long long *) &lun)) | 153 | if (!token || strict_strtoull(token, 0, (unsigned long long *) &lun)) |
153 | goto err_out; | 154 | goto err_out; |
154 | 155 | ||
155 | kfree(str); | 156 | kfree(str_saved); |
156 | zfcp_init_device_configure(busid, wwpn, lun); | 157 | zfcp_init_device_configure(busid, wwpn, lun); |
157 | return; | 158 | return; |
158 | 159 | ||
159 | err_out: | 160 | err_out: |
160 | kfree(str); | 161 | kfree(str_saved); |
161 | pr_err("%s is not a valid SCSI device\n", devstr); | 162 | pr_err("%s is not a valid SCSI device\n", devstr); |
162 | } | 163 | } |
163 | 164 | ||
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c index 73d366ba31e5..f73e2180f333 100644 --- a/drivers/s390/scsi/zfcp_erp.c +++ b/drivers/s390/scsi/zfcp_erp.c | |||
@@ -858,10 +858,7 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
858 | if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) | 858 | if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP) |
859 | return zfcp_erp_open_ptp_port(act); | 859 | return zfcp_erp_open_ptp_port(act); |
860 | if (!port->d_id) { | 860 | if (!port->d_id) { |
861 | zfcp_port_get(port); | 861 | zfcp_fc_trigger_did_lookup(port); |
862 | if (!queue_work(adapter->work_queue, | ||
863 | &port->gid_pn_work)) | ||
864 | zfcp_port_put(port); | ||
865 | return ZFCP_ERP_EXIT; | 862 | return ZFCP_ERP_EXIT; |
866 | } | 863 | } |
867 | return zfcp_erp_port_strategy_open_port(act); | 864 | return zfcp_erp_port_strategy_open_port(act); |
@@ -869,12 +866,11 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
869 | case ZFCP_ERP_STEP_PORT_OPENING: | 866 | case ZFCP_ERP_STEP_PORT_OPENING: |
870 | /* D_ID might have changed during open */ | 867 | /* D_ID might have changed during open */ |
871 | if (p_status & ZFCP_STATUS_COMMON_OPEN) { | 868 | if (p_status & ZFCP_STATUS_COMMON_OPEN) { |
872 | if (port->d_id) | 869 | if (!port->d_id) { |
873 | return ZFCP_ERP_SUCCEEDED; | 870 | zfcp_fc_trigger_did_lookup(port); |
874 | else { | 871 | return ZFCP_ERP_EXIT; |
875 | act->step = ZFCP_ERP_STEP_PORT_CLOSING; | ||
876 | return ZFCP_ERP_CONTINUES; | ||
877 | } | 872 | } |
873 | return ZFCP_ERP_SUCCEEDED; | ||
878 | } | 874 | } |
879 | if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) { | 875 | if (port->d_id && !(p_status & ZFCP_STATUS_COMMON_NOESC)) { |
880 | port->d_id = 0; | 876 | port->d_id = 0; |
@@ -889,19 +885,21 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act) | |||
889 | static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) | 885 | static int zfcp_erp_port_strategy(struct zfcp_erp_action *erp_action) |
890 | { | 886 | { |
891 | struct zfcp_port *port = erp_action->port; | 887 | struct zfcp_port *port = erp_action->port; |
888 | int p_status = atomic_read(&port->status); | ||
892 | 889 | ||
893 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC) | 890 | if ((p_status & ZFCP_STATUS_COMMON_NOESC) && |
891 | !(p_status & ZFCP_STATUS_COMMON_OPEN)) | ||
894 | goto close_init_done; | 892 | goto close_init_done; |
895 | 893 | ||
896 | switch (erp_action->step) { | 894 | switch (erp_action->step) { |
897 | case ZFCP_ERP_STEP_UNINITIALIZED: | 895 | case ZFCP_ERP_STEP_UNINITIALIZED: |
898 | zfcp_erp_port_strategy_clearstati(port); | 896 | zfcp_erp_port_strategy_clearstati(port); |
899 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN) | 897 | if (p_status & ZFCP_STATUS_COMMON_OPEN) |
900 | return zfcp_erp_port_strategy_close(erp_action); | 898 | return zfcp_erp_port_strategy_close(erp_action); |
901 | break; | 899 | break; |
902 | 900 | ||
903 | case ZFCP_ERP_STEP_PORT_CLOSING: | 901 | case ZFCP_ERP_STEP_PORT_CLOSING: |
904 | if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_OPEN) | 902 | if (p_status & ZFCP_STATUS_COMMON_OPEN) |
905 | return ZFCP_ERP_FAILED; | 903 | return ZFCP_ERP_FAILED; |
906 | break; | 904 | break; |
907 | } | 905 | } |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 629edec70405..b3f28deb4505 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -96,6 +96,7 @@ extern int zfcp_fc_scan_ports(struct zfcp_adapter *); | |||
96 | extern void _zfcp_fc_scan_ports_later(struct work_struct *); | 96 | extern void _zfcp_fc_scan_ports_later(struct work_struct *); |
97 | extern void zfcp_fc_incoming_els(struct zfcp_fsf_req *); | 97 | extern void zfcp_fc_incoming_els(struct zfcp_fsf_req *); |
98 | extern void zfcp_fc_port_did_lookup(struct work_struct *); | 98 | extern void zfcp_fc_port_did_lookup(struct work_struct *); |
99 | extern void zfcp_fc_trigger_did_lookup(struct zfcp_port *); | ||
99 | extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *); | 100 | extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *); |
100 | extern void zfcp_fc_test_link(struct zfcp_port *); | 101 | extern void zfcp_fc_test_link(struct zfcp_port *); |
101 | extern void zfcp_fc_link_test_work(struct work_struct *); | 102 | extern void zfcp_fc_link_test_work(struct work_struct *); |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index 722f22de8753..df23bcead23d 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -361,6 +361,17 @@ out: | |||
361 | } | 361 | } |
362 | 362 | ||
363 | /** | 363 | /** |
364 | * zfcp_fc_trigger_did_lookup - trigger the d_id lookup using a GID_PN request | ||
365 | * @port: The zfcp_port to lookup the d_id for. | ||
366 | */ | ||
367 | void zfcp_fc_trigger_did_lookup(struct zfcp_port *port) | ||
368 | { | ||
369 | zfcp_port_get(port); | ||
370 | if (!queue_work(port->adapter->work_queue, &port->gid_pn_work)) | ||
371 | zfcp_port_put(port); | ||
372 | } | ||
373 | |||
374 | /** | ||
364 | * zfcp_fc_plogi_evaluate - evaluate PLOGI playload | 375 | * zfcp_fc_plogi_evaluate - evaluate PLOGI playload |
365 | * @port: zfcp_port structure | 376 | * @port: zfcp_port structure |
366 | * @plogi: plogi payload | 377 | * @plogi: plogi payload |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 38a7e4a6b639..4e41baa0c141 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -1079,7 +1079,7 @@ static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req, | |||
1079 | /* common settings for ct/gs and els requests */ | 1079 | /* common settings for ct/gs and els requests */ |
1080 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; | 1080 | req->qtcb->bottom.support.service_class = FSF_CLASS_3; |
1081 | req->qtcb->bottom.support.timeout = 2 * R_A_TOV; | 1081 | req->qtcb->bottom.support.timeout = 2 * R_A_TOV; |
1082 | zfcp_fsf_start_timer(req, 2 * R_A_TOV + 10); | 1082 | zfcp_fsf_start_timer(req, (2 * R_A_TOV + 10) * HZ); |
1083 | 1083 | ||
1084 | return 0; | 1084 | return 0; |
1085 | } | 1085 | } |
@@ -1475,9 +1475,16 @@ static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req) | |||
1475 | plogi = (struct fsf_plogi *) req->qtcb->bottom.support.els; | 1475 | plogi = (struct fsf_plogi *) req->qtcb->bottom.support.els; |
1476 | if (req->qtcb->bottom.support.els1_length >= | 1476 | if (req->qtcb->bottom.support.els1_length >= |
1477 | FSF_PLOGI_MIN_LEN) { | 1477 | FSF_PLOGI_MIN_LEN) { |
1478 | if (plogi->serv_param.wwpn != port->wwpn) | 1478 | if (plogi->serv_param.wwpn != port->wwpn) { |
1479 | port->d_id = 0; | 1479 | port->d_id = 0; |
1480 | else { | 1480 | dev_warn(&port->adapter->ccw_device->dev, |
1481 | "A port opened with WWPN 0x%016Lx " | ||
1482 | "returned data that identifies it as " | ||
1483 | "WWPN 0x%016Lx\n", | ||
1484 | (unsigned long long) port->wwpn, | ||
1485 | (unsigned long long) | ||
1486 | plogi->serv_param.wwpn); | ||
1487 | } else { | ||
1481 | port->wwnn = plogi->serv_param.wwnn; | 1488 | port->wwnn = plogi->serv_param.wwnn; |
1482 | zfcp_fc_plogi_evaluate(port, plogi); | 1489 | zfcp_fc_plogi_evaluate(port, plogi); |
1483 | } | 1490 | } |
diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 079a8cf518a3..d31000886ca8 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c | |||
@@ -224,6 +224,7 @@ static ssize_t zfcp_sysfs_unit_add_store(struct device *dev, | |||
224 | 224 | ||
225 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); | 225 | zfcp_erp_unit_reopen(unit, 0, "syuas_1", NULL); |
226 | zfcp_erp_wait(unit->port->adapter); | 226 | zfcp_erp_wait(unit->port->adapter); |
227 | flush_work(&unit->scsi_work); | ||
227 | zfcp_unit_put(unit); | 228 | zfcp_unit_put(unit); |
228 | out: | 229 | out: |
229 | mutex_unlock(&zfcp_data.config_mutex); | 230 | mutex_unlock(&zfcp_data.config_mutex); |
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index b6af63ca980b..496764349c41 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c | |||
@@ -1918,6 +1918,10 @@ static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg) | |||
1918 | } | 1918 | } |
1919 | size = size>>16; | 1919 | size = size>>16; |
1920 | size *= 4; | 1920 | size *= 4; |
1921 | if (size > MAX_MESSAGE_SIZE) { | ||
1922 | rcode = -EINVAL; | ||
1923 | goto cleanup; | ||
1924 | } | ||
1921 | /* Copy in the user's I2O command */ | 1925 | /* Copy in the user's I2O command */ |
1922 | if (copy_from_user (msg, user_msg, size)) { | 1926 | if (copy_from_user (msg, user_msg, size)) { |
1923 | rcode = -EFAULT; | 1927 | rcode = -EFAULT; |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index c44783801402..0547a7f44d42 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -317,6 +317,7 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, | |||
317 | out_device_destroy: | 317 | out_device_destroy: |
318 | scsi_device_set_state(sdev, SDEV_DEL); | 318 | scsi_device_set_state(sdev, SDEV_DEL); |
319 | transport_destroy_device(&sdev->sdev_gendev); | 319 | transport_destroy_device(&sdev->sdev_gendev); |
320 | put_device(&sdev->sdev_dev); | ||
320 | put_device(&sdev->sdev_gendev); | 321 | put_device(&sdev->sdev_gendev); |
321 | out: | 322 | out: |
322 | if (display_failure_msg) | 323 | if (display_failure_msg) |
@@ -957,6 +958,7 @@ static inline void scsi_destroy_sdev(struct scsi_device *sdev) | |||
957 | if (sdev->host->hostt->slave_destroy) | 958 | if (sdev->host->hostt->slave_destroy) |
958 | sdev->host->hostt->slave_destroy(sdev); | 959 | sdev->host->hostt->slave_destroy(sdev); |
959 | transport_destroy_device(&sdev->sdev_gendev); | 960 | transport_destroy_device(&sdev->sdev_gendev); |
961 | put_device(&sdev->sdev_dev); | ||
960 | put_device(&sdev->sdev_gendev); | 962 | put_device(&sdev->sdev_gendev); |
961 | } | 963 | } |
962 | 964 | ||
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index fde54537d715..5c7eb63a19d1 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -864,10 +864,6 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) | |||
864 | goto clean_device; | 864 | goto clean_device; |
865 | } | 865 | } |
866 | 866 | ||
867 | /* take a reference for the sdev_dev; this is | ||
868 | * released by the sdev_class .release */ | ||
869 | get_device(&sdev->sdev_gendev); | ||
870 | |||
871 | /* create queue files, which may be writable, depending on the host */ | 867 | /* create queue files, which may be writable, depending on the host */ |
872 | if (sdev->host->hostt->change_queue_depth) | 868 | if (sdev->host->hostt->change_queue_depth) |
873 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); | 869 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); |
@@ -917,6 +913,7 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) | |||
917 | 913 | ||
918 | device_del(&sdev->sdev_gendev); | 914 | device_del(&sdev->sdev_gendev); |
919 | transport_destroy_device(&sdev->sdev_gendev); | 915 | transport_destroy_device(&sdev->sdev_gendev); |
916 | put_device(&sdev->sdev_dev); | ||
920 | put_device(&sdev->sdev_gendev); | 917 | put_device(&sdev->sdev_gendev); |
921 | 918 | ||
922 | return error; | 919 | return error; |
@@ -1065,7 +1062,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev) | |||
1065 | sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); | 1062 | sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); |
1066 | 1063 | ||
1067 | device_initialize(&sdev->sdev_dev); | 1064 | device_initialize(&sdev->sdev_dev); |
1068 | sdev->sdev_dev.parent = &sdev->sdev_gendev; | 1065 | sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev); |
1069 | sdev->sdev_dev.class = &sdev_class; | 1066 | sdev->sdev_dev.class = &sdev_class; |
1070 | dev_set_name(&sdev->sdev_dev, "%d:%d:%d:%d", | 1067 | dev_set_name(&sdev->sdev_dev, "%d:%d:%d:%d", |
1071 | sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); | 1068 | sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); |
diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c index e7108e75653d..42e8550cd2b6 100644 --- a/drivers/serial/8250_pci.c +++ b/drivers/serial/8250_pci.c | |||
@@ -1561,11 +1561,16 @@ enum pci_board_num_t { | |||
1561 | pbn_exar_XR17C152, | 1561 | pbn_exar_XR17C152, |
1562 | pbn_exar_XR17C154, | 1562 | pbn_exar_XR17C154, |
1563 | pbn_exar_XR17C158, | 1563 | pbn_exar_XR17C158, |
1564 | pbn_exar_ibm_saturn, | ||
1564 | pbn_pasemi_1682M, | 1565 | pbn_pasemi_1682M, |
1565 | pbn_ni8430_2, | 1566 | pbn_ni8430_2, |
1566 | pbn_ni8430_4, | 1567 | pbn_ni8430_4, |
1567 | pbn_ni8430_8, | 1568 | pbn_ni8430_8, |
1568 | pbn_ni8430_16, | 1569 | pbn_ni8430_16, |
1570 | pbn_ADDIDATA_PCIe_1_3906250, | ||
1571 | pbn_ADDIDATA_PCIe_2_3906250, | ||
1572 | pbn_ADDIDATA_PCIe_4_3906250, | ||
1573 | pbn_ADDIDATA_PCIe_8_3906250, | ||
1569 | }; | 1574 | }; |
1570 | 1575 | ||
1571 | /* | 1576 | /* |
@@ -2146,6 +2151,13 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
2146 | .base_baud = 921600, | 2151 | .base_baud = 921600, |
2147 | .uart_offset = 0x200, | 2152 | .uart_offset = 0x200, |
2148 | }, | 2153 | }, |
2154 | [pbn_exar_ibm_saturn] = { | ||
2155 | .flags = FL_BASE0, | ||
2156 | .num_ports = 1, | ||
2157 | .base_baud = 921600, | ||
2158 | .uart_offset = 0x200, | ||
2159 | }, | ||
2160 | |||
2149 | /* | 2161 | /* |
2150 | * PA Semi PWRficient PA6T-1682M on-chip UART | 2162 | * PA Semi PWRficient PA6T-1682M on-chip UART |
2151 | */ | 2163 | */ |
@@ -2185,6 +2197,37 @@ static struct pciserial_board pci_boards[] __devinitdata = { | |||
2185 | .uart_offset = 0x10, | 2197 | .uart_offset = 0x10, |
2186 | .first_offset = 0x800, | 2198 | .first_offset = 0x800, |
2187 | }, | 2199 | }, |
2200 | /* | ||
2201 | * ADDI-DATA GmbH PCI-Express communication cards <info@addi-data.com> | ||
2202 | */ | ||
2203 | [pbn_ADDIDATA_PCIe_1_3906250] = { | ||
2204 | .flags = FL_BASE0, | ||
2205 | .num_ports = 1, | ||
2206 | .base_baud = 3906250, | ||
2207 | .uart_offset = 0x200, | ||
2208 | .first_offset = 0x1000, | ||
2209 | }, | ||
2210 | [pbn_ADDIDATA_PCIe_2_3906250] = { | ||
2211 | .flags = FL_BASE0, | ||
2212 | .num_ports = 2, | ||
2213 | .base_baud = 3906250, | ||
2214 | .uart_offset = 0x200, | ||
2215 | .first_offset = 0x1000, | ||
2216 | }, | ||
2217 | [pbn_ADDIDATA_PCIe_4_3906250] = { | ||
2218 | .flags = FL_BASE0, | ||
2219 | .num_ports = 4, | ||
2220 | .base_baud = 3906250, | ||
2221 | .uart_offset = 0x200, | ||
2222 | .first_offset = 0x1000, | ||
2223 | }, | ||
2224 | [pbn_ADDIDATA_PCIe_8_3906250] = { | ||
2225 | .flags = FL_BASE0, | ||
2226 | .num_ports = 8, | ||
2227 | .base_baud = 3906250, | ||
2228 | .uart_offset = 0x200, | ||
2229 | .first_offset = 0x1000, | ||
2230 | }, | ||
2188 | }; | 2231 | }; |
2189 | 2232 | ||
2190 | static const struct pci_device_id softmodem_blacklist[] = { | 2233 | static const struct pci_device_id softmodem_blacklist[] = { |
@@ -2649,6 +2692,9 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
2649 | PCI_SUBVENDOR_ID_CONNECT_TECH, | 2692 | PCI_SUBVENDOR_ID_CONNECT_TECH, |
2650 | PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, | 2693 | PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0, |
2651 | pbn_b0_8_1843200_200 }, | 2694 | pbn_b0_8_1843200_200 }, |
2695 | { PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152, | ||
2696 | PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT, | ||
2697 | 0, 0, pbn_exar_ibm_saturn }, | ||
2652 | 2698 | ||
2653 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, | 2699 | { PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530, |
2654 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, | 2700 | PCI_ANY_ID, PCI_ANY_ID, 0, 0, |
@@ -3556,6 +3602,38 @@ static struct pci_device_id serial_pci_tbl[] = { | |||
3556 | 0, | 3602 | 0, |
3557 | pbn_b0_8_115200 }, | 3603 | pbn_b0_8_115200 }, |
3558 | 3604 | ||
3605 | { PCI_VENDOR_ID_ADDIDATA, | ||
3606 | PCI_DEVICE_ID_ADDIDATA_APCIe7500, | ||
3607 | PCI_ANY_ID, | ||
3608 | PCI_ANY_ID, | ||
3609 | 0, | ||
3610 | 0, | ||
3611 | pbn_ADDIDATA_PCIe_4_3906250 }, | ||
3612 | |||
3613 | { PCI_VENDOR_ID_ADDIDATA, | ||
3614 | PCI_DEVICE_ID_ADDIDATA_APCIe7420, | ||
3615 | PCI_ANY_ID, | ||
3616 | PCI_ANY_ID, | ||
3617 | 0, | ||
3618 | 0, | ||
3619 | pbn_ADDIDATA_PCIe_2_3906250 }, | ||
3620 | |||
3621 | { PCI_VENDOR_ID_ADDIDATA, | ||
3622 | PCI_DEVICE_ID_ADDIDATA_APCIe7300, | ||
3623 | PCI_ANY_ID, | ||
3624 | PCI_ANY_ID, | ||
3625 | 0, | ||
3626 | 0, | ||
3627 | pbn_ADDIDATA_PCIe_1_3906250 }, | ||
3628 | |||
3629 | { PCI_VENDOR_ID_ADDIDATA, | ||
3630 | PCI_DEVICE_ID_ADDIDATA_APCIe7800, | ||
3631 | PCI_ANY_ID, | ||
3632 | PCI_ANY_ID, | ||
3633 | 0, | ||
3634 | 0, | ||
3635 | pbn_ADDIDATA_PCIe_8_3906250 }, | ||
3636 | |||
3559 | { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, | 3637 | { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, |
3560 | PCI_VENDOR_ID_IBM, 0x0299, | 3638 | PCI_VENDOR_ID_IBM, 0x0299, |
3561 | 0, 0, pbn_b0_bt_2_115200 }, | 3639 | 0, 0, pbn_b0_bt_2_115200 }, |
diff --git a/drivers/serial/atmel_serial.c b/drivers/serial/atmel_serial.c index 3551c5cb7094..9d948bccafaf 100644 --- a/drivers/serial/atmel_serial.c +++ b/drivers/serial/atmel_serial.c | |||
@@ -1531,7 +1531,7 @@ static int __devinit atmel_serial_probe(struct platform_device *pdev) | |||
1531 | void *data; | 1531 | void *data; |
1532 | int ret; | 1532 | int ret; |
1533 | 1533 | ||
1534 | BUILD_BUG_ON(!is_power_of_2(ATMEL_SERIAL_RINGSIZE)); | 1534 | BUILD_BUG_ON(ATMEL_SERIAL_RINGSIZE & (ATMEL_SERIAL_RINGSIZE - 1)); |
1535 | 1535 | ||
1536 | port = &atmel_ports[pdev->id]; | 1536 | port = &atmel_ports[pdev->id]; |
1537 | port->backup_imr = 0; | 1537 | port->backup_imr = 0; |
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index d7bcd074d383..7ce9e9f567a3 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
@@ -705,7 +705,7 @@ mpc52xx_uart_verify_port(struct uart_port *port, struct serial_struct *ser) | |||
705 | return -EINVAL; | 705 | return -EINVAL; |
706 | 706 | ||
707 | if ((ser->irq != port->irq) || | 707 | if ((ser->irq != port->irq) || |
708 | (ser->io_type != SERIAL_IO_MEM) || | 708 | (ser->io_type != UPIO_MEM) || |
709 | (ser->baud_base != port->uartclk) || | 709 | (ser->baud_base != port->uartclk) || |
710 | (ser->iomem_base != (void *)port->mapbase) || | 710 | (ser->iomem_base != (void *)port->mapbase) || |
711 | (ser->hub6 != 0)) | 711 | (ser->hub6 != 0)) |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index ff4617e21426..7c7914f5fa02 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
@@ -879,10 +879,10 @@ static struct pcmcia_device_id serial_ids[] = { | |||
879 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), | 879 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), |
880 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), | 880 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), |
881 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), | 881 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), |
882 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ | 882 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ |
883 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ | 883 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ |
884 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ | 884 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ |
885 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ | 885 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ |
886 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), | 886 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), |
887 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), | 887 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), |
888 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), | 888 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), |
diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 7df3ba4f1f4d..d21b3469f6d7 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig | |||
@@ -93,8 +93,6 @@ source "drivers/staging/dst/Kconfig" | |||
93 | 93 | ||
94 | source "drivers/staging/pohmelfs/Kconfig" | 94 | source "drivers/staging/pohmelfs/Kconfig" |
95 | 95 | ||
96 | source "drivers/staging/stlc45xx/Kconfig" | ||
97 | |||
98 | source "drivers/staging/b3dfg/Kconfig" | 96 | source "drivers/staging/b3dfg/Kconfig" |
99 | 97 | ||
100 | source "drivers/staging/phison/Kconfig" | 98 | source "drivers/staging/phison/Kconfig" |
diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 747571172269..8cbf1aebea2e 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile | |||
@@ -29,7 +29,6 @@ obj-$(CONFIG_ANDROID) += android/ | |||
29 | obj-$(CONFIG_ANDROID) += dream/ | 29 | obj-$(CONFIG_ANDROID) += dream/ |
30 | obj-$(CONFIG_DST) += dst/ | 30 | obj-$(CONFIG_DST) += dst/ |
31 | obj-$(CONFIG_POHMELFS) += pohmelfs/ | 31 | obj-$(CONFIG_POHMELFS) += pohmelfs/ |
32 | obj-$(CONFIG_STLC45XX) += stlc45xx/ | ||
33 | obj-$(CONFIG_B3DFG) += b3dfg/ | 32 | obj-$(CONFIG_B3DFG) += b3dfg/ |
34 | obj-$(CONFIG_IDE_PHISON) += phison/ | 33 | obj-$(CONFIG_IDE_PHISON) += phison/ |
35 | obj-$(CONFIG_PLAN9AUTH) += p9auth/ | 34 | obj-$(CONFIG_PLAN9AUTH) += p9auth/ |
diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig index 247194992374..eb675635ae60 100644 --- a/drivers/staging/android/Kconfig +++ b/drivers/staging/android/Kconfig | |||
@@ -2,6 +2,7 @@ menu "Android" | |||
2 | 2 | ||
3 | config ANDROID | 3 | config ANDROID |
4 | bool "Android Drivers" | 4 | bool "Android Drivers" |
5 | depends on BROKEN | ||
5 | default N | 6 | default N |
6 | ---help--- | 7 | ---help--- |
7 | Enable support for various drivers needed on the Android platform | 8 | Enable support for various drivers needed on the Android platform |
diff --git a/drivers/staging/hv/ChannelMgmt.h b/drivers/staging/hv/ChannelMgmt.h index a839d8fe6cec..fa973d86b624 100644 --- a/drivers/staging/hv/ChannelMgmt.h +++ b/drivers/staging/hv/ChannelMgmt.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #define _CHANNEL_MGMT_H_ | 26 | #define _CHANNEL_MGMT_H_ |
27 | 27 | ||
28 | #include <linux/list.h> | 28 | #include <linux/list.h> |
29 | #include <linux/timer.h> | ||
29 | #include "RingBuffer.h" | 30 | #include "RingBuffer.h" |
30 | #include "VmbusChannelInterface.h" | 31 | #include "VmbusChannelInterface.h" |
31 | #include "VmbusPacketFormat.h" | 32 | #include "VmbusPacketFormat.h" |
@@ -54,7 +55,7 @@ enum vmbus_channel_message_type { | |||
54 | ChannelMessageViewRangeRemove = 18, | 55 | ChannelMessageViewRangeRemove = 18, |
55 | #endif | 56 | #endif |
56 | ChannelMessageCount | 57 | ChannelMessageCount |
57 | } __attribute__((packed)); | 58 | }; |
58 | 59 | ||
59 | struct vmbus_channel_message_header { | 60 | struct vmbus_channel_message_header { |
60 | enum vmbus_channel_message_type MessageType; | 61 | enum vmbus_channel_message_type MessageType; |
diff --git a/drivers/staging/hv/NetVsc.c b/drivers/staging/hv/NetVsc.c index 1610b845198f..d384c0ddf069 100644 --- a/drivers/staging/hv/NetVsc.c +++ b/drivers/staging/hv/NetVsc.c | |||
@@ -1052,7 +1052,7 @@ static void NetVscOnReceive(struct hv_device *Device, | |||
1052 | */ | 1052 | */ |
1053 | spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); | 1053 | spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); |
1054 | while (!list_empty(&netDevice->ReceivePacketList)) { | 1054 | while (!list_empty(&netDevice->ReceivePacketList)) { |
1055 | list_move_tail(&netDevice->ReceivePacketList, &listHead); | 1055 | list_move_tail(netDevice->ReceivePacketList.next, &listHead); |
1056 | if (++count == vmxferpagePacket->RangeCount + 1) | 1056 | if (++count == vmxferpagePacket->RangeCount + 1) |
1057 | break; | 1057 | break; |
1058 | } | 1058 | } |
@@ -1071,7 +1071,7 @@ static void NetVscOnReceive(struct hv_device *Device, | |||
1071 | /* Return it to the freelist */ | 1071 | /* Return it to the freelist */ |
1072 | spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); | 1072 | spin_lock_irqsave(&netDevice->receive_packet_list_lock, flags); |
1073 | for (i = count; i != 0; i--) { | 1073 | for (i = count; i != 0; i--) { |
1074 | list_move_tail(&listHead, | 1074 | list_move_tail(listHead.next, |
1075 | &netDevice->ReceivePacketList); | 1075 | &netDevice->ReceivePacketList); |
1076 | } | 1076 | } |
1077 | spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, | 1077 | spin_unlock_irqrestore(&netDevice->receive_packet_list_lock, |
@@ -1085,8 +1085,7 @@ static void NetVscOnReceive(struct hv_device *Device, | |||
1085 | } | 1085 | } |
1086 | 1086 | ||
1087 | /* Remove the 1st packet to represent the xfer page packet itself */ | 1087 | /* Remove the 1st packet to represent the xfer page packet itself */ |
1088 | xferpagePacket = list_entry(&listHead, struct xferpage_packet, | 1088 | xferpagePacket = (struct xferpage_packet*)listHead.next; |
1089 | ListEntry); | ||
1090 | list_del(&xferpagePacket->ListEntry); | 1089 | list_del(&xferpagePacket->ListEntry); |
1091 | 1090 | ||
1092 | /* This is how much we can satisfy */ | 1091 | /* This is how much we can satisfy */ |
@@ -1102,8 +1101,7 @@ static void NetVscOnReceive(struct hv_device *Device, | |||
1102 | 1101 | ||
1103 | /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */ | 1102 | /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */ |
1104 | for (i = 0; i < (count - 1); i++) { | 1103 | for (i = 0; i < (count - 1); i++) { |
1105 | netvscPacket = list_entry(&listHead, struct hv_netvsc_packet, | 1104 | netvscPacket = (struct hv_netvsc_packet*)listHead.next; |
1106 | ListEntry); | ||
1107 | list_del(&netvscPacket->ListEntry); | 1105 | list_del(&netvscPacket->ListEntry); |
1108 | 1106 | ||
1109 | /* Initialize the netvsc packet */ | 1107 | /* Initialize the netvsc packet */ |
diff --git a/drivers/staging/hv/TODO b/drivers/staging/hv/TODO index 4d390b237742..dbfbde937a66 100644 --- a/drivers/staging/hv/TODO +++ b/drivers/staging/hv/TODO | |||
@@ -1,11 +1,17 @@ | |||
1 | TODO: | 1 | TODO: |
2 | - fix remaining checkpatch warnings and errors | 2 | - fix remaining checkpatch warnings and errors |
3 | - use of /** when it is not a kerneldoc header | ||
3 | - remove RingBuffer.c to us in-kernel ringbuffer functions instead. | 4 | - remove RingBuffer.c to us in-kernel ringbuffer functions instead. |
4 | - audit the vmbus to verify it is working properly with the | 5 | - audit the vmbus to verify it is working properly with the |
5 | driver model | 6 | driver model |
7 | - convert vmbus driver interface function pointer tables | ||
8 | to constant, a.k.a vmbus_ops | ||
6 | - see if the vmbus can be merged with the other virtual busses | 9 | - see if the vmbus can be merged with the other virtual busses |
7 | in the kernel | 10 | in the kernel |
8 | - audit the network driver | 11 | - audit the network driver |
12 | - use existing net_device_stats struct in network device | ||
13 | - checking for carrier inside open is wrong, network device API | ||
14 | confusion?? | ||
9 | - audit the block driver | 15 | - audit the block driver |
10 | - audit the scsi driver | 16 | - audit the scsi driver |
11 | 17 | ||
diff --git a/drivers/staging/hv/osd.h b/drivers/staging/hv/osd.h index 9504604c72bd..ce064e8ea644 100644 --- a/drivers/staging/hv/osd.h +++ b/drivers/staging/hv/osd.h | |||
@@ -25,6 +25,7 @@ | |||
25 | #ifndef _OSD_H_ | 25 | #ifndef _OSD_H_ |
26 | #define _OSD_H_ | 26 | #define _OSD_H_ |
27 | 27 | ||
28 | #include <linux/workqueue.h> | ||
28 | 29 | ||
29 | /* Defines */ | 30 | /* Defines */ |
30 | #define ALIGN_UP(value, align) (((value) & (align-1)) ? \ | 31 | #define ALIGN_UP(value, align) (((value) & (align-1)) ? \ |
diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 582318f10222..894eecfc63ca 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c | |||
@@ -507,12 +507,12 @@ static struct hv_device *vmbus_child_device_create(struct hv_guid *type, | |||
507 | 507 | ||
508 | child_device_obj = &child_device_ctx->device_obj; | 508 | child_device_obj = &child_device_ctx->device_obj; |
509 | child_device_obj->context = context; | 509 | child_device_obj->context = context; |
510 | memcpy(&child_device_obj->deviceType, &type, sizeof(struct hv_guid)); | 510 | memcpy(&child_device_obj->deviceType, type, sizeof(struct hv_guid)); |
511 | memcpy(&child_device_obj->deviceInstance, &instance, | 511 | memcpy(&child_device_obj->deviceInstance, instance, |
512 | sizeof(struct hv_guid)); | 512 | sizeof(struct hv_guid)); |
513 | 513 | ||
514 | memcpy(&child_device_ctx->class_id, &type, sizeof(struct hv_guid)); | 514 | memcpy(&child_device_ctx->class_id, type, sizeof(struct hv_guid)); |
515 | memcpy(&child_device_ctx->device_id, &instance, sizeof(struct hv_guid)); | 515 | memcpy(&child_device_ctx->device_id, instance, sizeof(struct hv_guid)); |
516 | 516 | ||
517 | DPRINT_EXIT(VMBUS_DRV); | 517 | DPRINT_EXIT(VMBUS_DRV); |
518 | 518 | ||
@@ -537,18 +537,7 @@ static int vmbus_child_device_register(struct hv_device *root_device_obj, | |||
537 | DPRINT_DBG(VMBUS_DRV, "child device (%p) registering", | 537 | DPRINT_DBG(VMBUS_DRV, "child device (%p) registering", |
538 | child_device_ctx); | 538 | child_device_ctx); |
539 | 539 | ||
540 | /* Make sure we are not registered already */ | 540 | /* Set the device name. Otherwise, device_register() will fail. */ |
541 | if (strlen(dev_name(&child_device_ctx->device)) != 0) { | ||
542 | DPRINT_ERR(VMBUS_DRV, | ||
543 | "child device (%p) already registered - busid %s", | ||
544 | child_device_ctx, | ||
545 | dev_name(&child_device_ctx->device)); | ||
546 | |||
547 | ret = -1; | ||
548 | goto Cleanup; | ||
549 | } | ||
550 | |||
551 | /* Set the device bus id. Otherwise, device_register()will fail. */ | ||
552 | dev_set_name(&child_device_ctx->device, "vmbus_0_%d", | 541 | dev_set_name(&child_device_ctx->device, "vmbus_0_%d", |
553 | atomic_inc_return(&device_num)); | 542 | atomic_inc_return(&device_num)); |
554 | 543 | ||
@@ -573,7 +562,6 @@ static int vmbus_child_device_register(struct hv_device *root_device_obj, | |||
573 | DPRINT_INFO(VMBUS_DRV, "child device (%p) registered", | 562 | DPRINT_INFO(VMBUS_DRV, "child device (%p) registered", |
574 | &child_device_ctx->device); | 563 | &child_device_ctx->device); |
575 | 564 | ||
576 | Cleanup: | ||
577 | DPRINT_EXIT(VMBUS_DRV); | 565 | DPRINT_EXIT(VMBUS_DRV); |
578 | 566 | ||
579 | return ret; | 567 | return ret; |
@@ -623,8 +611,6 @@ static void vmbus_child_device_destroy(struct hv_device *device_obj) | |||
623 | static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) | 611 | static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) |
624 | { | 612 | { |
625 | struct device_context *device_ctx = device_to_device_context(device); | 613 | struct device_context *device_ctx = device_to_device_context(device); |
626 | int i = 0; | ||
627 | int len = 0; | ||
628 | int ret; | 614 | int ret; |
629 | 615 | ||
630 | DPRINT_ENTER(VMBUS_DRV); | 616 | DPRINT_ENTER(VMBUS_DRV); |
@@ -644,8 +630,6 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) | |||
644 | device_ctx->class_id.data[14], | 630 | device_ctx->class_id.data[14], |
645 | device_ctx->class_id.data[15]); | 631 | device_ctx->class_id.data[15]); |
646 | 632 | ||
647 | env->envp_idx = i; | ||
648 | env->buflen = len; | ||
649 | ret = add_uevent_var(env, "VMBUS_DEVICE_CLASS_GUID={" | 633 | ret = add_uevent_var(env, "VMBUS_DEVICE_CLASS_GUID={" |
650 | "%02x%02x%02x%02x-%02x%02x-%02x%02x-" | 634 | "%02x%02x%02x%02x-%02x%02x-%02x%02x-" |
651 | "%02x%02x%02x%02x%02x%02x%02x%02x}", | 635 | "%02x%02x%02x%02x%02x%02x%02x%02x}", |
@@ -691,8 +675,6 @@ static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env) | |||
691 | if (ret) | 675 | if (ret) |
692 | return ret; | 676 | return ret; |
693 | 677 | ||
694 | env->envp[env->envp_idx] = NULL; | ||
695 | |||
696 | DPRINT_EXIT(VMBUS_DRV); | 678 | DPRINT_EXIT(VMBUS_DRV); |
697 | 679 | ||
698 | return 0; | 680 | return 0; |
diff --git a/drivers/staging/otus/Kconfig b/drivers/staging/otus/Kconfig index d549d08fd495..f6cc2625e341 100644 --- a/drivers/staging/otus/Kconfig +++ b/drivers/staging/otus/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config OTUS | 1 | config OTUS |
2 | tristate "Atheros OTUS 802.11n USB wireless support" | 2 | tristate "Atheros OTUS 802.11n USB wireless support" |
3 | depends on USB && WLAN_80211 && MAC80211 | 3 | depends on USB && WLAN && MAC80211 |
4 | default N | 4 | default N |
5 | ---help--- | 5 | ---help--- |
6 | Enable support for Atheros 802.11n USB hardware: | 6 | Enable support for Atheros 802.11n USB hardware: |
diff --git a/drivers/staging/panel/panel.c b/drivers/staging/panel/panel.c index dd7d3fde9699..4ce399b6d237 100644 --- a/drivers/staging/panel/panel.c +++ b/drivers/staging/panel/panel.c | |||
@@ -2071,11 +2071,15 @@ static void panel_detach(struct parport *port) | |||
2071 | return; | 2071 | return; |
2072 | } | 2072 | } |
2073 | 2073 | ||
2074 | if (keypad_enabled && keypad_initialized) | 2074 | if (keypad_enabled && keypad_initialized) { |
2075 | misc_deregister(&keypad_dev); | 2075 | misc_deregister(&keypad_dev); |
2076 | keypad_initialized = 0; | ||
2077 | } | ||
2076 | 2078 | ||
2077 | if (lcd_enabled && lcd_initialized) | 2079 | if (lcd_enabled && lcd_initialized) { |
2078 | misc_deregister(&lcd_dev); | 2080 | misc_deregister(&lcd_dev); |
2081 | lcd_initialized = 0; | ||
2082 | } | ||
2079 | 2083 | ||
2080 | parport_release(pprt); | 2084 | parport_release(pprt); |
2081 | parport_unregister_device(pprt); | 2085 | parport_unregister_device(pprt); |
@@ -2211,13 +2215,16 @@ static void __exit panel_cleanup_module(void) | |||
2211 | del_timer(&scan_timer); | 2215 | del_timer(&scan_timer); |
2212 | 2216 | ||
2213 | if (pprt != NULL) { | 2217 | if (pprt != NULL) { |
2214 | if (keypad_enabled) | 2218 | if (keypad_enabled) { |
2215 | misc_deregister(&keypad_dev); | 2219 | misc_deregister(&keypad_dev); |
2220 | keypad_initialized = 0; | ||
2221 | } | ||
2216 | 2222 | ||
2217 | if (lcd_enabled) { | 2223 | if (lcd_enabled) { |
2218 | panel_lcd_print("\x0cLCD driver " PANEL_VERSION | 2224 | panel_lcd_print("\x0cLCD driver " PANEL_VERSION |
2219 | "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-"); | 2225 | "\nunloaded.\x1b[Lc\x1b[Lb\x1b[L-"); |
2220 | misc_deregister(&lcd_dev); | 2226 | misc_deregister(&lcd_dev); |
2227 | lcd_initialized = 0; | ||
2221 | } | 2228 | } |
2222 | 2229 | ||
2223 | /* TODO: free all input signals */ | 2230 | /* TODO: free all input signals */ |
diff --git a/drivers/staging/rt2860/Kconfig b/drivers/staging/rt2860/Kconfig index 7f44e5e72463..efe38e25c5ed 100644 --- a/drivers/staging/rt2860/Kconfig +++ b/drivers/staging/rt2860/Kconfig | |||
@@ -1,5 +1,5 @@ | |||
1 | config RT2860 | 1 | config RT2860 |
2 | tristate "Ralink 2860 wireless support" | 2 | tristate "Ralink 2860 wireless support" |
3 | depends on PCI && X86 && WLAN_80211 | 3 | depends on PCI && X86 && WLAN |
4 | ---help--- | 4 | ---help--- |
5 | This is an experimental driver for the Ralink 2860 wireless chip. | 5 | This is an experimental driver for the Ralink 2860 wireless chip. |
diff --git a/drivers/staging/rt2870/Kconfig b/drivers/staging/rt2870/Kconfig index 76841f6dea93..aea5c8221810 100644 --- a/drivers/staging/rt2870/Kconfig +++ b/drivers/staging/rt2870/Kconfig | |||
@@ -1,5 +1,5 @@ | |||
1 | config RT2870 | 1 | config RT2870 |
2 | tristate "Ralink 2870/3070 wireless support" | 2 | tristate "Ralink 2870/3070 wireless support" |
3 | depends on USB && X86 && WLAN_80211 | 3 | depends on USB && X86 && WLAN |
4 | ---help--- | 4 | ---help--- |
5 | This is an experimental driver for the Ralink xx70 wireless chips. | 5 | This is an experimental driver for the Ralink xx70 wireless chips. |
diff --git a/drivers/staging/rt3090/Kconfig b/drivers/staging/rt3090/Kconfig index 255e8eaa4836..2b3f745d72b7 100644 --- a/drivers/staging/rt3090/Kconfig +++ b/drivers/staging/rt3090/Kconfig | |||
@@ -1,5 +1,5 @@ | |||
1 | config RT3090 | 1 | config RT3090 |
2 | tristate "Ralink 3090 wireless support" | 2 | tristate "Ralink 3090 wireless support" |
3 | depends on PCI && X86 && WLAN_80211 | 3 | depends on PCI && X86 && WLAN |
4 | ---help--- | 4 | ---help--- |
5 | This is an experimental driver for the Ralink 3090 wireless chip. | 5 | This is an experimental driver for the Ralink 3090 wireless chip. |
diff --git a/drivers/staging/rtl8187se/Kconfig b/drivers/staging/rtl8187se/Kconfig index 236e42725447..203c79b8180f 100644 --- a/drivers/staging/rtl8187se/Kconfig +++ b/drivers/staging/rtl8187se/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config RTL8187SE | 1 | config RTL8187SE |
2 | tristate "RealTek RTL8187SE Wireless LAN NIC driver" | 2 | tristate "RealTek RTL8187SE Wireless LAN NIC driver" |
3 | depends on PCI | 3 | depends on PCI && WLAN |
4 | depends on WIRELESS_EXT | 4 | depends on WIRELESS_EXT |
5 | default N | 5 | default N |
6 | ---help--- | 6 | ---help--- |
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c index 013c3e19ae25..4c5d63fd5833 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_crypt.c | |||
@@ -53,10 +53,8 @@ void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, | |||
53 | 53 | ||
54 | list_del(ptr); | 54 | list_del(ptr); |
55 | 55 | ||
56 | if (entry->ops) { | 56 | if (entry->ops) |
57 | entry->ops->deinit(entry->priv); | 57 | entry->ops->deinit(entry->priv); |
58 | module_put(entry->ops->owner); | ||
59 | } | ||
60 | kfree(entry); | 58 | kfree(entry); |
61 | } | 59 | } |
62 | } | 60 | } |
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c index 6fbe4890cb66..18392fce487d 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_module.c | |||
@@ -189,10 +189,8 @@ void free_ieee80211(struct net_device *dev) | |||
189 | for (i = 0; i < WEP_KEYS; i++) { | 189 | for (i = 0; i < WEP_KEYS; i++) { |
190 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; | 190 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; |
191 | if (crypt) { | 191 | if (crypt) { |
192 | if (crypt->ops) { | 192 | if (crypt->ops) |
193 | crypt->ops->deinit(crypt->priv); | 193 | crypt->ops->deinit(crypt->priv); |
194 | module_put(crypt->ops->owner); | ||
195 | } | ||
196 | kfree(crypt); | 194 | kfree(crypt); |
197 | ieee->crypt[i] = NULL; | 195 | ieee->crypt[i] = NULL; |
198 | } | 196 | } |
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c index 59b2ab48cdcf..334e4c7ec61b 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_softmac.c | |||
@@ -2839,16 +2839,12 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
2839 | goto skip_host_crypt; | 2839 | goto skip_host_crypt; |
2840 | 2840 | ||
2841 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 2841 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
2842 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { | 2842 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) |
2843 | request_module("ieee80211_crypt_wep"); | ||
2844 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 2843 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
2845 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { | 2844 | else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) |
2846 | request_module("ieee80211_crypt_tkip"); | ||
2847 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 2845 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
2848 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { | 2846 | else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) |
2849 | request_module("ieee80211_crypt_ccmp"); | ||
2850 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 2847 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
2851 | } | ||
2852 | if (ops == NULL) { | 2848 | if (ops == NULL) { |
2853 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); | 2849 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); |
2854 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; | 2850 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; |
@@ -2869,7 +2865,7 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
2869 | } | 2865 | } |
2870 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 2866 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
2871 | new_crypt->ops = ops; | 2867 | new_crypt->ops = ops; |
2872 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 2868 | if (new_crypt->ops) |
2873 | new_crypt->priv = | 2869 | new_crypt->priv = |
2874 | new_crypt->ops->init(param->u.crypt.idx); | 2870 | new_crypt->ops->init(param->u.crypt.idx); |
2875 | 2871 | ||
diff --git a/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c index 8d8bdd0a130e..a08b97a09512 100644 --- a/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c +++ b/drivers/staging/rtl8187se/ieee80211/ieee80211_wx.c | |||
@@ -331,12 +331,10 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, | |||
331 | return -ENOMEM; | 331 | return -ENOMEM; |
332 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 332 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
333 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 333 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
334 | if (!new_crypt->ops) { | 334 | if (!new_crypt->ops) |
335 | request_module("ieee80211_crypt_wep"); | ||
336 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 335 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
337 | } | ||
338 | 336 | ||
339 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 337 | if (new_crypt->ops) |
340 | new_crypt->priv = new_crypt->ops->init(key); | 338 | new_crypt->priv = new_crypt->ops->init(key); |
341 | 339 | ||
342 | if (!new_crypt->ops || !new_crypt->priv) { | 340 | if (!new_crypt->ops || !new_crypt->priv) { |
@@ -483,7 +481,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
483 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | 481 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; |
484 | int i, idx, ret = 0; | 482 | int i, idx, ret = 0; |
485 | int group_key = 0; | 483 | int group_key = 0; |
486 | const char *alg, *module; | 484 | const char *alg; |
487 | struct ieee80211_crypto_ops *ops; | 485 | struct ieee80211_crypto_ops *ops; |
488 | struct ieee80211_crypt_data **crypt; | 486 | struct ieee80211_crypt_data **crypt; |
489 | 487 | ||
@@ -539,15 +537,12 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
539 | switch (ext->alg) { | 537 | switch (ext->alg) { |
540 | case IW_ENCODE_ALG_WEP: | 538 | case IW_ENCODE_ALG_WEP: |
541 | alg = "WEP"; | 539 | alg = "WEP"; |
542 | module = "ieee80211_crypt_wep"; | ||
543 | break; | 540 | break; |
544 | case IW_ENCODE_ALG_TKIP: | 541 | case IW_ENCODE_ALG_TKIP: |
545 | alg = "TKIP"; | 542 | alg = "TKIP"; |
546 | module = "ieee80211_crypt_tkip"; | ||
547 | break; | 543 | break; |
548 | case IW_ENCODE_ALG_CCMP: | 544 | case IW_ENCODE_ALG_CCMP: |
549 | alg = "CCMP"; | 545 | alg = "CCMP"; |
550 | module = "ieee80211_crypt_ccmp"; | ||
551 | break; | 546 | break; |
552 | default: | 547 | default: |
553 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 548 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
@@ -558,10 +553,8 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
558 | // printk("8-09-08-9=====>%s, alg name:%s\n",__func__, alg); | 553 | // printk("8-09-08-9=====>%s, alg name:%s\n",__func__, alg); |
559 | 554 | ||
560 | ops = ieee80211_get_crypto_ops(alg); | 555 | ops = ieee80211_get_crypto_ops(alg); |
561 | if (ops == NULL) { | 556 | if (ops == NULL) |
562 | request_module(module); | ||
563 | ops = ieee80211_get_crypto_ops(alg); | 557 | ops = ieee80211_get_crypto_ops(alg); |
564 | } | ||
565 | if (ops == NULL) { | 558 | if (ops == NULL) { |
566 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 559 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
567 | dev->name, ext->alg); | 560 | dev->name, ext->alg); |
@@ -581,7 +574,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
581 | goto done; | 574 | goto done; |
582 | } | 575 | } |
583 | new_crypt->ops = ops; | 576 | new_crypt->ops = ops; |
584 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 577 | if (new_crypt->ops) |
585 | new_crypt->priv = new_crypt->ops->init(idx); | 578 | new_crypt->priv = new_crypt->ops->init(idx); |
586 | if (new_crypt->priv == NULL) { | 579 | if (new_crypt->priv == NULL) { |
587 | kfree(new_crypt); | 580 | kfree(new_crypt); |
diff --git a/drivers/staging/rtl8192e/Kconfig b/drivers/staging/rtl8192e/Kconfig index 3100aa58c940..37e4fde45073 100644 --- a/drivers/staging/rtl8192e/Kconfig +++ b/drivers/staging/rtl8192e/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config RTL8192E | 1 | config RTL8192E |
2 | tristate "RealTek RTL8192E Wireless LAN NIC driver" | 2 | tristate "RealTek RTL8192E Wireless LAN NIC driver" |
3 | depends on PCI | 3 | depends on PCI && WLAN |
4 | depends on WIRELESS_EXT | 4 | depends on WIRELESS_EXT |
5 | default N | 5 | default N |
6 | ---help--- | 6 | ---help--- |
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c index 1a8ea8a40c3c..b1c54932da3e 100644 --- a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c +++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c | |||
@@ -53,14 +53,8 @@ void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, | |||
53 | 53 | ||
54 | list_del(ptr); | 54 | list_del(ptr); |
55 | 55 | ||
56 | if (entry->ops) { | 56 | if (entry->ops) |
57 | entry->ops->deinit(entry->priv); | 57 | entry->ops->deinit(entry->priv); |
58 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) | ||
59 | module_put(entry->ops->owner); | ||
60 | #else | ||
61 | __MOD_DEC_USE_COUNT(entry->ops->owner); | ||
62 | #endif | ||
63 | } | ||
64 | kfree(entry); | 58 | kfree(entry); |
65 | } | 59 | } |
66 | } | 60 | } |
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c index 16256a31f993..12c2a18e1fa2 100644 --- a/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c +++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c | |||
@@ -242,14 +242,8 @@ void free_ieee80211(struct net_device *dev) | |||
242 | for (i = 0; i < WEP_KEYS; i++) { | 242 | for (i = 0; i < WEP_KEYS; i++) { |
243 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; | 243 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; |
244 | if (crypt) { | 244 | if (crypt) { |
245 | if (crypt->ops) { | 245 | if (crypt->ops) |
246 | crypt->ops->deinit(crypt->priv); | 246 | crypt->ops->deinit(crypt->priv); |
247 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) | ||
248 | module_put(crypt->ops->owner); | ||
249 | #else | ||
250 | __MOD_DEC_USE_COUNT(crypt->ops->owner); | ||
251 | #endif | ||
252 | } | ||
253 | kfree(crypt); | 247 | kfree(crypt); |
254 | ieee->crypt[i] = NULL; | 248 | ieee->crypt[i] = NULL; |
255 | } | 249 | } |
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c index 2fc04df872ca..eae7c4579a68 100644 --- a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c +++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c | |||
@@ -3284,17 +3284,14 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
3284 | goto skip_host_crypt; | 3284 | goto skip_host_crypt; |
3285 | 3285 | ||
3286 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3286 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3287 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { | 3287 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) |
3288 | request_module("ieee80211_crypt_wep"); | ||
3289 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3288 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3290 | //set WEP40 first, it will be modified according to WEP104 or WEP40 at other place | 3289 | /* set WEP40 first, it will be modified according to WEP104 or |
3291 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { | 3290 | * WEP40 at other place */ |
3292 | request_module("ieee80211_crypt_tkip"); | 3291 | else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) |
3293 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3292 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3294 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { | 3293 | else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) |
3295 | request_module("ieee80211_crypt_ccmp"); | ||
3296 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3294 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3297 | } | ||
3298 | if (ops == NULL) { | 3295 | if (ops == NULL) { |
3299 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); | 3296 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); |
3300 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; | 3297 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; |
@@ -3315,11 +3312,7 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
3315 | } | 3312 | } |
3316 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 3313 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
3317 | new_crypt->ops = ops; | 3314 | new_crypt->ops = ops; |
3318 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) | 3315 | if (new_crypt->ops) |
3319 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | ||
3320 | #else | ||
3321 | if (new_crypt->ops && try_inc_mod_count(new_crypt->ops->owner)) | ||
3322 | #endif | ||
3323 | new_crypt->priv = | 3316 | new_crypt->priv = |
3324 | new_crypt->ops->init(param->u.crypt.idx); | 3317 | new_crypt->ops->init(param->u.crypt.idx); |
3325 | 3318 | ||
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c index 223483126b0e..4e34a1f4c66b 100644 --- a/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c +++ b/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c | |||
@@ -482,15 +482,9 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, | |||
482 | return -ENOMEM; | 482 | return -ENOMEM; |
483 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 483 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
484 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 484 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
485 | if (!new_crypt->ops) { | 485 | if (!new_crypt->ops) |
486 | request_module("ieee80211_crypt_wep"); | ||
487 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 486 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
488 | } | 487 | if (new_crypt->ops) |
489 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) | ||
490 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | ||
491 | #else | ||
492 | if (new_crypt->ops && try_inc_mod_count(new_crypt->ops->owner)) | ||
493 | #endif | ||
494 | new_crypt->priv = new_crypt->ops->init(key); | 488 | new_crypt->priv = new_crypt->ops->init(key); |
495 | 489 | ||
496 | if (!new_crypt->ops || !new_crypt->priv) { | 490 | if (!new_crypt->ops || !new_crypt->priv) { |
@@ -644,7 +638,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
644 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | 638 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; |
645 | int i, idx; | 639 | int i, idx; |
646 | int group_key = 0; | 640 | int group_key = 0; |
647 | const char *alg, *module; | 641 | const char *alg; |
648 | struct ieee80211_crypto_ops *ops; | 642 | struct ieee80211_crypto_ops *ops; |
649 | struct ieee80211_crypt_data **crypt; | 643 | struct ieee80211_crypt_data **crypt; |
650 | 644 | ||
@@ -711,15 +705,12 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
711 | switch (ext->alg) { | 705 | switch (ext->alg) { |
712 | case IW_ENCODE_ALG_WEP: | 706 | case IW_ENCODE_ALG_WEP: |
713 | alg = "WEP"; | 707 | alg = "WEP"; |
714 | module = "ieee80211_crypt_wep"; | ||
715 | break; | 708 | break; |
716 | case IW_ENCODE_ALG_TKIP: | 709 | case IW_ENCODE_ALG_TKIP: |
717 | alg = "TKIP"; | 710 | alg = "TKIP"; |
718 | module = "ieee80211_crypt_tkip"; | ||
719 | break; | 711 | break; |
720 | case IW_ENCODE_ALG_CCMP: | 712 | case IW_ENCODE_ALG_CCMP: |
721 | alg = "CCMP"; | 713 | alg = "CCMP"; |
722 | module = "ieee80211_crypt_ccmp"; | ||
723 | break; | 714 | break; |
724 | default: | 715 | default: |
725 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 716 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
@@ -730,10 +721,8 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
730 | printk("alg name:%s\n",alg); | 721 | printk("alg name:%s\n",alg); |
731 | 722 | ||
732 | ops = ieee80211_get_crypto_ops(alg); | 723 | ops = ieee80211_get_crypto_ops(alg); |
733 | if (ops == NULL) { | 724 | if (ops == NULL) |
734 | request_module(module); | ||
735 | ops = ieee80211_get_crypto_ops(alg); | 725 | ops = ieee80211_get_crypto_ops(alg); |
736 | } | ||
737 | if (ops == NULL) { | 726 | if (ops == NULL) { |
738 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 727 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
739 | dev->name, ext->alg); | 728 | dev->name, ext->alg); |
@@ -758,7 +747,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
758 | goto done; | 747 | goto done; |
759 | } | 748 | } |
760 | new_crypt->ops = ops; | 749 | new_crypt->ops = ops; |
761 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 750 | if (new_crypt->ops) |
762 | new_crypt->priv = new_crypt->ops->init(idx); | 751 | new_crypt->priv = new_crypt->ops->init(idx); |
763 | if (new_crypt->priv == NULL) { | 752 | if (new_crypt->priv == NULL) { |
764 | kfree(new_crypt); | 753 | kfree(new_crypt); |
diff --git a/drivers/staging/rtl8192su/Kconfig b/drivers/staging/rtl8192su/Kconfig index 770f41280f21..b8c95f942069 100644 --- a/drivers/staging/rtl8192su/Kconfig +++ b/drivers/staging/rtl8192su/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config RTL8192SU | 1 | config RTL8192SU |
2 | tristate "RealTek RTL8192SU Wireless LAN NIC driver" | 2 | tristate "RealTek RTL8192SU Wireless LAN NIC driver" |
3 | depends on PCI | 3 | depends on PCI && WLAN |
4 | depends on WIRELESS_EXT | 4 | depends on WIRELESS_EXT |
5 | default N | 5 | default N |
6 | ---help--- | 6 | ---help--- |
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211_crypt.c b/drivers/staging/rtl8192su/ieee80211/ieee80211_crypt.c index d76a54d59d2f..521e7b989934 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211_crypt.c +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_crypt.c | |||
@@ -53,10 +53,8 @@ void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee, | |||
53 | 53 | ||
54 | list_del(ptr); | 54 | list_del(ptr); |
55 | 55 | ||
56 | if (entry->ops) { | 56 | if (entry->ops) |
57 | entry->ops->deinit(entry->priv); | 57 | entry->ops->deinit(entry->priv); |
58 | module_put(entry->ops->owner); | ||
59 | } | ||
60 | kfree(entry); | 58 | kfree(entry); |
61 | } | 59 | } |
62 | } | 60 | } |
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211_module.c b/drivers/staging/rtl8192su/ieee80211/ieee80211_module.c index 68dc8fa094cc..c3383bb8b760 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211_module.c +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_module.c | |||
@@ -216,10 +216,8 @@ void free_ieee80211(struct net_device *dev) | |||
216 | for (i = 0; i < WEP_KEYS; i++) { | 216 | for (i = 0; i < WEP_KEYS; i++) { |
217 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; | 217 | struct ieee80211_crypt_data *crypt = ieee->crypt[i]; |
218 | if (crypt) { | 218 | if (crypt) { |
219 | if (crypt->ops) { | 219 | if (crypt->ops) |
220 | crypt->ops->deinit(crypt->priv); | 220 | crypt->ops->deinit(crypt->priv); |
221 | module_put(crypt->ops->owner); | ||
222 | } | ||
223 | kfree(crypt); | 221 | kfree(crypt); |
224 | ieee->crypt[i] = NULL; | 222 | ieee->crypt[i] = NULL; |
225 | } | 223 | } |
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8192su/ieee80211/ieee80211_softmac.c index c64ae03f68a0..fd8e11252f1b 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211_softmac.c +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_softmac.c | |||
@@ -3026,17 +3026,14 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
3026 | goto skip_host_crypt; | 3026 | goto skip_host_crypt; |
3027 | 3027 | ||
3028 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3028 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3029 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) { | 3029 | if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) |
3030 | request_module("ieee80211_crypt_wep"); | ||
3031 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3030 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3032 | //set WEP40 first, it will be modified according to WEP104 or WEP40 at other place | 3031 | /* set WEP40 first, it will be modified according to WEP104 or |
3033 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) { | 3032 | * WEP40 at other place */ |
3034 | request_module("ieee80211_crypt_tkip"); | 3033 | else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) |
3035 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3034 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3036 | } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) { | 3035 | else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) |
3037 | request_module("ieee80211_crypt_ccmp"); | ||
3038 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); | 3036 | ops = ieee80211_get_crypto_ops(param->u.crypt.alg); |
3039 | } | ||
3040 | if (ops == NULL) { | 3037 | if (ops == NULL) { |
3041 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); | 3038 | printk("unknown crypto alg '%s'\n", param->u.crypt.alg); |
3042 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; | 3039 | param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG; |
@@ -3058,7 +3055,7 @@ static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee, | |||
3058 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 3055 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
3059 | new_crypt->ops = ops; | 3056 | new_crypt->ops = ops; |
3060 | 3057 | ||
3061 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 3058 | if (new_crypt->ops) |
3062 | new_crypt->priv = | 3059 | new_crypt->priv = |
3063 | new_crypt->ops->init(param->u.crypt.idx); | 3060 | new_crypt->ops->init(param->u.crypt.idx); |
3064 | 3061 | ||
diff --git a/drivers/staging/rtl8192su/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8192su/ieee80211/ieee80211_wx.c index 107759024335..6146c6435dde 100644 --- a/drivers/staging/rtl8192su/ieee80211/ieee80211_wx.c +++ b/drivers/staging/rtl8192su/ieee80211/ieee80211_wx.c | |||
@@ -358,11 +358,9 @@ int ieee80211_wx_set_encode(struct ieee80211_device *ieee, | |||
358 | return -ENOMEM; | 358 | return -ENOMEM; |
359 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); | 359 | memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data)); |
360 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 360 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
361 | if (!new_crypt->ops) { | 361 | if (!new_crypt->ops) |
362 | request_module("ieee80211_crypt_wep"); | ||
363 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); | 362 | new_crypt->ops = ieee80211_get_crypto_ops("WEP"); |
364 | } | 363 | if (new_crypt->ops) |
365 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | ||
366 | new_crypt->priv = new_crypt->ops->init(key); | 364 | new_crypt->priv = new_crypt->ops->init(key); |
367 | 365 | ||
368 | if (!new_crypt->ops || !new_crypt->priv) { | 366 | if (!new_crypt->ops || !new_crypt->priv) { |
@@ -507,7 +505,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
507 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | 505 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; |
508 | int i, idx; | 506 | int i, idx; |
509 | int group_key = 0; | 507 | int group_key = 0; |
510 | const char *alg, *module; | 508 | const char *alg; |
511 | struct ieee80211_crypto_ops *ops; | 509 | struct ieee80211_crypto_ops *ops; |
512 | struct ieee80211_crypt_data **crypt; | 510 | struct ieee80211_crypt_data **crypt; |
513 | 511 | ||
@@ -570,15 +568,12 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
570 | switch (ext->alg) { | 568 | switch (ext->alg) { |
571 | case IW_ENCODE_ALG_WEP: | 569 | case IW_ENCODE_ALG_WEP: |
572 | alg = "WEP"; | 570 | alg = "WEP"; |
573 | module = "ieee80211_crypt_wep"; | ||
574 | break; | 571 | break; |
575 | case IW_ENCODE_ALG_TKIP: | 572 | case IW_ENCODE_ALG_TKIP: |
576 | alg = "TKIP"; | 573 | alg = "TKIP"; |
577 | module = "ieee80211_crypt_tkip"; | ||
578 | break; | 574 | break; |
579 | case IW_ENCODE_ALG_CCMP: | 575 | case IW_ENCODE_ALG_CCMP: |
580 | alg = "CCMP"; | 576 | alg = "CCMP"; |
581 | module = "ieee80211_crypt_ccmp"; | ||
582 | break; | 577 | break; |
583 | default: | 578 | default: |
584 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 579 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
@@ -589,10 +584,8 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
589 | printk("alg name:%s\n",alg); | 584 | printk("alg name:%s\n",alg); |
590 | 585 | ||
591 | ops = ieee80211_get_crypto_ops(alg); | 586 | ops = ieee80211_get_crypto_ops(alg); |
592 | if (ops == NULL) { | 587 | if (ops == NULL) |
593 | request_module("%s", module); | ||
594 | ops = ieee80211_get_crypto_ops(alg); | 588 | ops = ieee80211_get_crypto_ops(alg); |
595 | } | ||
596 | if (ops == NULL) { | 589 | if (ops == NULL) { |
597 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", | 590 | IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n", |
598 | dev->name, ext->alg); | 591 | dev->name, ext->alg); |
@@ -612,7 +605,7 @@ int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee, | |||
612 | goto done; | 605 | goto done; |
613 | } | 606 | } |
614 | new_crypt->ops = ops; | 607 | new_crypt->ops = ops; |
615 | if (new_crypt->ops && try_module_get(new_crypt->ops->owner)) | 608 | if (new_crypt->ops) |
616 | new_crypt->priv = new_crypt->ops->init(idx); | 609 | new_crypt->priv = new_crypt->ops->init(idx); |
617 | if (new_crypt->priv == NULL) { | 610 | if (new_crypt->priv == NULL) { |
618 | kfree(new_crypt); | 611 | kfree(new_crypt); |
diff --git a/drivers/staging/stlc45xx/Kconfig b/drivers/staging/stlc45xx/Kconfig deleted file mode 100644 index 947fb75a9c68..000000000000 --- a/drivers/staging/stlc45xx/Kconfig +++ /dev/null | |||
@@ -1,8 +0,0 @@ | |||
1 | config STLC45XX | ||
2 | tristate "stlc4550/4560 support" | ||
3 | depends on MAC80211 && WLAN_80211 && SPI_MASTER && GENERIC_HARDIRQS | ||
4 | ---help--- | ||
5 | This is a driver for stlc4550 and stlc4560 chipsets. | ||
6 | |||
7 | To compile this driver as a module, choose M here: the module will be | ||
8 | called stlc45xx. If unsure, say N. | ||
diff --git a/drivers/staging/stlc45xx/Makefile b/drivers/staging/stlc45xx/Makefile deleted file mode 100644 index 7ee32903055a..000000000000 --- a/drivers/staging/stlc45xx/Makefile +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | obj-$(CONFIG_STLC45XX) += stlc45xx.o | ||
diff --git a/drivers/staging/stlc45xx/stlc45xx.c b/drivers/staging/stlc45xx/stlc45xx.c deleted file mode 100644 index be99eb33d817..000000000000 --- a/drivers/staging/stlc45xx/stlc45xx.c +++ /dev/null | |||
@@ -1,2594 +0,0 @@ | |||
1 | /* | ||
2 | * This file is part of stlc45xx | ||
3 | * | ||
4 | * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). | ||
5 | * | ||
6 | * Contact: Kalle Valo <kalle.valo@nokia.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * version 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
20 | * 02110-1301 USA | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #include "stlc45xx.h" | ||
25 | |||
26 | #include <linux/module.h> | ||
27 | #include <linux/platform_device.h> | ||
28 | #include <linux/interrupt.h> | ||
29 | #include <linux/firmware.h> | ||
30 | #include <linux/delay.h> | ||
31 | #include <linux/irq.h> | ||
32 | #include <linux/spi/spi.h> | ||
33 | #include <linux/etherdevice.h> | ||
34 | #include <linux/gpio.h> | ||
35 | #include <linux/moduleparam.h> | ||
36 | |||
37 | #include "stlc45xx_lmac.h" | ||
38 | |||
39 | /* | ||
40 | * gpios should be handled in board files and provided via platform data, | ||
41 | * but because it's currently impossible for stlc45xx to have a header file | ||
42 | * in include/linux, let's use module paramaters for now | ||
43 | */ | ||
44 | static int stlc45xx_gpio_power = 97; | ||
45 | module_param(stlc45xx_gpio_power, int, 0444); | ||
46 | MODULE_PARM_DESC(stlc45xx_gpio_power, "stlc45xx gpio number for power line"); | ||
47 | |||
48 | static int stlc45xx_gpio_irq = 87; | ||
49 | module_param(stlc45xx_gpio_irq, int, 0444); | ||
50 | MODULE_PARM_DESC(stlc45xx_gpio_irq, "stlc45xx gpio number for irq line"); | ||
51 | |||
52 | static const u8 default_cal_channels[] = { | ||
53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x09, | ||
55 | 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, | ||
56 | 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xe0, 0x00, 0xe0, 0x00, | ||
57 | 0xe0, 0x00, 0xe0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, | ||
58 | 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, | ||
59 | 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
60 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, | ||
61 | 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, | ||
62 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
63 | 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, | ||
64 | 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
65 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, | ||
66 | 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, | ||
67 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
68 | 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, | ||
69 | 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
70 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, | ||
71 | 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, | ||
72 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
73 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
74 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
75 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
79 | 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
81 | 0x00, 0x00, 0x00, 0x00, 0x71, 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, | ||
82 | 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, | ||
83 | 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, | ||
84 | 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, | ||
85 | 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, | ||
86 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
87 | 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, | ||
88 | 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
89 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, | ||
90 | 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, | ||
91 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
92 | 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, | ||
93 | 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
94 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, | ||
95 | 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, | ||
96 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
97 | 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, | ||
98 | 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
99 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
100 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
104 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, | ||
106 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
107 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, | ||
108 | 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, | ||
109 | 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xf0, 0x00, 0xf0, | ||
110 | 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, | ||
111 | 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, | ||
112 | 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
113 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, | ||
114 | 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, | ||
115 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
116 | 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, | ||
117 | 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
118 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, | ||
119 | 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, | ||
120 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
121 | 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, | ||
122 | 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
123 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, | ||
124 | 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, | ||
125 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
126 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
127 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
128 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
129 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
130 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
131 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
132 | 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
133 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
134 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x09, 0x00, 0x00, 0xc9, 0xff, | ||
135 | 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, | ||
136 | 0x01, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, | ||
137 | 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, | ||
138 | 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, | ||
139 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
140 | 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, | ||
141 | 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
142 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, | ||
143 | 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, | ||
144 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
145 | 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, | ||
146 | 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
147 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, | ||
148 | 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, | ||
149 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
150 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, | ||
151 | 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
152 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
153 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
154 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
155 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
156 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
157 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, | ||
159 | 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
160 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
161 | 0x80, 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, | ||
162 | 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xf0, 0x00, | ||
163 | 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, | ||
164 | 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, | ||
165 | 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
166 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, | ||
167 | 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, | ||
168 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
169 | 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, | ||
170 | 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
171 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, | ||
172 | 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, | ||
173 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
174 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, | ||
175 | 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
176 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
177 | 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, | ||
178 | 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
179 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
180 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
181 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
185 | 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, | ||
186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00, 0xc9, | ||
188 | 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, | ||
189 | 0x10, 0x01, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, | ||
190 | 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, | ||
191 | 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, | ||
192 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
193 | 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, | ||
194 | 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
195 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, | ||
196 | 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, | ||
197 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
198 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, | ||
199 | 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
200 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
201 | 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, | ||
202 | 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
203 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, | ||
204 | 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, | ||
205 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
206 | 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, | ||
212 | 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
214 | 0x00, 0x8a, 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, | ||
215 | 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xf0, | ||
216 | 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, 0x00, 0xd0, 0x00, | ||
217 | 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, | ||
218 | 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
219 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, | ||
220 | 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, | ||
221 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
222 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, | ||
223 | 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
224 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
225 | 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, | ||
226 | 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
227 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, | ||
228 | 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, | ||
229 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
230 | 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, | ||
231 | 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
232 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, | ||
233 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
234 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
235 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
236 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
237 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
238 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, | ||
239 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
240 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x09, 0x00, 0x00, | ||
241 | 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, | ||
242 | 0x01, 0x10, 0x01, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, | ||
243 | 0xf0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, | ||
244 | 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, | ||
245 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
246 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, | ||
247 | 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
248 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
249 | 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, | ||
250 | 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
251 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, | ||
252 | 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, | ||
253 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
254 | 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, | ||
255 | 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
256 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, | ||
257 | 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, | ||
258 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
259 | 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
260 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
261 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
262 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
263 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
264 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
265 | 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
266 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
267 | 0x00, 0x00, 0x94, 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, | ||
268 | 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, | ||
269 | 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, 0x00, 0xd0, | ||
270 | 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, | ||
271 | 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
272 | 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
273 | 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, | ||
274 | 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, | ||
275 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, | ||
276 | 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, | ||
277 | 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
278 | 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, | ||
279 | 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, | ||
280 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, | ||
281 | 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, | ||
282 | 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
283 | 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, | ||
284 | 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, | ||
285 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, | ||
286 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
287 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
288 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
289 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
290 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
291 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, | ||
292 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
293 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x99, 0x09, 0x00, | ||
294 | 0x00, 0xc9, 0xff, 0xd8, 0xff, 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, | ||
295 | 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, | ||
296 | 0x00, 0xf0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, | ||
297 | 0x54, 0x01, 0xab, 0xf6, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, | ||
298 | 0x42, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, | ||
299 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, | ||
300 | 0x33, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, | ||
301 | 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
302 | 0xbc, 0xfb, 0x00, 0xca, 0x79, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, | ||
303 | 0xc0, 0x2b, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, | ||
304 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, | ||
305 | 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, | ||
306 | 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
307 | 0x00, 0xaa, 0xa7, 0x00, 0xa9, 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, | ||
308 | 0x17, 0xc0, 0x17, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, | ||
309 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, | ||
310 | 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, | ||
311 | 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
312 | 0x96, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
313 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
314 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
315 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
316 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
317 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
318 | 0x00, 0x06, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
319 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
320 | 0x00, 0x00, 0x00, 0x9e, 0x09, 0x00, 0x00, 0xc9, 0xff, 0xd8, 0xff, | ||
321 | 0x00, 0x00, 0x00, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, 0x01, 0x10, | ||
322 | 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xd0, 0x00, | ||
323 | 0xd0, 0x00, 0xd0, 0x00, 0xd0, 0x00, 0x54, 0x01, 0xab, 0xf6, 0xc0, | ||
324 | 0x42, 0xc0, 0x42, 0xc0, 0x42, 0xc0, 0x42, 0x00, 0xcb, 0x00, 0xcb, | ||
325 | 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, 0xcb, 0x00, | ||
326 | 0xcb, 0x22, 0x01, 0x37, 0xa9, 0xc0, 0x33, 0xc0, 0x33, 0xc0, 0x33, | ||
327 | 0xc0, 0x33, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, | ||
328 | 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0x00, 0xbc, 0xfb, 0x00, 0xca, 0x79, | ||
329 | 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0x00, 0xb4, 0x00, | ||
330 | 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, 0x00, 0xb4, | ||
331 | 0x00, 0xb4, 0xd0, 0x00, 0x5d, 0x54, 0xc0, 0x21, 0xc0, 0x21, 0xc0, | ||
332 | 0x21, 0xc0, 0x21, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, | ||
333 | 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xa7, 0x00, 0xa9, | ||
334 | 0x3d, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0xc0, 0x17, 0x00, 0xa0, | ||
335 | 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, 0xa0, 0x00, | ||
336 | 0xa0, 0x00, 0xa0, 0x7a, 0x00, 0x06, 0x2c, 0xc0, 0x0d, 0xc0, 0x0d, | ||
337 | 0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, | ||
338 | 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00, | ||
339 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
340 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
341 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
342 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
343 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
344 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x80, 0x80, 0x00, | ||
345 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
346 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
347 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
348 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
349 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
350 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
351 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
352 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
353 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
354 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
355 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
356 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
357 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
358 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
359 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
360 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
361 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
362 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
363 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
364 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
365 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
366 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
367 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
368 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
369 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
370 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
371 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
372 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
373 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
374 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
375 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
376 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
377 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
378 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
379 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
380 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
381 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
382 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
383 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
384 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
385 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
386 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
387 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
388 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
389 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
390 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
391 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
392 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
393 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
394 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
395 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
396 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
397 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
398 | 0x00 }; | ||
399 | |||
400 | static const u8 default_cal_rssi[] = { | ||
401 | 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, | ||
402 | 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, | ||
403 | 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, | ||
404 | 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, | ||
405 | 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, | ||
406 | 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, | ||
407 | 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, | ||
408 | 0x00, 0x00, 0x00, 0x0a, 0x01, 0x72, 0xfe, 0x1a, 0x00, 0x00, 0x00, | ||
409 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||
410 | 0x00, 0x00, 0x00, 0x00, 0x00 }; | ||
411 | |||
412 | static void stlc45xx_tx_edcf(struct stlc45xx *stlc); | ||
413 | static void stlc45xx_tx_setup(struct stlc45xx *stlc); | ||
414 | static void stlc45xx_tx_scan(struct stlc45xx *stlc); | ||
415 | static void stlc45xx_tx_psm(struct stlc45xx *stlc, bool enable); | ||
416 | static int stlc45xx_tx_nullfunc(struct stlc45xx *stlc, bool powersave); | ||
417 | static int stlc45xx_tx_pspoll(struct stlc45xx *stlc, bool powersave); | ||
418 | |||
419 | static ssize_t stlc45xx_sysfs_show_cal_rssi(struct device *dev, | ||
420 | struct device_attribute *attr, | ||
421 | char *buf) | ||
422 | { | ||
423 | struct stlc45xx *stlc = dev_get_drvdata(dev); | ||
424 | ssize_t len; | ||
425 | |||
426 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
427 | |||
428 | len = PAGE_SIZE; | ||
429 | |||
430 | mutex_lock(&stlc->mutex); | ||
431 | |||
432 | if (stlc->cal_rssi) | ||
433 | hex_dump_to_buffer(stlc->cal_rssi, RSSI_CAL_ARRAY_LEN, 16, | ||
434 | 2, buf, len, 0); | ||
435 | mutex_unlock(&stlc->mutex); | ||
436 | |||
437 | len = strlen(buf); | ||
438 | |||
439 | return len; | ||
440 | } | ||
441 | |||
442 | static ssize_t stlc45xx_sysfs_store_cal_rssi(struct device *dev, | ||
443 | struct device_attribute *attr, | ||
444 | const char *buf, size_t count) | ||
445 | { | ||
446 | struct stlc45xx *stlc = dev_get_drvdata(dev); | ||
447 | |||
448 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
449 | |||
450 | mutex_lock(&stlc->mutex); | ||
451 | |||
452 | if (count != RSSI_CAL_ARRAY_LEN) { | ||
453 | stlc45xx_error("invalid cal_rssi length: %zu", count); | ||
454 | count = 0; | ||
455 | goto out_unlock; | ||
456 | } | ||
457 | |||
458 | kfree(stlc->cal_rssi); | ||
459 | |||
460 | stlc->cal_rssi = kmemdup(buf, RSSI_CAL_ARRAY_LEN, GFP_KERNEL); | ||
461 | |||
462 | if (!stlc->cal_rssi) { | ||
463 | stlc45xx_error("failed to allocate memory for cal_rssi"); | ||
464 | count = 0; | ||
465 | goto out_unlock; | ||
466 | } | ||
467 | |||
468 | out_unlock: | ||
469 | mutex_unlock(&stlc->mutex); | ||
470 | |||
471 | return count; | ||
472 | } | ||
473 | |||
474 | static ssize_t stlc45xx_sysfs_show_cal_channels(struct device *dev, | ||
475 | struct device_attribute *attr, | ||
476 | char *buf) | ||
477 | { | ||
478 | struct stlc45xx *stlc = dev_get_drvdata(dev); | ||
479 | ssize_t len; | ||
480 | |||
481 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
482 | |||
483 | len = PAGE_SIZE; | ||
484 | |||
485 | mutex_lock(&stlc->mutex); | ||
486 | |||
487 | if (stlc->cal_channels) | ||
488 | hex_dump_to_buffer(stlc->cal_channels, CHANNEL_CAL_ARRAY_LEN, | ||
489 | 16, 2, buf, len, 0); | ||
490 | |||
491 | mutex_unlock(&stlc->mutex); | ||
492 | |||
493 | len = strlen(buf); | ||
494 | |||
495 | return len; | ||
496 | } | ||
497 | |||
498 | static ssize_t stlc45xx_sysfs_store_cal_channels(struct device *dev, | ||
499 | struct device_attribute *attr, | ||
500 | const char *buf, size_t count) | ||
501 | { | ||
502 | struct stlc45xx *stlc = dev_get_drvdata(dev); | ||
503 | |||
504 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
505 | |||
506 | mutex_lock(&stlc->mutex); | ||
507 | |||
508 | if (count != CHANNEL_CAL_ARRAY_LEN) { | ||
509 | stlc45xx_error("invalid cal_channels size: %zu ", count); | ||
510 | count = 0; | ||
511 | goto out_unlock; | ||
512 | } | ||
513 | |||
514 | kfree(stlc->cal_channels); | ||
515 | |||
516 | stlc->cal_channels = kmemdup(buf, count, GFP_KERNEL); | ||
517 | |||
518 | if (!stlc->cal_channels) { | ||
519 | stlc45xx_error("failed to allocate memory for cal_channels"); | ||
520 | count = 0; | ||
521 | goto out_unlock; | ||
522 | } | ||
523 | |||
524 | out_unlock: | ||
525 | mutex_unlock(&stlc->mutex); | ||
526 | |||
527 | return count; | ||
528 | } | ||
529 | |||
530 | static ssize_t stlc45xx_sysfs_show_tx_buf(struct device *dev, | ||
531 | struct device_attribute *attr, | ||
532 | char *buf) | ||
533 | { | ||
534 | struct stlc45xx *stlc = dev_get_drvdata(dev); | ||
535 | struct txbuffer *entry; | ||
536 | ssize_t len = 0; | ||
537 | |||
538 | stlc45xx_debug(DEBUG_FUNC, "%s()", __func__); | ||
539 | |||
540 | mutex_lock(&stlc->mutex); | ||
541 | |||
542 | list_for_each_entry(entry, &stlc->tx_sent, tx_list) { | ||
543 | len += sprintf(buf + len, "0x%x: 0x%x-0x%x\n", | ||
544 | entry->handle, entry->start, | ||
545 | entry->end); | ||
546 | } | ||
547 | |||
548 | mutex_unlock(&stlc->mutex); | ||
549 | |||
550 | return len; | ||
551 | } | ||
552 | |||
553 | static DEVICE_ATTR(cal_rssi, S_IRUGO | S_IWUSR, | ||
554 | stlc45xx_sysfs_show_cal_rssi, | ||
555 | stlc45xx_sysfs_store_cal_rssi); | ||
556 | static DEVICE_ATTR(cal_channels, S_IRUGO | S_IWUSR, | ||
557 | stlc45xx_sysfs_show_cal_channels, | ||
558 | stlc45xx_sysfs_store_cal_channels); | ||
559 | static DEVICE_ATTR(tx_buf, S_IRUGO, stlc45xx_sysfs_show_tx_buf, NULL); | ||
560 | |||
561 | static void stlc45xx_spi_read(struct stlc45xx *stlc, unsigned long addr, | ||
562 | void *buf, size_t len) | ||
563 | { | ||
564 | struct spi_transfer t[2]; | ||
565 | struct spi_message m; | ||
566 | |||
567 | /* We first push the address */ | ||
568 | addr = (addr << 8) | ADDR_READ_BIT_15; | ||
569 | |||
570 | spi_message_init(&m); | ||
571 | memset(t, 0, sizeof(t)); | ||
572 | |||
573 | t[0].tx_buf = &addr; | ||
574 | t[0].len = 2; | ||
575 | spi_message_add_tail(&t[0], &m); | ||
576 | |||
577 | t[1].rx_buf = buf; | ||
578 | t[1].len = len; | ||
579 | spi_message_add_tail(&t[1], &m); | ||
580 | |||
581 | spi_sync(stlc->spi, &m); | ||
582 | } | ||
583 | |||
584 | |||
585 | static void stlc45xx_spi_write(struct stlc45xx *stlc, unsigned long addr, | ||
586 | void *buf, size_t len) | ||
587 | { | ||
588 | struct spi_transfer t[3]; | ||
589 | struct spi_message m; | ||
590 | u16 last_word; | ||
591 | |||
592 | /* We first push the address */ | ||
593 | addr = addr << 8; | ||
594 | |||
595 | spi_message_init(&m); | ||
596 | memset(t, 0, sizeof(t)); | ||
597 | |||
598 | t[0].tx_buf = &addr; | ||
599 | t[0].len = 2; | ||
600 | spi_message_add_tail(&t[0], &m); | ||
601 | |||
602 | t[1].tx_buf = buf; | ||
603 | t[1].len = len; | ||
604 | spi_message_add_tail(&t[1], &m); | ||
605 | |||
606 | if (len % 2) { | ||
607 | last_word = ((u8 *)buf)[len - 1]; | ||
608 | |||
609 | t[2].tx_buf = &last_word; | ||
610 | t[2].len = 2; | ||
611 | spi_message_add_tail(&t[2], &m); | ||
612 | } | ||
613 | |||
614 | spi_sync(stlc->spi, &m); | ||
615 | } | ||
616 | |||
617 | static u16 stlc45xx_read16(struct stlc45xx *stlc, unsigned long addr) | ||
618 | { | ||
619 | u16 val; | ||
620 | |||
621 | stlc45xx_spi_read(stlc, addr, &val, sizeof(val)); | ||
622 | |||
623 | return val; | ||
624 | } | ||
625 | |||
626 | static u32 stlc45xx_read32(struct stlc45xx *stlc, unsigned long addr) | ||
627 | { | ||
628 | u32 val; | ||
629 | |||
630 | stlc45xx_spi_read(stlc, addr, &val, sizeof(val)); | ||
631 | |||
632 | return val; | ||
633 | } | ||
634 | |||
635 | static void stlc45xx_write16(struct stlc45xx *stlc, unsigned long addr, u16 val) | ||
636 | { | ||
637 | stlc45xx_spi_write(stlc, addr, &val, sizeof(val)); | ||
638 | } | ||
639 | |||
640 | static void stlc45xx_write32(struct stlc45xx *stlc, unsigned long addr, u32 val) | ||
641 | { | ||
642 | stlc45xx_spi_write(stlc, addr, &val, sizeof(val)); | ||
643 | } | ||
644 | |||
645 | struct stlc45xx_spi_reg { | ||
646 | u16 address; | ||
647 | u16 length; | ||
648 | char *name; | ||
649 | }; | ||
650 | |||
651 | /* caller must hold tx_lock */ | ||
652 | static void stlc45xx_txbuffer_dump(struct stlc45xx *stlc) | ||
653 | { | ||
654 | struct txbuffer *txbuffer; | ||
655 | char *buf, *pos; | ||
656 | int buf_len, l, count; | ||
657 | |||
658 | if (!(DEBUG_LEVEL & DEBUG_TXBUFFER)) | ||
659 | return; | ||
660 | |||
661 | stlc45xx_debug(DEBUG_FUNC, "%s()", __func__); | ||
662 | |||
663 | buf_len = 500; | ||
664 | buf = kmalloc(buf_len, GFP_ATOMIC); | ||
665 | if (!buf) | ||
666 | return; | ||
667 | |||
668 | pos = buf; | ||
669 | count = 0; | ||
670 | |||
671 | list_for_each_entry(txbuffer, &stlc->txbuffer, buffer_list) { | ||
672 | l = snprintf(pos, buf_len, "0x%x-0x%x,", | ||
673 | txbuffer->start, txbuffer->end); | ||
674 | /* drop the null byte */ | ||
675 | pos += l; | ||
676 | buf_len -= l; | ||
677 | count++; | ||
678 | } | ||
679 | |||
680 | if (count == 0) | ||
681 | *pos = '\0'; | ||
682 | else | ||
683 | *--pos = '\0'; | ||
684 | |||
685 | stlc45xx_debug(DEBUG_TXBUFFER, "txbuffer: in buffer %d regions: %s", | ||
686 | count, buf); | ||
687 | |||
688 | kfree(buf); | ||
689 | } | ||
690 | |||
691 | /* caller must hold tx_lock */ | ||
692 | static int stlc45xx_txbuffer_find(struct stlc45xx *stlc, size_t len) | ||
693 | { | ||
694 | struct txbuffer *txbuffer; | ||
695 | int pos; | ||
696 | |||
697 | stlc45xx_debug(DEBUG_FUNC, "%s()", __func__); | ||
698 | |||
699 | pos = FIRMWARE_TXBUFFER_START; | ||
700 | |||
701 | if (list_empty(&stlc->txbuffer)) | ||
702 | goto out; | ||
703 | |||
704 | /* | ||
705 | * the entries in txbuffer must be in the same order as they are in | ||
706 | * the real buffer | ||
707 | */ | ||
708 | list_for_each_entry(txbuffer, &stlc->txbuffer, buffer_list) { | ||
709 | if (pos + len < txbuffer->start) | ||
710 | break; | ||
711 | pos = ALIGN(txbuffer->end + 1, 4); | ||
712 | } | ||
713 | |||
714 | if (pos + len > FIRMWARE_TXBUFFER_END) | ||
715 | /* not enough room */ | ||
716 | pos = -1; | ||
717 | |||
718 | stlc45xx_debug(DEBUG_TXBUFFER, "txbuffer: find %zu B: 0x%x", len, pos); | ||
719 | |||
720 | out: | ||
721 | return pos; | ||
722 | } | ||
723 | |||
724 | static int stlc45xx_txbuffer_add(struct stlc45xx *stlc, | ||
725 | struct txbuffer *txbuffer) | ||
726 | { | ||
727 | struct txbuffer *r, *prev = NULL; | ||
728 | |||
729 | if (list_empty(&stlc->txbuffer)) { | ||
730 | list_add(&txbuffer->buffer_list, &stlc->txbuffer); | ||
731 | return 0; | ||
732 | } | ||
733 | |||
734 | r = list_first_entry(&stlc->txbuffer, struct txbuffer, buffer_list); | ||
735 | |||
736 | if (txbuffer->start < r->start) { | ||
737 | /* add to the beginning of the list */ | ||
738 | list_add(&txbuffer->buffer_list, &stlc->txbuffer); | ||
739 | return 0; | ||
740 | } | ||
741 | |||
742 | prev = NULL; | ||
743 | list_for_each_entry(r, &stlc->txbuffer, buffer_list) { | ||
744 | /* skip first entry, we checked for that above */ | ||
745 | if (!prev) { | ||
746 | prev = r; | ||
747 | continue; | ||
748 | } | ||
749 | |||
750 | /* double-check overlaps */ | ||
751 | WARN_ON_ONCE(txbuffer->start >= r->start && | ||
752 | txbuffer->start <= r->end); | ||
753 | WARN_ON_ONCE(txbuffer->end >= r->start && | ||
754 | txbuffer->end <= r->end); | ||
755 | |||
756 | if (prev->end < txbuffer->start && | ||
757 | txbuffer->end < r->start) { | ||
758 | /* insert at this spot */ | ||
759 | list_add_tail(&txbuffer->buffer_list, &r->buffer_list); | ||
760 | return 0; | ||
761 | } | ||
762 | |||
763 | prev = r; | ||
764 | } | ||
765 | |||
766 | /* not found */ | ||
767 | list_add_tail(&txbuffer->buffer_list, &stlc->txbuffer); | ||
768 | |||
769 | return 0; | ||
770 | |||
771 | } | ||
772 | |||
773 | /* caller must hold tx_lock */ | ||
774 | static struct txbuffer *stlc45xx_txbuffer_alloc(struct stlc45xx *stlc, | ||
775 | size_t frame_len) | ||
776 | { | ||
777 | struct txbuffer *entry = NULL; | ||
778 | size_t len; | ||
779 | int pos; | ||
780 | |||
781 | stlc45xx_debug(DEBUG_FUNC, "%s()", __func__); | ||
782 | |||
783 | len = FIRMWARE_TXBUFFER_HEADER + frame_len + FIRMWARE_TXBUFFER_TRAILER; | ||
784 | pos = stlc45xx_txbuffer_find(stlc, len); | ||
785 | |||
786 | if (pos < 0) | ||
787 | return NULL; | ||
788 | |||
789 | WARN_ON_ONCE(pos + len > FIRMWARE_TXBUFFER_END); | ||
790 | WARN_ON_ONCE(pos < FIRMWARE_TXBUFFER_START); | ||
791 | |||
792 | entry = kmalloc(sizeof(*entry), GFP_ATOMIC); | ||
793 | entry->start = pos; | ||
794 | entry->frame_start = pos + FIRMWARE_TXBUFFER_HEADER; | ||
795 | entry->end = entry->start + len - 1; | ||
796 | |||
797 | stlc45xx_debug(DEBUG_TXBUFFER, "txbuffer: allocated 0x%x-0x%x", | ||
798 | entry->start, entry->end); | ||
799 | |||
800 | stlc45xx_txbuffer_add(stlc, entry); | ||
801 | |||
802 | stlc45xx_txbuffer_dump(stlc); | ||
803 | |||
804 | return entry; | ||
805 | } | ||
806 | |||
807 | /* caller must hold tx_lock */ | ||
808 | static void stlc45xx_txbuffer_free(struct stlc45xx *stlc, | ||
809 | struct txbuffer *txbuffer) | ||
810 | { | ||
811 | stlc45xx_debug(DEBUG_FUNC, "%s()", __func__); | ||
812 | |||
813 | stlc45xx_debug(DEBUG_TXBUFFER, "txbuffer: freed 0x%x-0x%x", | ||
814 | txbuffer->start, txbuffer->end); | ||
815 | |||
816 | list_del(&txbuffer->buffer_list); | ||
817 | kfree(txbuffer); | ||
818 | } | ||
819 | |||
820 | |||
821 | static int stlc45xx_wait_bit(struct stlc45xx *stlc, u16 reg, u32 mask, | ||
822 | u32 expected) | ||
823 | { | ||
824 | int i; | ||
825 | char buffer[4]; | ||
826 | |||
827 | for (i = 0; i < 2000; i++) { | ||
828 | stlc45xx_spi_read(stlc, reg, buffer, sizeof(buffer)); | ||
829 | if (((*(u32 *)buffer) & mask) == expected) | ||
830 | return 1; | ||
831 | msleep(1); | ||
832 | } | ||
833 | |||
834 | return 0; | ||
835 | } | ||
836 | |||
837 | static int stlc45xx_request_firmware(struct stlc45xx *stlc) | ||
838 | { | ||
839 | const struct firmware *fw; | ||
840 | int ret; | ||
841 | |||
842 | /* FIXME: should driver use it's own struct device? */ | ||
843 | ret = request_firmware(&fw, "3826.arm", &stlc->spi->dev); | ||
844 | |||
845 | if (ret < 0) { | ||
846 | stlc45xx_error("request_firmware() failed: %d", ret); | ||
847 | return ret; | ||
848 | } | ||
849 | |||
850 | if (fw->size % 4) { | ||
851 | stlc45xx_error("firmware size is not multiple of 32bit: %zu", | ||
852 | fw->size); | ||
853 | return -EILSEQ; /* Illegal byte sequence */; | ||
854 | } | ||
855 | |||
856 | if (fw->size < 1000) { | ||
857 | stlc45xx_error("firmware is too small: %zu", fw->size); | ||
858 | return -EILSEQ; | ||
859 | } | ||
860 | |||
861 | stlc->fw = kmemdup(fw->data, fw->size, GFP_KERNEL); | ||
862 | if (!stlc->fw) { | ||
863 | stlc45xx_error("could not allocate memory for firmware"); | ||
864 | return -ENOMEM; | ||
865 | } | ||
866 | |||
867 | stlc->fw_len = fw->size; | ||
868 | |||
869 | release_firmware(fw); | ||
870 | |||
871 | return 0; | ||
872 | } | ||
873 | |||
874 | static int stlc45xx_upload_firmware(struct stlc45xx *stlc) | ||
875 | { | ||
876 | struct s_dma_regs dma_regs; | ||
877 | unsigned long fw_len, fw_addr; | ||
878 | long _fw_len; | ||
879 | int ret; | ||
880 | |||
881 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
882 | |||
883 | if (!stlc->fw) { | ||
884 | ret = stlc45xx_request_firmware(stlc); | ||
885 | if (ret < 0) | ||
886 | return ret; | ||
887 | } | ||
888 | |||
889 | /* stop the device */ | ||
890 | stlc45xx_write16(stlc, SPI_ADRS_DEV_CTRL_STAT, | ||
891 | SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_HOST_RESET | ||
892 | | SPI_CTRL_STAT_START_HALTED); | ||
893 | |||
894 | msleep(TARGET_BOOT_SLEEP); | ||
895 | |||
896 | stlc45xx_write16(stlc, SPI_ADRS_DEV_CTRL_STAT, | ||
897 | SPI_CTRL_STAT_HOST_OVERRIDE | ||
898 | | SPI_CTRL_STAT_START_HALTED); | ||
899 | |||
900 | msleep(TARGET_BOOT_SLEEP); | ||
901 | |||
902 | fw_addr = FIRMWARE_ADDRESS; | ||
903 | fw_len = stlc->fw_len; | ||
904 | |||
905 | while (fw_len > 0) { | ||
906 | _fw_len = (fw_len > SPI_MAX_PACKET_SIZE) | ||
907 | ? SPI_MAX_PACKET_SIZE : fw_len; | ||
908 | dma_regs.cmd = SPI_DMA_WRITE_CTRL_ENABLE; | ||
909 | dma_regs.len = cpu_to_le16(_fw_len); | ||
910 | dma_regs.addr = cpu_to_le32(fw_addr); | ||
911 | |||
912 | fw_len -= _fw_len; | ||
913 | fw_addr += _fw_len; | ||
914 | |||
915 | stlc45xx_write16(stlc, SPI_ADRS_DMA_WRITE_CTRL, dma_regs.cmd); | ||
916 | |||
917 | if (stlc45xx_wait_bit(stlc, SPI_ADRS_DMA_WRITE_CTRL, | ||
918 | HOST_ALLOWED, HOST_ALLOWED) == 0) { | ||
919 | stlc45xx_error("fw_upload not allowed to DMA write"); | ||
920 | return -EAGAIN; | ||
921 | } | ||
922 | |||
923 | stlc45xx_write16(stlc, SPI_ADRS_DMA_WRITE_LEN, dma_regs.len); | ||
924 | stlc45xx_write32(stlc, SPI_ADRS_DMA_WRITE_BASE, dma_regs.addr); | ||
925 | |||
926 | stlc45xx_spi_write(stlc, SPI_ADRS_DMA_DATA, stlc->fw, _fw_len); | ||
927 | |||
928 | /* FIXME: I think this doesn't work if firmware is large, | ||
929 | * this loop goes to second round. fw->data is not | ||
930 | * increased at all! */ | ||
931 | } | ||
932 | |||
933 | BUG_ON(fw_len != 0); | ||
934 | |||
935 | /* enable host interrupts */ | ||
936 | stlc45xx_write32(stlc, SPI_ADRS_HOST_INT_EN, SPI_HOST_INTS_DEFAULT); | ||
937 | |||
938 | /* boot the device */ | ||
939 | stlc45xx_write16(stlc, SPI_ADRS_DEV_CTRL_STAT, | ||
940 | SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_HOST_RESET | ||
941 | | SPI_CTRL_STAT_RAM_BOOT); | ||
942 | |||
943 | msleep(TARGET_BOOT_SLEEP); | ||
944 | |||
945 | stlc45xx_write16(stlc, SPI_ADRS_DEV_CTRL_STAT, | ||
946 | SPI_CTRL_STAT_HOST_OVERRIDE | SPI_CTRL_STAT_RAM_BOOT); | ||
947 | msleep(TARGET_BOOT_SLEEP); | ||
948 | |||
949 | return 0; | ||
950 | } | ||
951 | |||
952 | /* caller must hold tx_lock */ | ||
953 | static void stlc45xx_check_txsent(struct stlc45xx *stlc) | ||
954 | { | ||
955 | struct txbuffer *entry, *n; | ||
956 | |||
957 | list_for_each_entry_safe(entry, n, &stlc->tx_sent, tx_list) { | ||
958 | if (time_after(jiffies, entry->lifetime)) { | ||
959 | if (net_ratelimit()) | ||
960 | stlc45xx_warning("frame 0x%x lifetime exceeded", | ||
961 | entry->start); | ||
962 | list_del(&entry->tx_list); | ||
963 | skb_pull(entry->skb, entry->header_len); | ||
964 | ieee80211_tx_status(stlc->hw, entry->skb); | ||
965 | stlc45xx_txbuffer_free(stlc, entry); | ||
966 | } | ||
967 | } | ||
968 | } | ||
969 | |||
970 | static void stlc45xx_power_off(struct stlc45xx *stlc) | ||
971 | { | ||
972 | disable_irq(gpio_to_irq(stlc45xx_gpio_irq)); | ||
973 | gpio_set_value(stlc45xx_gpio_power, 0); | ||
974 | } | ||
975 | |||
976 | static void stlc45xx_power_on(struct stlc45xx *stlc) | ||
977 | { | ||
978 | gpio_set_value(stlc45xx_gpio_power, 1); | ||
979 | enable_irq(gpio_to_irq(stlc45xx_gpio_irq)); | ||
980 | |||
981 | /* | ||
982 | * need to wait a while before device can be accessed, the length | ||
983 | * is just a guess | ||
984 | */ | ||
985 | msleep(10); | ||
986 | } | ||
987 | |||
988 | /* caller must hold tx_lock */ | ||
989 | static void stlc45xx_flush_queues(struct stlc45xx *stlc) | ||
990 | { | ||
991 | struct txbuffer *entry; | ||
992 | |||
993 | while (!list_empty(&stlc->tx_sent)) { | ||
994 | entry = list_first_entry(&stlc->tx_sent, | ||
995 | struct txbuffer, tx_list); | ||
996 | list_del(&entry->tx_list); | ||
997 | dev_kfree_skb(entry->skb); | ||
998 | stlc45xx_txbuffer_free(stlc, entry); | ||
999 | } | ||
1000 | |||
1001 | WARN_ON(!list_empty(&stlc->tx_sent)); | ||
1002 | |||
1003 | while (!list_empty(&stlc->tx_pending)) { | ||
1004 | entry = list_first_entry(&stlc->tx_pending, | ||
1005 | struct txbuffer, tx_list); | ||
1006 | list_del(&entry->tx_list); | ||
1007 | dev_kfree_skb(entry->skb); | ||
1008 | stlc45xx_txbuffer_free(stlc, entry); | ||
1009 | } | ||
1010 | |||
1011 | WARN_ON(!list_empty(&stlc->tx_pending)); | ||
1012 | WARN_ON(!list_empty(&stlc->txbuffer)); | ||
1013 | } | ||
1014 | |||
1015 | static void stlc45xx_work_reset(struct work_struct *work) | ||
1016 | { | ||
1017 | struct stlc45xx *stlc = container_of(work, struct stlc45xx, | ||
1018 | work_reset); | ||
1019 | |||
1020 | mutex_lock(&stlc->mutex); | ||
1021 | |||
1022 | if (stlc->fw_state != FW_STATE_RESET) | ||
1023 | goto out; | ||
1024 | |||
1025 | stlc45xx_power_off(stlc); | ||
1026 | |||
1027 | mutex_unlock(&stlc->mutex); | ||
1028 | |||
1029 | /* wait that all work_structs have finished, we can't hold | ||
1030 | * stlc->mutex to avoid deadlock */ | ||
1031 | cancel_work_sync(&stlc->work); | ||
1032 | |||
1033 | /* FIXME: find out good value to wait for chip power down */ | ||
1034 | msleep(100); | ||
1035 | |||
1036 | mutex_lock(&stlc->mutex); | ||
1037 | |||
1038 | /* FIXME: we should gracefully handle if the state has changed | ||
1039 | * after re-acquiring mutex */ | ||
1040 | WARN_ON(stlc->fw_state != FW_STATE_RESET); | ||
1041 | |||
1042 | spin_lock_bh(&stlc->tx_lock); | ||
1043 | stlc45xx_flush_queues(stlc); | ||
1044 | spin_unlock_bh(&stlc->tx_lock); | ||
1045 | |||
1046 | stlc->fw_state = FW_STATE_RESETTING; | ||
1047 | |||
1048 | stlc45xx_power_on(stlc); | ||
1049 | stlc45xx_upload_firmware(stlc); | ||
1050 | |||
1051 | out: | ||
1052 | mutex_unlock(&stlc->mutex); | ||
1053 | } | ||
1054 | |||
1055 | /* caller must hold mutex */ | ||
1056 | static void stlc45xx_reset(struct stlc45xx *stlc) | ||
1057 | { | ||
1058 | stlc45xx_warning("resetting firmware"); | ||
1059 | stlc->fw_state = FW_STATE_RESET; | ||
1060 | ieee80211_stop_queues(stlc->hw); | ||
1061 | queue_work(stlc->hw->workqueue, &stlc->work_reset); | ||
1062 | } | ||
1063 | |||
1064 | static void stlc45xx_work_tx_timeout(struct work_struct *work) | ||
1065 | { | ||
1066 | struct stlc45xx *stlc = container_of(work, struct stlc45xx, | ||
1067 | work_tx_timeout.work); | ||
1068 | |||
1069 | stlc45xx_warning("tx timeout"); | ||
1070 | |||
1071 | mutex_lock(&stlc->mutex); | ||
1072 | |||
1073 | if (stlc->fw_state != FW_STATE_READY) | ||
1074 | goto out; | ||
1075 | |||
1076 | stlc45xx_reset(stlc); | ||
1077 | |||
1078 | out: | ||
1079 | mutex_unlock(&stlc->mutex); | ||
1080 | } | ||
1081 | |||
1082 | static void stlc45xx_int_ack(struct stlc45xx *stlc, u32 val) | ||
1083 | { | ||
1084 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1085 | |||
1086 | stlc45xx_write32(stlc, SPI_ADRS_HOST_INT_ACK, val); | ||
1087 | } | ||
1088 | |||
1089 | static void stlc45xx_wakeup(struct stlc45xx *stlc) | ||
1090 | { | ||
1091 | unsigned long timeout; | ||
1092 | u32 ints; | ||
1093 | |||
1094 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1095 | |||
1096 | /* wake the chip */ | ||
1097 | stlc45xx_write32(stlc, SPI_ADRS_ARM_INTERRUPTS, SPI_TARGET_INT_WAKEUP); | ||
1098 | |||
1099 | /* And wait for the READY interrupt */ | ||
1100 | timeout = jiffies + HZ; | ||
1101 | |||
1102 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1103 | while (!(ints & SPI_HOST_INT_READY)) { | ||
1104 | if (time_after(jiffies, timeout)) | ||
1105 | goto out; | ||
1106 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1107 | } | ||
1108 | |||
1109 | stlc45xx_int_ack(stlc, SPI_HOST_INT_READY); | ||
1110 | |||
1111 | out: | ||
1112 | return; | ||
1113 | } | ||
1114 | |||
1115 | static void stlc45xx_sleep(struct stlc45xx *stlc) | ||
1116 | { | ||
1117 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1118 | |||
1119 | stlc45xx_write32(stlc, SPI_ADRS_ARM_INTERRUPTS, SPI_TARGET_INT_SLEEP); | ||
1120 | } | ||
1121 | |||
1122 | static void stlc45xx_int_ready(struct stlc45xx *stlc) | ||
1123 | { | ||
1124 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1125 | |||
1126 | stlc45xx_write32(stlc, SPI_ADRS_HOST_INT_EN, | ||
1127 | SPI_HOST_INT_UPDATE | SPI_HOST_INT_SW_UPDATE); | ||
1128 | |||
1129 | switch (stlc->fw_state) { | ||
1130 | case FW_STATE_BOOTING: | ||
1131 | stlc->fw_state = FW_STATE_READY; | ||
1132 | complete(&stlc->fw_comp); | ||
1133 | break; | ||
1134 | case FW_STATE_RESETTING: | ||
1135 | stlc->fw_state = FW_STATE_READY; | ||
1136 | |||
1137 | stlc45xx_tx_scan(stlc); | ||
1138 | stlc45xx_tx_setup(stlc); | ||
1139 | stlc45xx_tx_edcf(stlc); | ||
1140 | |||
1141 | ieee80211_wake_queues(stlc->hw); | ||
1142 | break; | ||
1143 | default: | ||
1144 | break; | ||
1145 | } | ||
1146 | } | ||
1147 | |||
1148 | static int stlc45xx_rx_txack(struct stlc45xx *stlc, struct sk_buff *skb) | ||
1149 | { | ||
1150 | struct ieee80211_tx_info *info; | ||
1151 | struct s_lm_control *control; | ||
1152 | struct s_lmo_tx *tx; | ||
1153 | struct txbuffer *entry; | ||
1154 | int found = 0; | ||
1155 | |||
1156 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1157 | |||
1158 | control = (struct s_lm_control *) skb->data; | ||
1159 | tx = (struct s_lmo_tx *) (control + 1); | ||
1160 | |||
1161 | if (list_empty(&stlc->tx_sent)) { | ||
1162 | if (net_ratelimit()) | ||
1163 | stlc45xx_warning("no frames waiting for " | ||
1164 | "acknowledgement"); | ||
1165 | return -1; | ||
1166 | } | ||
1167 | |||
1168 | list_for_each_entry(entry, &stlc->tx_sent, tx_list) { | ||
1169 | if (control->handle == entry->handle) { | ||
1170 | found = 1; | ||
1171 | break; | ||
1172 | } | ||
1173 | } | ||
1174 | |||
1175 | if (!found) { | ||
1176 | if (net_ratelimit()) | ||
1177 | stlc45xx_warning("couldn't find frame for tx ack 0x%x", | ||
1178 | control->handle); | ||
1179 | return -1; | ||
1180 | } | ||
1181 | |||
1182 | stlc45xx_debug(DEBUG_TX, "TX ACK 0x%x", entry->handle); | ||
1183 | |||
1184 | if (entry->status_needed) { | ||
1185 | info = IEEE80211_SKB_CB(entry->skb); | ||
1186 | |||
1187 | if (!(tx->flags & LM_TX_FAILED)) { | ||
1188 | /* frame was acked */ | ||
1189 | info->flags |= IEEE80211_TX_STAT_ACK; | ||
1190 | info->status.ack_signal = tx->rcpi / 2 - 110; | ||
1191 | } | ||
1192 | |||
1193 | skb_pull(entry->skb, entry->header_len); | ||
1194 | |||
1195 | ieee80211_tx_status(stlc->hw, entry->skb); | ||
1196 | } | ||
1197 | |||
1198 | list_del(&entry->tx_list); | ||
1199 | |||
1200 | stlc45xx_check_txsent(stlc); | ||
1201 | if (list_empty(&stlc->tx_sent)) | ||
1202 | /* there are no pending frames, we can stop the tx timeout | ||
1203 | * timer */ | ||
1204 | cancel_delayed_work(&stlc->work_tx_timeout); | ||
1205 | |||
1206 | spin_lock_bh(&stlc->tx_lock); | ||
1207 | |||
1208 | stlc45xx_txbuffer_free(stlc, entry); | ||
1209 | |||
1210 | if (stlc->tx_queue_stopped && | ||
1211 | stlc45xx_txbuffer_find(stlc, MAX_FRAME_LEN) != -1) { | ||
1212 | stlc45xx_debug(DEBUG_QUEUE, "room in tx buffer, waking queues"); | ||
1213 | ieee80211_wake_queues(stlc->hw); | ||
1214 | stlc->tx_queue_stopped = 0; | ||
1215 | } | ||
1216 | |||
1217 | spin_unlock_bh(&stlc->tx_lock); | ||
1218 | |||
1219 | return 0; | ||
1220 | } | ||
1221 | |||
1222 | static int stlc45xx_rx_control(struct stlc45xx *stlc, struct sk_buff *skb) | ||
1223 | { | ||
1224 | struct s_lm_control *control; | ||
1225 | int ret = 0; | ||
1226 | |||
1227 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1228 | |||
1229 | control = (struct s_lm_control *) skb->data; | ||
1230 | |||
1231 | switch (control->oid) { | ||
1232 | case LM_OID_TX: | ||
1233 | ret = stlc45xx_rx_txack(stlc, skb); | ||
1234 | break; | ||
1235 | case LM_OID_SETUP: | ||
1236 | case LM_OID_SCAN: | ||
1237 | case LM_OID_TRAP: | ||
1238 | case LM_OID_EDCF: | ||
1239 | case LM_OID_KEYCACHE: | ||
1240 | case LM_OID_PSM: | ||
1241 | case LM_OID_STATS: | ||
1242 | case LM_OID_LED: | ||
1243 | default: | ||
1244 | stlc45xx_warning("unhandled rx control oid %d\n", | ||
1245 | control->oid); | ||
1246 | break; | ||
1247 | } | ||
1248 | |||
1249 | dev_kfree_skb(skb); | ||
1250 | |||
1251 | return ret; | ||
1252 | } | ||
1253 | |||
1254 | /* copied from mac80211 */ | ||
1255 | static void stlc45xx_parse_elems(u8 *start, size_t len, | ||
1256 | struct stlc45xx_ie_tim **tim, | ||
1257 | size_t *tim_len) | ||
1258 | { | ||
1259 | size_t left = len; | ||
1260 | u8 *pos = start; | ||
1261 | |||
1262 | while (left >= 2) { | ||
1263 | u8 id, elen; | ||
1264 | |||
1265 | id = *pos++; | ||
1266 | elen = *pos++; | ||
1267 | left -= 2; | ||
1268 | |||
1269 | if (elen > left) | ||
1270 | return; | ||
1271 | |||
1272 | switch (id) { | ||
1273 | case WLAN_EID_TIM: | ||
1274 | *tim = (struct stlc45xx_ie_tim *) pos; | ||
1275 | *tim_len = elen; | ||
1276 | break; | ||
1277 | default: | ||
1278 | break; | ||
1279 | } | ||
1280 | |||
1281 | left -= elen; | ||
1282 | pos += elen; | ||
1283 | } | ||
1284 | } | ||
1285 | |||
1286 | /* | ||
1287 | * mac80211 doesn't have support for asking frames with PS-Poll, so let's | ||
1288 | * implement in the driver for now. We have to add support to mac80211 | ||
1289 | * later. | ||
1290 | */ | ||
1291 | static int stlc45xx_check_more_data(struct stlc45xx *stlc, struct sk_buff *skb) | ||
1292 | { | ||
1293 | struct s_lm_data_in *data = (struct s_lm_data_in *) skb->data; | ||
1294 | struct ieee80211_hdr *hdr; | ||
1295 | size_t len; | ||
1296 | u16 fc; | ||
1297 | |||
1298 | hdr = (void *) skb->data + sizeof(*data); | ||
1299 | len = skb->len - sizeof(*data); | ||
1300 | |||
1301 | /* minimum frame length is the null frame length 24 bytes */ | ||
1302 | if (len < 24) { | ||
1303 | stlc45xx_warning("invalid frame length when checking for " | ||
1304 | "more data"); | ||
1305 | return -EINVAL; | ||
1306 | } | ||
1307 | |||
1308 | fc = le16_to_cpu(hdr->frame_control); | ||
1309 | if (!(fc & IEEE80211_FCTL_FROMDS)) | ||
1310 | /* this is not from DS */ | ||
1311 | return 0; | ||
1312 | |||
1313 | if (compare_ether_addr(hdr->addr1, stlc->mac_addr) != 0) | ||
1314 | /* the frame was not for us */ | ||
1315 | return 0; | ||
1316 | |||
1317 | if (!(fc & IEEE80211_FCTL_MOREDATA)) { | ||
1318 | /* AP has no more frames buffered for us */ | ||
1319 | stlc45xx_debug(DEBUG_PSM, "all buffered frames retrieved"); | ||
1320 | stlc->pspolling = false; | ||
1321 | return 0; | ||
1322 | } | ||
1323 | |||
1324 | /* MOREDATA bit is set, let's ask for a new frame from the AP */ | ||
1325 | stlc45xx_tx_pspoll(stlc, stlc->psm); | ||
1326 | |||
1327 | return 0; | ||
1328 | } | ||
1329 | |||
1330 | /* | ||
1331 | * mac80211 cannot read TIM from beacons, so let's add a hack to the | ||
1332 | * driver. We have to add support to mac80211 later. | ||
1333 | */ | ||
1334 | static int stlc45xx_rx_data_beacon(struct stlc45xx *stlc, struct sk_buff *skb) | ||
1335 | { | ||
1336 | struct s_lm_data_in *data = (struct s_lm_data_in *) skb->data; | ||
1337 | size_t len = skb->len, tim_len = 0, baselen, pvbmap_len; | ||
1338 | struct ieee80211_mgmt *mgmt; | ||
1339 | struct stlc45xx_ie_tim *tim = NULL; | ||
1340 | int bmap_offset, index, aid_bit; | ||
1341 | |||
1342 | mgmt = (void *) skb->data + sizeof(*data); | ||
1343 | |||
1344 | baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt; | ||
1345 | if (baselen > len) { | ||
1346 | stlc45xx_warning("invalid baselen in beacon"); | ||
1347 | return -EINVAL; | ||
1348 | } | ||
1349 | |||
1350 | stlc45xx_parse_elems(mgmt->u.beacon.variable, len - baselen, &tim, | ||
1351 | &tim_len); | ||
1352 | |||
1353 | if (!tim) { | ||
1354 | stlc45xx_warning("didn't find tim from a beacon"); | ||
1355 | return -EINVAL; | ||
1356 | } | ||
1357 | |||
1358 | bmap_offset = tim->bmap_control & 0xfe; | ||
1359 | index = stlc->aid / 8 - bmap_offset; | ||
1360 | |||
1361 | pvbmap_len = tim_len - 3; | ||
1362 | if (index > pvbmap_len) | ||
1363 | return -EINVAL; | ||
1364 | |||
1365 | aid_bit = !!(tim->pvbmap[index] & (1 << stlc->aid % 8)); | ||
1366 | |||
1367 | stlc45xx_debug(DEBUG_PSM, "fc 0x%x duration %d seq %d dtim %u " | ||
1368 | "bmap_control 0x%x aid_bit %d", | ||
1369 | mgmt->frame_control, mgmt->duration, mgmt->seq_ctrl >> 4, | ||
1370 | tim->dtim_count, tim->bmap_control, aid_bit); | ||
1371 | |||
1372 | if (!aid_bit) | ||
1373 | return 0; | ||
1374 | |||
1375 | stlc->pspolling = true; | ||
1376 | stlc45xx_tx_pspoll(stlc, stlc->psm); | ||
1377 | |||
1378 | return 0; | ||
1379 | } | ||
1380 | |||
1381 | static int stlc45xx_rx_data(struct stlc45xx *stlc, struct sk_buff *skb) | ||
1382 | { | ||
1383 | struct ieee80211_rx_status status; | ||
1384 | struct s_lm_data_in *data = (struct s_lm_data_in *) skb->data; | ||
1385 | int align = 0; | ||
1386 | u8 *p, align_len; | ||
1387 | u16 len; | ||
1388 | |||
1389 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1390 | |||
1391 | if (stlc->psm) { | ||
1392 | if (data->flags & LM_IN_BEACON) | ||
1393 | stlc45xx_rx_data_beacon(stlc, skb); | ||
1394 | else if (stlc->pspolling && (data->flags & LM_IN_DATA)) | ||
1395 | stlc45xx_check_more_data(stlc, skb); | ||
1396 | } | ||
1397 | |||
1398 | memset(&status, 0, sizeof(status)); | ||
1399 | |||
1400 | status.freq = data->frequency; | ||
1401 | status.signal = data->rcpi / 2 - 110; | ||
1402 | |||
1403 | /* let's assume that maximum rcpi value is 140 (= 35 dBm) */ | ||
1404 | status.qual = data->rcpi * 100 / 140; | ||
1405 | |||
1406 | status.band = IEEE80211_BAND_2GHZ; | ||
1407 | |||
1408 | /* | ||
1409 | * FIXME: this gives warning from __ieee80211_rx() | ||
1410 | * | ||
1411 | * status.rate_idx = data->rate; | ||
1412 | */ | ||
1413 | |||
1414 | len = data->length; | ||
1415 | |||
1416 | if (data->flags & LM_FLAG_ALIGN) | ||
1417 | align = 1; | ||
1418 | |||
1419 | skb_pull(skb, sizeof(*data)); | ||
1420 | |||
1421 | if (align) { | ||
1422 | p = skb->data; | ||
1423 | align_len = *p; | ||
1424 | skb_pull(skb, align_len); | ||
1425 | } | ||
1426 | |||
1427 | skb_trim(skb, len); | ||
1428 | |||
1429 | stlc45xx_debug(DEBUG_RX, "rx data 0x%p %d B", skb->data, skb->len); | ||
1430 | stlc45xx_dump(DEBUG_RX_CONTENT, skb->data, skb->len); | ||
1431 | |||
1432 | memcpy(IEEE80211_SKB_RXCB(skb), &status, sizeof(status)); | ||
1433 | ieee80211_rx(stlc->hw, skb); | ||
1434 | |||
1435 | return 0; | ||
1436 | } | ||
1437 | |||
1438 | |||
1439 | |||
1440 | static int stlc45xx_rx(struct stlc45xx *stlc) | ||
1441 | { | ||
1442 | struct s_lm_control *control; | ||
1443 | struct sk_buff *skb; | ||
1444 | int ret; | ||
1445 | u16 len; | ||
1446 | |||
1447 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1448 | |||
1449 | stlc45xx_wakeup(stlc); | ||
1450 | |||
1451 | /* dummy read to flush SPI DMA controller bug */ | ||
1452 | stlc45xx_read16(stlc, SPI_ADRS_GEN_PURP_1); | ||
1453 | |||
1454 | len = stlc45xx_read16(stlc, SPI_ADRS_DMA_DATA); | ||
1455 | |||
1456 | if (len == 0) { | ||
1457 | stlc45xx_warning("rx request of zero bytes"); | ||
1458 | return 0; | ||
1459 | } | ||
1460 | |||
1461 | skb = dev_alloc_skb(len); | ||
1462 | if (!skb) { | ||
1463 | stlc45xx_warning("could not alloc skb"); | ||
1464 | return 0; | ||
1465 | } | ||
1466 | |||
1467 | stlc45xx_spi_read(stlc, SPI_ADRS_DMA_DATA, skb_put(skb, len), len); | ||
1468 | |||
1469 | stlc45xx_sleep(stlc); | ||
1470 | |||
1471 | stlc45xx_debug(DEBUG_RX, "rx frame 0x%p %d B", skb->data, skb->len); | ||
1472 | stlc45xx_dump(DEBUG_RX_CONTENT, skb->data, skb->len); | ||
1473 | |||
1474 | control = (struct s_lm_control *) skb->data; | ||
1475 | |||
1476 | if (control->flags & LM_FLAG_CONTROL) | ||
1477 | ret = stlc45xx_rx_control(stlc, skb); | ||
1478 | else | ||
1479 | ret = stlc45xx_rx_data(stlc, skb); | ||
1480 | |||
1481 | return ret; | ||
1482 | } | ||
1483 | |||
1484 | |||
1485 | static irqreturn_t stlc45xx_interrupt(int irq, void *config) | ||
1486 | { | ||
1487 | struct spi_device *spi = config; | ||
1488 | struct stlc45xx *stlc = dev_get_drvdata(&spi->dev); | ||
1489 | |||
1490 | stlc45xx_debug(DEBUG_IRQ, "IRQ"); | ||
1491 | |||
1492 | queue_work(stlc->hw->workqueue, &stlc->work); | ||
1493 | |||
1494 | return IRQ_HANDLED; | ||
1495 | } | ||
1496 | |||
1497 | static int stlc45xx_tx_frame(struct stlc45xx *stlc, u32 address, | ||
1498 | void *buf, size_t len) | ||
1499 | { | ||
1500 | struct s_dma_regs dma_regs; | ||
1501 | unsigned long timeout; | ||
1502 | int ret = 0; | ||
1503 | u32 ints; | ||
1504 | |||
1505 | stlc->tx_frames++; | ||
1506 | |||
1507 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1508 | |||
1509 | stlc45xx_debug(DEBUG_TX, "tx frame 0x%p %zu B", buf, len); | ||
1510 | stlc45xx_dump(DEBUG_TX_CONTENT, buf, len); | ||
1511 | |||
1512 | stlc45xx_wakeup(stlc); | ||
1513 | |||
1514 | dma_regs.cmd = SPI_DMA_WRITE_CTRL_ENABLE; | ||
1515 | dma_regs.len = cpu_to_le16(len); | ||
1516 | dma_regs.addr = cpu_to_le32(address); | ||
1517 | |||
1518 | stlc45xx_spi_write(stlc, SPI_ADRS_DMA_WRITE_CTRL, &dma_regs, | ||
1519 | sizeof(dma_regs)); | ||
1520 | |||
1521 | stlc45xx_spi_write(stlc, SPI_ADRS_DMA_DATA, buf, len); | ||
1522 | |||
1523 | timeout = jiffies + 2 * HZ; | ||
1524 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1525 | while (!(ints & SPI_HOST_INT_WR_READY)) { | ||
1526 | if (time_after(jiffies, timeout)) { | ||
1527 | stlc45xx_warning("WR_READY timeout"); | ||
1528 | ret = -1; | ||
1529 | goto out; | ||
1530 | } | ||
1531 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1532 | } | ||
1533 | |||
1534 | stlc45xx_int_ack(stlc, SPI_HOST_INT_WR_READY); | ||
1535 | |||
1536 | stlc45xx_sleep(stlc); | ||
1537 | |||
1538 | out: | ||
1539 | return ret; | ||
1540 | } | ||
1541 | |||
1542 | static int stlc45xx_wq_tx(struct stlc45xx *stlc) | ||
1543 | { | ||
1544 | struct txbuffer *entry; | ||
1545 | int ret = 0; | ||
1546 | |||
1547 | spin_lock_bh(&stlc->tx_lock); | ||
1548 | |||
1549 | while (!list_empty(&stlc->tx_pending)) { | ||
1550 | entry = list_entry(stlc->tx_pending.next, | ||
1551 | struct txbuffer, tx_list); | ||
1552 | |||
1553 | list_del_init(&entry->tx_list); | ||
1554 | |||
1555 | spin_unlock_bh(&stlc->tx_lock); | ||
1556 | |||
1557 | ret = stlc45xx_tx_frame(stlc, entry->frame_start, | ||
1558 | entry->skb->data, entry->skb->len); | ||
1559 | |||
1560 | spin_lock_bh(&stlc->tx_lock); | ||
1561 | |||
1562 | if (ret < 0) { | ||
1563 | /* frame transfer to firmware buffer failed */ | ||
1564 | /* FIXME: report this to mac80211 */ | ||
1565 | dev_kfree_skb(entry->skb); | ||
1566 | stlc45xx_txbuffer_free(stlc, entry); | ||
1567 | goto out; | ||
1568 | } | ||
1569 | |||
1570 | list_add(&entry->tx_list, &stlc->tx_sent); | ||
1571 | queue_delayed_work(stlc->hw->workqueue, | ||
1572 | &stlc->work_tx_timeout, | ||
1573 | msecs_to_jiffies(TX_TIMEOUT)); | ||
1574 | } | ||
1575 | |||
1576 | out: | ||
1577 | spin_unlock_bh(&stlc->tx_lock); | ||
1578 | return ret; | ||
1579 | } | ||
1580 | |||
1581 | static void stlc45xx_work(struct work_struct *work) | ||
1582 | { | ||
1583 | struct stlc45xx *stlc = container_of(work, struct stlc45xx, work); | ||
1584 | u32 ints; | ||
1585 | int ret; | ||
1586 | |||
1587 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1588 | |||
1589 | mutex_lock(&stlc->mutex); | ||
1590 | |||
1591 | if (stlc->fw_state == FW_STATE_OFF && | ||
1592 | stlc->fw_state == FW_STATE_RESET) | ||
1593 | goto out; | ||
1594 | |||
1595 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1596 | stlc45xx_debug(DEBUG_BH, "begin host_ints 0x%08x", ints); | ||
1597 | |||
1598 | if (ints & SPI_HOST_INT_READY) { | ||
1599 | stlc45xx_int_ready(stlc); | ||
1600 | stlc45xx_int_ack(stlc, SPI_HOST_INT_READY); | ||
1601 | } | ||
1602 | |||
1603 | if (stlc->fw_state != FW_STATE_READY) | ||
1604 | goto out; | ||
1605 | |||
1606 | if (ints & SPI_HOST_INT_UPDATE) { | ||
1607 | stlc45xx_int_ack(stlc, SPI_HOST_INT_UPDATE); | ||
1608 | ret = stlc45xx_rx(stlc); | ||
1609 | if (ret < 0) { | ||
1610 | stlc45xx_reset(stlc); | ||
1611 | goto out; | ||
1612 | } | ||
1613 | } | ||
1614 | if (ints & SPI_HOST_INT_SW_UPDATE) { | ||
1615 | stlc45xx_int_ack(stlc, SPI_HOST_INT_SW_UPDATE); | ||
1616 | ret = stlc45xx_rx(stlc); | ||
1617 | if (ret < 0) { | ||
1618 | stlc45xx_reset(stlc); | ||
1619 | goto out; | ||
1620 | } | ||
1621 | } | ||
1622 | |||
1623 | ret = stlc45xx_wq_tx(stlc); | ||
1624 | if (ret < 0) { | ||
1625 | stlc45xx_reset(stlc); | ||
1626 | goto out; | ||
1627 | } | ||
1628 | |||
1629 | ints = stlc45xx_read32(stlc, SPI_ADRS_HOST_INTERRUPTS); | ||
1630 | stlc45xx_debug(DEBUG_BH, "end host_ints 0x%08x", ints); | ||
1631 | |||
1632 | out: | ||
1633 | mutex_unlock(&stlc->mutex); | ||
1634 | } | ||
1635 | |||
1636 | static void stlc45xx_tx_edcf(struct stlc45xx *stlc) | ||
1637 | { | ||
1638 | struct s_lm_control *control; | ||
1639 | struct s_lmo_edcf *edcf; | ||
1640 | size_t len, edcf_len; | ||
1641 | |||
1642 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1643 | |||
1644 | edcf_len = sizeof(*edcf); | ||
1645 | len = sizeof(*control) + edcf_len; | ||
1646 | control = kzalloc(len, GFP_KERNEL); | ||
1647 | edcf = (struct s_lmo_edcf *) (control + 1); | ||
1648 | |||
1649 | control->flags = LM_FLAG_CONTROL | LM_CTRL_OPSET; | ||
1650 | control->length = edcf_len; | ||
1651 | control->oid = LM_OID_EDCF; | ||
1652 | |||
1653 | edcf->slottime = 0x14; | ||
1654 | edcf->sifs = 10; | ||
1655 | edcf->eofpad = 6; | ||
1656 | edcf->maxburst = 1500; | ||
1657 | |||
1658 | edcf->queues[0].aifs = 2; | ||
1659 | edcf->queues[0].pad0 = 1; | ||
1660 | edcf->queues[0].cwmin = 3; | ||
1661 | edcf->queues[0].cwmax = 7; | ||
1662 | edcf->queues[0].txop = 47; | ||
1663 | edcf->queues[1].aifs = 2; | ||
1664 | edcf->queues[1].pad0 = 0; | ||
1665 | edcf->queues[1].cwmin = 7; | ||
1666 | edcf->queues[1].cwmax = 15; | ||
1667 | edcf->queues[1].txop = 94; | ||
1668 | edcf->queues[2].aifs = 3; | ||
1669 | edcf->queues[2].pad0 = 0; | ||
1670 | edcf->queues[2].cwmin = 15; | ||
1671 | edcf->queues[2].cwmax = 1023; | ||
1672 | edcf->queues[2].txop = 0; | ||
1673 | edcf->queues[3].aifs = 7; | ||
1674 | edcf->queues[3].pad0 = 0; | ||
1675 | edcf->queues[3].cwmin = 15; | ||
1676 | edcf->queues[3].cwmax = 1023; | ||
1677 | edcf->queues[3].txop = 0; | ||
1678 | edcf->queues[4].aifs = 13; | ||
1679 | edcf->queues[4].pad0 = 99; | ||
1680 | edcf->queues[4].cwmin = 3437; | ||
1681 | edcf->queues[4].cwmax = 512; | ||
1682 | edcf->queues[4].txop = 12; | ||
1683 | edcf->queues[5].aifs = 142; | ||
1684 | edcf->queues[5].pad0 = 109; | ||
1685 | edcf->queues[5].cwmin = 8756; | ||
1686 | edcf->queues[5].cwmax = 6; | ||
1687 | edcf->queues[5].txop = 0; | ||
1688 | edcf->queues[6].aifs = 4; | ||
1689 | edcf->queues[6].pad0 = 0; | ||
1690 | edcf->queues[6].cwmin = 0; | ||
1691 | edcf->queues[6].cwmax = 58705; | ||
1692 | edcf->queues[6].txop = 25716; | ||
1693 | edcf->queues[7].aifs = 0; | ||
1694 | edcf->queues[7].pad0 = 0; | ||
1695 | edcf->queues[7].cwmin = 0; | ||
1696 | edcf->queues[7].cwmax = 0; | ||
1697 | edcf->queues[7].txop = 0; | ||
1698 | |||
1699 | stlc45xx_tx_frame(stlc, FIRMWARE_CONFIG_START, control, len); | ||
1700 | |||
1701 | kfree(control); | ||
1702 | } | ||
1703 | |||
1704 | static void stlc45xx_tx_setup(struct stlc45xx *stlc) | ||
1705 | { | ||
1706 | struct s_lm_control *control; | ||
1707 | struct s_lmo_setup *setup; | ||
1708 | size_t len, setup_len; | ||
1709 | |||
1710 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1711 | |||
1712 | setup_len = sizeof(*setup); | ||
1713 | len = sizeof(*control) + setup_len; | ||
1714 | control = kzalloc(len, GFP_KERNEL); | ||
1715 | setup = (struct s_lmo_setup *) (control + 1); | ||
1716 | |||
1717 | control->flags = LM_FLAG_CONTROL | LM_CTRL_OPSET; | ||
1718 | control->length = setup_len; | ||
1719 | control->oid = LM_OID_SETUP; | ||
1720 | |||
1721 | setup->flags = LM_SETUP_INFRA; | ||
1722 | setup->antenna = 2; | ||
1723 | setup->rx_align = 0; | ||
1724 | setup->rx_buffer = FIRMWARE_RXBUFFER_START; | ||
1725 | setup->rx_mtu = FIRMWARE_MTU; | ||
1726 | setup->frontend = 5; | ||
1727 | setup->timeout = 0; | ||
1728 | setup->truncate = 48896; | ||
1729 | setup->bratemask = 0xffffffff; | ||
1730 | setup->ref_clock = 644245094; | ||
1731 | setup->lpf_bandwidth = 65535; | ||
1732 | setup->osc_start_delay = 65535; | ||
1733 | |||
1734 | memcpy(setup->macaddr, stlc->mac_addr, ETH_ALEN); | ||
1735 | memcpy(setup->bssid, stlc->bssid, ETH_ALEN); | ||
1736 | |||
1737 | stlc45xx_tx_frame(stlc, FIRMWARE_CONFIG_START, control, len); | ||
1738 | |||
1739 | kfree(control); | ||
1740 | } | ||
1741 | |||
1742 | static void stlc45xx_tx_scan(struct stlc45xx *stlc) | ||
1743 | { | ||
1744 | struct s_lm_control *control; | ||
1745 | struct s_lmo_scan *scan; | ||
1746 | size_t len, scan_len; | ||
1747 | |||
1748 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
1749 | |||
1750 | scan_len = sizeof(*scan); | ||
1751 | len = sizeof(*control) + scan_len; | ||
1752 | control = kzalloc(len, GFP_KERNEL); | ||
1753 | scan = (struct s_lmo_scan *) (control + 1); | ||
1754 | |||
1755 | control->flags = LM_FLAG_CONTROL | LM_CTRL_OPSET; | ||
1756 | control->length = scan_len; | ||
1757 | control->oid = LM_OID_SCAN; | ||
1758 | |||
1759 | scan->flags = LM_SCAN_EXIT; | ||
1760 | scan->bratemask = 0x15f; | ||
1761 | scan->aloft[0] = 3; | ||
1762 | scan->aloft[1] = 3; | ||
1763 | scan->aloft[2] = 1; | ||
1764 | scan->aloft[3] = 0; | ||
1765 | scan->aloft[4] = 0; | ||
1766 | scan->aloft[5] = 0; | ||
1767 | scan->aloft[6] = 0; | ||
1768 | scan->aloft[7] = 0; | ||
1769 | |||
1770 | memcpy(&scan->rssical, &stlc->cal_rssi[(stlc->channel - 1) * | ||
1771 | RSSI_CAL_LEN], | ||
1772 | RSSI_CAL_LEN); | ||
1773 | memcpy(&scan->channel, &stlc->cal_channels[(stlc->channel - 1) * | ||
1774 | CHANNEL_CAL_LEN], | ||
1775 | CHANNEL_CAL_LEN); | ||
1776 | |||
1777 | stlc45xx_tx_frame(stlc, FIRMWARE_CONFIG_START, control, len); | ||
1778 | |||
1779 | kfree(control); | ||
1780 | } | ||
1781 | |||
1782 | /* | ||
1783 | * caller must hold mutex | ||
1784 | */ | ||
1785 | static int stlc45xx_tx_pspoll(struct stlc45xx *stlc, bool powersave) | ||
1786 | { | ||
1787 | struct ieee80211_hdr *pspoll; | ||
1788 | int payload_len, padding, i; | ||
1789 | struct s_lm_data_out *data; | ||
1790 | struct txbuffer *entry; | ||
1791 | struct sk_buff *skb; | ||
1792 | char *payload; | ||
1793 | u16 fc; | ||
1794 | |||
1795 | skb = dev_alloc_skb(stlc->hw->extra_tx_headroom + 16); | ||
1796 | if (!skb) { | ||
1797 | stlc45xx_warning("failed to allocate pspoll frame"); | ||
1798 | return -ENOMEM; | ||
1799 | } | ||
1800 | skb_reserve(skb, stlc->hw->extra_tx_headroom); | ||
1801 | |||
1802 | pspoll = (struct ieee80211_hdr *) skb_put(skb, 16); | ||
1803 | memset(pspoll, 0, 16); | ||
1804 | fc = IEEE80211_FTYPE_CTL | IEEE80211_STYPE_PSPOLL; | ||
1805 | if (powersave) | ||
1806 | fc |= IEEE80211_FCTL_PM; | ||
1807 | pspoll->frame_control = cpu_to_le16(fc); | ||
1808 | pspoll->duration_id = cpu_to_le16(stlc->aid); | ||
1809 | |||
1810 | /* aid in PS-Poll has its two MSBs each set to 1 */ | ||
1811 | pspoll->duration_id |= cpu_to_le16(1 << 15) | cpu_to_le16(1 << 14); | ||
1812 | |||
1813 | memcpy(pspoll->addr1, stlc->bssid, ETH_ALEN); | ||
1814 | memcpy(pspoll->addr2, stlc->mac_addr, ETH_ALEN); | ||
1815 | |||
1816 | stlc45xx_debug(DEBUG_PSM, "sending PS-Poll frame to %pM (powersave %d, " | ||
1817 | "fc 0x%x, aid %d)", pspoll->addr1, | ||
1818 | powersave, fc, stlc->aid); | ||
1819 | |||
1820 | spin_lock_bh(&stlc->tx_lock); | ||
1821 | |||
1822 | entry = stlc45xx_txbuffer_alloc(stlc, skb->len); | ||
1823 | |||
1824 | spin_unlock_bh(&stlc->tx_lock); | ||
1825 | |||
1826 | if (!entry) { | ||
1827 | /* | ||
1828 | * The queue should be stopped before the firmware buffer | ||
1829 | * is full, so firmware buffer should always have enough | ||
1830 | * space. | ||
1831 | * | ||
1832 | * But I'm too lazy and omit it for now. | ||
1833 | */ | ||
1834 | if (net_ratelimit()) | ||
1835 | stlc45xx_warning("firmware tx buffer full is full " | ||
1836 | "for null frame"); | ||
1837 | return -ENOSPC; | ||
1838 | } | ||
1839 | |||
1840 | payload = skb->data; | ||
1841 | payload_len = skb->len; | ||
1842 | padding = (int) (skb->data - sizeof(*data)) & 3; | ||
1843 | entry->header_len = sizeof(*data) + padding; | ||
1844 | |||
1845 | entry->skb = skb; | ||
1846 | entry->status_needed = false; | ||
1847 | entry->handle = (u32) skb; | ||
1848 | entry->lifetime = jiffies + msecs_to_jiffies(TX_FRAME_LIFETIME); | ||
1849 | |||
1850 | stlc45xx_debug(DEBUG_TX, "tx data 0x%x (0x%p payload %d B " | ||
1851 | "padding %d header_len %d)", | ||
1852 | entry->handle, payload, payload_len, padding, | ||
1853 | entry->header_len); | ||
1854 | stlc45xx_dump(DEBUG_TX_CONTENT, payload, payload_len); | ||
1855 | |||
1856 | data = (struct s_lm_data_out *) skb_push(skb, entry->header_len); | ||
1857 | |||
1858 | memset(data, 0, entry->header_len); | ||
1859 | |||
1860 | if (padding) | ||
1861 | data->flags = LM_FLAG_ALIGN; | ||
1862 | |||
1863 | data->flags = LM_OUT_BURST; | ||
1864 | data->length = payload_len; | ||
1865 | data->handle = entry->handle; | ||
1866 | data->aid = 1; | ||
1867 | data->rts_retries = 7; | ||
1868 | data->retries = 7; | ||
1869 | data->aloft_ctrl = 0; | ||
1870 | data->crypt_offset = 58; | ||
1871 | data->keytype = 0; | ||
1872 | data->keylen = 0; | ||
1873 | data->queue = LM_QUEUE_DATA3; | ||
1874 | data->backlog = 32; | ||
1875 | data->antenna = 2; | ||
1876 | data->cts = 3; | ||
1877 | data->power = 127; | ||
1878 | |||
1879 | for (i = 0; i < 8; i++) | ||
1880 | data->aloft[i] = 0; | ||
1881 | |||
1882 | /* | ||
1883 | * check if there's enough space in tx buffer | ||
1884 | * | ||
1885 | * FIXME: ignored for now | ||
1886 | */ | ||
1887 | |||
1888 | stlc45xx_tx_frame(stlc, entry->start, skb->data, skb->len); | ||
1889 | |||
1890 | list_add(&entry->tx_list, &stlc->tx_sent); | ||
1891 | |||
1892 | return 0; | ||
1893 | } | ||
1894 | |||
1895 | /* | ||
1896 | * caller must hold mutex | ||
1897 | * | ||
1898 | * shamelessly stolen from mac80211/ieee80211_send_nullfunc | ||
1899 | */ | ||
1900 | static int stlc45xx_tx_nullfunc(struct stlc45xx *stlc, bool powersave) | ||
1901 | { | ||
1902 | struct ieee80211_hdr *nullfunc; | ||
1903 | int payload_len, padding, i; | ||
1904 | struct s_lm_data_out *data; | ||
1905 | struct txbuffer *entry; | ||
1906 | struct sk_buff *skb; | ||
1907 | char *payload; | ||
1908 | u16 fc; | ||
1909 | |||
1910 | skb = dev_alloc_skb(stlc->hw->extra_tx_headroom + 24); | ||
1911 | if (!skb) { | ||
1912 | stlc45xx_warning("failed to allocate buffer for null frame\n"); | ||
1913 | return -ENOMEM; | ||
1914 | } | ||
1915 | skb_reserve(skb, stlc->hw->extra_tx_headroom); | ||
1916 | |||
1917 | nullfunc = (struct ieee80211_hdr *) skb_put(skb, 24); | ||
1918 | memset(nullfunc, 0, 24); | ||
1919 | fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC | | ||
1920 | IEEE80211_FCTL_TODS; | ||
1921 | |||
1922 | if (powersave) | ||
1923 | fc |= IEEE80211_FCTL_PM; | ||
1924 | |||
1925 | nullfunc->frame_control = cpu_to_le16(fc); | ||
1926 | memcpy(nullfunc->addr1, stlc->bssid, ETH_ALEN); | ||
1927 | memcpy(nullfunc->addr2, stlc->mac_addr, ETH_ALEN); | ||
1928 | memcpy(nullfunc->addr3, stlc->bssid, ETH_ALEN); | ||
1929 | |||
1930 | stlc45xx_debug(DEBUG_PSM, "sending Null frame to %pM (powersave %d, " | ||
1931 | "fc 0x%x)", nullfunc->addr1, powersave, fc); | ||
1932 | |||
1933 | spin_lock_bh(&stlc->tx_lock); | ||
1934 | |||
1935 | entry = stlc45xx_txbuffer_alloc(stlc, skb->len); | ||
1936 | |||
1937 | spin_unlock_bh(&stlc->tx_lock); | ||
1938 | |||
1939 | if (!entry) { | ||
1940 | /* | ||
1941 | * The queue should be stopped before the firmware buffer | ||
1942 | * is full, so firmware buffer should always have enough | ||
1943 | * space. | ||
1944 | * | ||
1945 | * But I'm too lazy and omit it for now. | ||
1946 | */ | ||
1947 | if (net_ratelimit()) | ||
1948 | stlc45xx_warning("firmware tx buffer full is full " | ||
1949 | "for null frame"); | ||
1950 | return -ENOSPC; | ||
1951 | } | ||
1952 | |||
1953 | payload = skb->data; | ||
1954 | payload_len = skb->len; | ||
1955 | padding = (int) (skb->data - sizeof(*data)) & 3; | ||
1956 | entry->header_len = sizeof(*data) + padding; | ||
1957 | |||
1958 | entry->skb = skb; | ||
1959 | entry->status_needed = false; | ||
1960 | entry->handle = (u32) skb; | ||
1961 | entry->lifetime = jiffies + msecs_to_jiffies(TX_FRAME_LIFETIME); | ||
1962 | |||
1963 | stlc45xx_debug(DEBUG_TX, "tx data 0x%x (0x%p payload %d B " | ||
1964 | "padding %d header_len %d)", | ||
1965 | entry->handle, payload, payload_len, padding, | ||
1966 | entry->header_len); | ||
1967 | stlc45xx_dump(DEBUG_TX_CONTENT, payload, payload_len); | ||
1968 | |||
1969 | data = (struct s_lm_data_out *) skb_push(skb, entry->header_len); | ||
1970 | |||
1971 | memset(data, 0, entry->header_len); | ||
1972 | |||
1973 | if (padding) | ||
1974 | data->flags = LM_FLAG_ALIGN; | ||
1975 | |||
1976 | data->flags = LM_OUT_BURST; | ||
1977 | data->length = payload_len; | ||
1978 | data->handle = entry->handle; | ||
1979 | data->aid = 1; | ||
1980 | data->rts_retries = 7; | ||
1981 | data->retries = 7; | ||
1982 | data->aloft_ctrl = 0; | ||
1983 | data->crypt_offset = 58; | ||
1984 | data->keytype = 0; | ||
1985 | data->keylen = 0; | ||
1986 | data->queue = LM_QUEUE_DATA3; | ||
1987 | data->backlog = 32; | ||
1988 | data->antenna = 2; | ||
1989 | data->cts = 3; | ||
1990 | data->power = 127; | ||
1991 | |||
1992 | for (i = 0; i < 8; i++) | ||
1993 | data->aloft[i] = 0; | ||
1994 | |||
1995 | /* | ||
1996 | * check if there's enough space in tx buffer | ||
1997 | * | ||
1998 | * FIXME: ignored for now | ||
1999 | */ | ||
2000 | |||
2001 | stlc45xx_tx_frame(stlc, entry->start, skb->data, skb->len); | ||
2002 | |||
2003 | list_add(&entry->tx_list, &stlc->tx_sent); | ||
2004 | |||
2005 | return 0; | ||
2006 | } | ||
2007 | |||
2008 | /* caller must hold mutex */ | ||
2009 | static void stlc45xx_tx_psm(struct stlc45xx *stlc, bool enable) | ||
2010 | { | ||
2011 | struct s_lm_control *control; | ||
2012 | struct s_lmo_psm *psm; | ||
2013 | size_t len, psm_len; | ||
2014 | |||
2015 | WARN_ON(!stlc->associated); | ||
2016 | WARN_ON(stlc->aid < 1); | ||
2017 | WARN_ON(stlc->aid > 2007); | ||
2018 | |||
2019 | psm_len = sizeof(*psm); | ||
2020 | len = sizeof(*control) + psm_len; | ||
2021 | control = kzalloc(len, GFP_KERNEL); | ||
2022 | psm = (struct s_lmo_psm *) (control + 1); | ||
2023 | |||
2024 | control->flags = LM_FLAG_CONTROL | LM_CTRL_OPSET; | ||
2025 | control->length = psm_len; | ||
2026 | control->oid = LM_OID_PSM; | ||
2027 | |||
2028 | if (enable) | ||
2029 | psm->flags |= LM_PSM; | ||
2030 | |||
2031 | psm->aid = stlc->aid; | ||
2032 | |||
2033 | psm->beacon_rcpi_skip_max = 60; | ||
2034 | |||
2035 | psm->intervals[0].interval = 1; | ||
2036 | psm->intervals[0].periods = 1; | ||
2037 | psm->intervals[1].interval = 1; | ||
2038 | psm->intervals[1].periods = 1; | ||
2039 | psm->intervals[2].interval = 1; | ||
2040 | psm->intervals[2].periods = 1; | ||
2041 | psm->intervals[3].interval = 1; | ||
2042 | psm->intervals[3].periods = 1; | ||
2043 | |||
2044 | psm->nr = 0; | ||
2045 | psm->exclude[0] = 0; | ||
2046 | |||
2047 | stlc45xx_debug(DEBUG_PSM, "sending LM_OID_PSM (aid %d, interval %d)", | ||
2048 | psm->aid, psm->intervals[0].interval); | ||
2049 | |||
2050 | stlc45xx_tx_frame(stlc, FIRMWARE_CONFIG_START, control, len); | ||
2051 | |||
2052 | kfree(control); | ||
2053 | } | ||
2054 | |||
2055 | static int stlc45xx_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
2056 | { | ||
2057 | struct stlc45xx *stlc = hw->priv; | ||
2058 | struct ieee80211_tx_info *info; | ||
2059 | struct ieee80211_rate *rate; | ||
2060 | int payload_len, padding, i; | ||
2061 | struct s_lm_data_out *data; | ||
2062 | struct txbuffer *entry; | ||
2063 | char *payload; | ||
2064 | |||
2065 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2066 | |||
2067 | spin_lock_bh(&stlc->tx_lock); | ||
2068 | |||
2069 | entry = stlc45xx_txbuffer_alloc(stlc, skb->len); | ||
2070 | if (!entry) { | ||
2071 | /* the queue should be stopped before the firmware buffer | ||
2072 | * is full, so firmware buffer should always have enough | ||
2073 | * space */ | ||
2074 | if (net_ratelimit()) | ||
2075 | stlc45xx_warning("firmware buffer full"); | ||
2076 | spin_unlock_bh(&stlc->tx_lock); | ||
2077 | return NETDEV_TX_BUSY; | ||
2078 | } | ||
2079 | |||
2080 | info = IEEE80211_SKB_CB(skb); | ||
2081 | |||
2082 | payload = skb->data; | ||
2083 | payload_len = skb->len; | ||
2084 | padding = (int) (skb->data - sizeof(*data)) & 3; | ||
2085 | entry->header_len = sizeof(*data) + padding; | ||
2086 | |||
2087 | entry->skb = skb; | ||
2088 | entry->status_needed = true; | ||
2089 | entry->handle = (u32) skb; | ||
2090 | entry->lifetime = jiffies + msecs_to_jiffies(TX_FRAME_LIFETIME); | ||
2091 | |||
2092 | stlc45xx_debug(DEBUG_TX, "tx data 0x%x (0x%p payload %d B " | ||
2093 | "padding %d header_len %d)", | ||
2094 | entry->handle, payload, payload_len, padding, | ||
2095 | entry->header_len); | ||
2096 | stlc45xx_dump(DEBUG_TX_CONTENT, payload, payload_len); | ||
2097 | |||
2098 | data = (struct s_lm_data_out *) skb_push(skb, entry->header_len); | ||
2099 | |||
2100 | memset(data, 0, entry->header_len); | ||
2101 | |||
2102 | if (padding) | ||
2103 | data->flags = LM_FLAG_ALIGN; | ||
2104 | |||
2105 | data->flags = LM_OUT_BURST; | ||
2106 | data->length = payload_len; | ||
2107 | data->handle = entry->handle; | ||
2108 | data->aid = 1; | ||
2109 | data->rts_retries = 7; | ||
2110 | data->retries = 7; | ||
2111 | data->aloft_ctrl = 0; | ||
2112 | data->crypt_offset = 58; | ||
2113 | data->keytype = 0; | ||
2114 | data->keylen = 0; | ||
2115 | data->queue = 2; | ||
2116 | data->backlog = 32; | ||
2117 | data->antenna = 2; | ||
2118 | data->cts = 3; | ||
2119 | data->power = 127; | ||
2120 | |||
2121 | for (i = 0; i < 8; i++) { | ||
2122 | rate = ieee80211_get_tx_rate(stlc->hw, info); | ||
2123 | data->aloft[i] = rate->hw_value; | ||
2124 | } | ||
2125 | |||
2126 | list_add_tail(&entry->tx_list, &stlc->tx_pending); | ||
2127 | |||
2128 | /* check if there's enough space in tx buffer */ | ||
2129 | if (stlc45xx_txbuffer_find(stlc, MAX_FRAME_LEN) == -1) { | ||
2130 | stlc45xx_debug(DEBUG_QUEUE, "tx buffer full, stopping queues"); | ||
2131 | stlc->tx_queue_stopped = 1; | ||
2132 | ieee80211_stop_queues(stlc->hw); | ||
2133 | } | ||
2134 | |||
2135 | queue_work(stlc->hw->workqueue, &stlc->work); | ||
2136 | |||
2137 | spin_unlock_bh(&stlc->tx_lock); | ||
2138 | |||
2139 | return NETDEV_TX_OK; | ||
2140 | } | ||
2141 | |||
2142 | static int stlc45xx_op_start(struct ieee80211_hw *hw) | ||
2143 | { | ||
2144 | struct stlc45xx *stlc = hw->priv; | ||
2145 | unsigned long timeout; | ||
2146 | int ret = 0; | ||
2147 | |||
2148 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2149 | |||
2150 | mutex_lock(&stlc->mutex); | ||
2151 | |||
2152 | stlc->fw_state = FW_STATE_BOOTING; | ||
2153 | stlc->channel = 1; | ||
2154 | |||
2155 | stlc45xx_power_on(stlc); | ||
2156 | |||
2157 | ret = stlc45xx_upload_firmware(stlc); | ||
2158 | if (ret < 0) { | ||
2159 | stlc45xx_power_off(stlc); | ||
2160 | goto out_unlock; | ||
2161 | } | ||
2162 | |||
2163 | stlc->tx_queue_stopped = 0; | ||
2164 | |||
2165 | mutex_unlock(&stlc->mutex); | ||
2166 | |||
2167 | timeout = msecs_to_jiffies(2000); | ||
2168 | timeout = wait_for_completion_interruptible_timeout(&stlc->fw_comp, | ||
2169 | timeout); | ||
2170 | if (!timeout) { | ||
2171 | stlc45xx_error("firmware boot failed"); | ||
2172 | stlc45xx_power_off(stlc); | ||
2173 | ret = -1; | ||
2174 | goto out; | ||
2175 | } | ||
2176 | |||
2177 | stlc45xx_debug(DEBUG_BOOT, "firmware booted"); | ||
2178 | |||
2179 | /* FIXME: should we take mutex just after wait_for_completion()? */ | ||
2180 | mutex_lock(&stlc->mutex); | ||
2181 | |||
2182 | WARN_ON(stlc->fw_state != FW_STATE_READY); | ||
2183 | |||
2184 | out_unlock: | ||
2185 | mutex_unlock(&stlc->mutex); | ||
2186 | |||
2187 | out: | ||
2188 | return ret; | ||
2189 | } | ||
2190 | |||
2191 | static void stlc45xx_op_stop(struct ieee80211_hw *hw) | ||
2192 | { | ||
2193 | struct stlc45xx *stlc = hw->priv; | ||
2194 | |||
2195 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2196 | |||
2197 | mutex_lock(&stlc->mutex); | ||
2198 | |||
2199 | WARN_ON(stlc->fw_state != FW_STATE_READY); | ||
2200 | |||
2201 | stlc45xx_power_off(stlc); | ||
2202 | |||
2203 | /* FIXME: make sure that all work_structs have completed */ | ||
2204 | |||
2205 | spin_lock_bh(&stlc->tx_lock); | ||
2206 | stlc45xx_flush_queues(stlc); | ||
2207 | spin_unlock_bh(&stlc->tx_lock); | ||
2208 | |||
2209 | stlc->fw_state = FW_STATE_OFF; | ||
2210 | |||
2211 | mutex_unlock(&stlc->mutex); | ||
2212 | } | ||
2213 | |||
2214 | static int stlc45xx_op_add_interface(struct ieee80211_hw *hw, | ||
2215 | struct ieee80211_if_init_conf *conf) | ||
2216 | { | ||
2217 | struct stlc45xx *stlc = hw->priv; | ||
2218 | |||
2219 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2220 | |||
2221 | switch (conf->type) { | ||
2222 | case NL80211_IFTYPE_STATION: | ||
2223 | break; | ||
2224 | default: | ||
2225 | return -EOPNOTSUPP; | ||
2226 | } | ||
2227 | |||
2228 | memcpy(stlc->mac_addr, conf->mac_addr, ETH_ALEN); | ||
2229 | |||
2230 | return 0; | ||
2231 | } | ||
2232 | |||
2233 | static void stlc45xx_op_remove_interface(struct ieee80211_hw *hw, | ||
2234 | struct ieee80211_if_init_conf *conf) | ||
2235 | { | ||
2236 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2237 | } | ||
2238 | |||
2239 | static int stlc45xx_op_config(struct ieee80211_hw *hw, u32 changed) | ||
2240 | { | ||
2241 | struct stlc45xx *stlc = hw->priv; | ||
2242 | |||
2243 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2244 | |||
2245 | mutex_lock(&stlc->mutex); | ||
2246 | |||
2247 | stlc->channel = hw->conf.channel->hw_value; | ||
2248 | stlc45xx_tx_scan(stlc); | ||
2249 | stlc45xx_tx_setup(stlc); | ||
2250 | stlc45xx_tx_edcf(stlc); | ||
2251 | |||
2252 | if ((hw->conf.flags & IEEE80211_CONF_PS) != stlc->psm) { | ||
2253 | stlc->psm = hw->conf.flags & IEEE80211_CONF_PS; | ||
2254 | if (stlc->associated) { | ||
2255 | stlc45xx_tx_psm(stlc, stlc->psm); | ||
2256 | stlc45xx_tx_nullfunc(stlc, stlc->psm); | ||
2257 | } | ||
2258 | } | ||
2259 | |||
2260 | mutex_unlock(&stlc->mutex); | ||
2261 | |||
2262 | return 0; | ||
2263 | } | ||
2264 | |||
2265 | static void stlc45xx_op_configure_filter(struct ieee80211_hw *hw, | ||
2266 | unsigned int changed_flags, | ||
2267 | unsigned int *total_flags, | ||
2268 | int mc_count, | ||
2269 | struct dev_addr_list *mc_list) | ||
2270 | { | ||
2271 | *total_flags = 0; | ||
2272 | } | ||
2273 | |||
2274 | static void stlc45xx_op_bss_info_changed(struct ieee80211_hw *hw, | ||
2275 | struct ieee80211_vif *vif, | ||
2276 | struct ieee80211_bss_conf *info, | ||
2277 | u32 changed) | ||
2278 | { | ||
2279 | struct stlc45xx *stlc = hw->priv; | ||
2280 | |||
2281 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2282 | mutex_lock(&stlc->mutex); | ||
2283 | |||
2284 | memcpy(stlc->bssid, info->bssid, ETH_ALEN); | ||
2285 | stlc45xx_tx_setup(stlc); | ||
2286 | |||
2287 | mutex_unlock(&stlc->mutex); | ||
2288 | |||
2289 | if (changed & BSS_CHANGED_ASSOC) { | ||
2290 | stlc->associated = info->assoc; | ||
2291 | if (info->assoc) | ||
2292 | stlc->aid = info->aid; | ||
2293 | else | ||
2294 | stlc->aid = -1; | ||
2295 | |||
2296 | if (stlc->psm) { | ||
2297 | stlc45xx_tx_psm(stlc, stlc->psm); | ||
2298 | stlc45xx_tx_nullfunc(stlc, stlc->psm); | ||
2299 | } | ||
2300 | } | ||
2301 | } | ||
2302 | |||
2303 | |||
2304 | /* can't be const, mac80211 writes to this */ | ||
2305 | static struct ieee80211_rate stlc45xx_rates[] = { | ||
2306 | { .bitrate = 10, .hw_value = 0, .hw_value_short = 0, }, | ||
2307 | { .bitrate = 20, .hw_value = 1, .hw_value_short = 1, }, | ||
2308 | { .bitrate = 55, .hw_value = 2, .hw_value_short = 2, }, | ||
2309 | { .bitrate = 110, .hw_value = 3, .hw_value_short = 3, }, | ||
2310 | { .bitrate = 60, .hw_value = 4, .hw_value_short = 4, }, | ||
2311 | { .bitrate = 90, .hw_value = 5, .hw_value_short = 5, }, | ||
2312 | { .bitrate = 120, .hw_value = 6, .hw_value_short = 6, }, | ||
2313 | { .bitrate = 180, .hw_value = 7, .hw_value_short = 7, }, | ||
2314 | { .bitrate = 240, .hw_value = 8, .hw_value_short = 8, }, | ||
2315 | { .bitrate = 360, .hw_value = 9, .hw_value_short = 9, }, | ||
2316 | { .bitrate = 480, .hw_value = 10, .hw_value_short = 10, }, | ||
2317 | { .bitrate = 540, .hw_value = 11, .hw_value_short = 11, }, | ||
2318 | }; | ||
2319 | |||
2320 | /* can't be const, mac80211 writes to this */ | ||
2321 | static struct ieee80211_channel stlc45xx_channels[] = { | ||
2322 | { .hw_value = 1, .center_freq = 2412}, | ||
2323 | { .hw_value = 2, .center_freq = 2417}, | ||
2324 | { .hw_value = 3, .center_freq = 2422}, | ||
2325 | { .hw_value = 4, .center_freq = 2427}, | ||
2326 | { .hw_value = 5, .center_freq = 2432}, | ||
2327 | { .hw_value = 6, .center_freq = 2437}, | ||
2328 | { .hw_value = 7, .center_freq = 2442}, | ||
2329 | { .hw_value = 8, .center_freq = 2447}, | ||
2330 | { .hw_value = 9, .center_freq = 2452}, | ||
2331 | { .hw_value = 10, .center_freq = 2457}, | ||
2332 | { .hw_value = 11, .center_freq = 2462}, | ||
2333 | { .hw_value = 12, .center_freq = 2467}, | ||
2334 | { .hw_value = 13, .center_freq = 2472}, | ||
2335 | }; | ||
2336 | |||
2337 | /* can't be const, mac80211 writes to this */ | ||
2338 | static struct ieee80211_supported_band stlc45xx_band_2ghz = { | ||
2339 | .channels = stlc45xx_channels, | ||
2340 | .n_channels = ARRAY_SIZE(stlc45xx_channels), | ||
2341 | .bitrates = stlc45xx_rates, | ||
2342 | .n_bitrates = ARRAY_SIZE(stlc45xx_rates), | ||
2343 | }; | ||
2344 | |||
2345 | static const struct ieee80211_ops stlc45xx_ops = { | ||
2346 | .start = stlc45xx_op_start, | ||
2347 | .stop = stlc45xx_op_stop, | ||
2348 | .add_interface = stlc45xx_op_add_interface, | ||
2349 | .remove_interface = stlc45xx_op_remove_interface, | ||
2350 | .config = stlc45xx_op_config, | ||
2351 | .configure_filter = stlc45xx_op_configure_filter, | ||
2352 | .tx = stlc45xx_op_tx, | ||
2353 | .bss_info_changed = stlc45xx_op_bss_info_changed, | ||
2354 | }; | ||
2355 | |||
2356 | static int stlc45xx_register_mac80211(struct stlc45xx *stlc) | ||
2357 | { | ||
2358 | /* FIXME: SET_IEEE80211_PERM_ADDR() requires default_mac_addr | ||
2359 | to be non-const for some strange reason */ | ||
2360 | static u8 default_mac_addr[ETH_ALEN] = { | ||
2361 | 0x00, 0x02, 0xee, 0xc0, 0xff, 0xee | ||
2362 | }; | ||
2363 | int ret; | ||
2364 | |||
2365 | SET_IEEE80211_PERM_ADDR(stlc->hw, default_mac_addr); | ||
2366 | |||
2367 | ret = ieee80211_register_hw(stlc->hw); | ||
2368 | if (ret) { | ||
2369 | stlc45xx_error("unable to register mac80211 hw: %d", ret); | ||
2370 | return ret; | ||
2371 | } | ||
2372 | |||
2373 | return 0; | ||
2374 | } | ||
2375 | |||
2376 | static void stlc45xx_device_release(struct device *dev) | ||
2377 | { | ||
2378 | |||
2379 | } | ||
2380 | |||
2381 | static struct platform_device stlc45xx_device = { | ||
2382 | .name = "stlc45xx", | ||
2383 | .id = -1, | ||
2384 | |||
2385 | /* device model insists to have a release function */ | ||
2386 | .dev = { | ||
2387 | .release = stlc45xx_device_release, | ||
2388 | }, | ||
2389 | }; | ||
2390 | |||
2391 | static int __devinit stlc45xx_probe(struct spi_device *spi) | ||
2392 | { | ||
2393 | struct stlc45xx *stlc; | ||
2394 | struct ieee80211_hw *hw; | ||
2395 | int ret; | ||
2396 | |||
2397 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2398 | |||
2399 | /* mac80211 alloc */ | ||
2400 | hw = ieee80211_alloc_hw(sizeof(*stlc), &stlc45xx_ops); | ||
2401 | if (!hw) { | ||
2402 | stlc45xx_error("could not alloc ieee80211_hw"); | ||
2403 | ret = -ENOMEM; | ||
2404 | goto out; | ||
2405 | } | ||
2406 | |||
2407 | /* mac80211 clears hw->priv */ | ||
2408 | stlc = hw->priv; | ||
2409 | |||
2410 | stlc->hw = hw; | ||
2411 | dev_set_drvdata(&spi->dev, stlc); | ||
2412 | stlc->spi = spi; | ||
2413 | |||
2414 | spi->bits_per_word = 16; | ||
2415 | spi->max_speed_hz = 24000000; | ||
2416 | |||
2417 | ret = spi_setup(spi); | ||
2418 | if (ret < 0) | ||
2419 | stlc45xx_error("spi_setup failed"); | ||
2420 | |||
2421 | ret = gpio_request(stlc45xx_gpio_power, "stlc45xx power"); | ||
2422 | if (ret < 0) { | ||
2423 | stlc45xx_error("power GPIO request failed: %d", ret); | ||
2424 | return ret; | ||
2425 | } | ||
2426 | |||
2427 | ret = gpio_request(stlc45xx_gpio_irq, "stlc45xx irq"); | ||
2428 | if (ret < 0) { | ||
2429 | stlc45xx_error("irq GPIO request failed: %d", ret); | ||
2430 | goto out; | ||
2431 | } | ||
2432 | |||
2433 | gpio_direction_output(stlc45xx_gpio_power, 0); | ||
2434 | gpio_direction_input(stlc45xx_gpio_irq); | ||
2435 | |||
2436 | ret = request_irq(gpio_to_irq(stlc45xx_gpio_irq), | ||
2437 | stlc45xx_interrupt, IRQF_DISABLED, "stlc45xx", | ||
2438 | stlc->spi); | ||
2439 | if (ret < 0) | ||
2440 | /* FIXME: handle the error */ | ||
2441 | stlc45xx_error("request_irq() failed"); | ||
2442 | |||
2443 | set_irq_type(gpio_to_irq(stlc45xx_gpio_irq), | ||
2444 | IRQ_TYPE_EDGE_RISING); | ||
2445 | |||
2446 | disable_irq(gpio_to_irq(stlc45xx_gpio_irq)); | ||
2447 | |||
2448 | ret = platform_device_register(&stlc45xx_device); | ||
2449 | if (ret) { | ||
2450 | stlc45xx_error("Couldn't register wlan_omap device."); | ||
2451 | return ret; | ||
2452 | } | ||
2453 | dev_set_drvdata(&stlc45xx_device.dev, stlc); | ||
2454 | |||
2455 | INIT_WORK(&stlc->work, stlc45xx_work); | ||
2456 | INIT_WORK(&stlc->work_reset, stlc45xx_work_reset); | ||
2457 | INIT_DELAYED_WORK(&stlc->work_tx_timeout, stlc45xx_work_tx_timeout); | ||
2458 | mutex_init(&stlc->mutex); | ||
2459 | init_completion(&stlc->fw_comp); | ||
2460 | spin_lock_init(&stlc->tx_lock); | ||
2461 | INIT_LIST_HEAD(&stlc->txbuffer); | ||
2462 | INIT_LIST_HEAD(&stlc->tx_pending); | ||
2463 | INIT_LIST_HEAD(&stlc->tx_sent); | ||
2464 | |||
2465 | hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | | ||
2466 | IEEE80211_HW_SIGNAL_DBM | | ||
2467 | IEEE80211_HW_NOISE_DBM; | ||
2468 | /* four bytes for padding */ | ||
2469 | hw->extra_tx_headroom = sizeof(struct s_lm_data_out) + 4; | ||
2470 | |||
2471 | /* unit us */ | ||
2472 | hw->channel_change_time = 1000; | ||
2473 | |||
2474 | hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); | ||
2475 | hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &stlc45xx_band_2ghz; | ||
2476 | |||
2477 | SET_IEEE80211_DEV(hw, &spi->dev); | ||
2478 | |||
2479 | BUILD_BUG_ON(sizeof(default_cal_rssi) != RSSI_CAL_ARRAY_LEN); | ||
2480 | BUILD_BUG_ON(sizeof(default_cal_channels) != CHANNEL_CAL_ARRAY_LEN); | ||
2481 | |||
2482 | stlc->cal_rssi = kmemdup(default_cal_rssi, RSSI_CAL_ARRAY_LEN, | ||
2483 | GFP_KERNEL); | ||
2484 | stlc->cal_channels = kmemdup(default_cal_channels, | ||
2485 | CHANNEL_CAL_ARRAY_LEN, | ||
2486 | GFP_KERNEL); | ||
2487 | |||
2488 | ret = device_create_file(&stlc45xx_device.dev, &dev_attr_cal_rssi); | ||
2489 | if (ret < 0) { | ||
2490 | stlc45xx_error("failed to create sysfs file cal_rssi"); | ||
2491 | goto out; | ||
2492 | } | ||
2493 | |||
2494 | ret = device_create_file(&stlc45xx_device.dev, &dev_attr_cal_channels); | ||
2495 | if (ret < 0) { | ||
2496 | stlc45xx_error("failed to create sysfs file cal_channels"); | ||
2497 | goto out; | ||
2498 | } | ||
2499 | |||
2500 | ret = device_create_file(&stlc45xx_device.dev, &dev_attr_tx_buf); | ||
2501 | if (ret < 0) { | ||
2502 | stlc45xx_error("failed to create sysfs file tx_buf"); | ||
2503 | goto out; | ||
2504 | } | ||
2505 | |||
2506 | ret = stlc45xx_register_mac80211(stlc); | ||
2507 | if (ret < 0) | ||
2508 | goto out; | ||
2509 | |||
2510 | stlc45xx_info("v" DRIVER_VERSION " loaded"); | ||
2511 | |||
2512 | stlc45xx_info("config buffer 0x%x-0x%x", | ||
2513 | FIRMWARE_CONFIG_START, FIRMWARE_CONFIG_END); | ||
2514 | stlc45xx_info("tx 0x%x-0x%x, rx 0x%x-0x%x", | ||
2515 | FIRMWARE_TXBUFFER_START, FIRMWARE_TXBUFFER_END, | ||
2516 | FIRMWARE_RXBUFFER_START, FIRMWARE_RXBUFFER_END); | ||
2517 | |||
2518 | out: | ||
2519 | return ret; | ||
2520 | } | ||
2521 | |||
2522 | static int __devexit stlc45xx_remove(struct spi_device *spi) | ||
2523 | { | ||
2524 | struct stlc45xx *stlc = dev_get_drvdata(&spi->dev); | ||
2525 | |||
2526 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2527 | |||
2528 | platform_device_unregister(&stlc45xx_device); | ||
2529 | |||
2530 | ieee80211_unregister_hw(stlc->hw); | ||
2531 | |||
2532 | free_irq(gpio_to_irq(stlc45xx_gpio_irq), spi); | ||
2533 | |||
2534 | gpio_free(stlc45xx_gpio_power); | ||
2535 | gpio_free(stlc45xx_gpio_irq); | ||
2536 | |||
2537 | /* FIXME: free cal_channels and cal_rssi? */ | ||
2538 | |||
2539 | kfree(stlc->fw); | ||
2540 | |||
2541 | mutex_destroy(&stlc->mutex); | ||
2542 | |||
2543 | /* frees also stlc */ | ||
2544 | ieee80211_free_hw(stlc->hw); | ||
2545 | stlc = NULL; | ||
2546 | |||
2547 | return 0; | ||
2548 | } | ||
2549 | |||
2550 | |||
2551 | static struct spi_driver stlc45xx_spi_driver = { | ||
2552 | .driver = { | ||
2553 | /* use cx3110x name because board-n800.c uses that for the | ||
2554 | * SPI port */ | ||
2555 | .name = "cx3110x", | ||
2556 | .bus = &spi_bus_type, | ||
2557 | .owner = THIS_MODULE, | ||
2558 | }, | ||
2559 | |||
2560 | .probe = stlc45xx_probe, | ||
2561 | .remove = __devexit_p(stlc45xx_remove), | ||
2562 | }; | ||
2563 | |||
2564 | static int __init stlc45xx_init(void) | ||
2565 | { | ||
2566 | int ret; | ||
2567 | |||
2568 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2569 | |||
2570 | ret = spi_register_driver(&stlc45xx_spi_driver); | ||
2571 | if (ret < 0) { | ||
2572 | stlc45xx_error("failed to register SPI driver: %d", ret); | ||
2573 | goto out; | ||
2574 | } | ||
2575 | |||
2576 | out: | ||
2577 | return ret; | ||
2578 | } | ||
2579 | |||
2580 | static void __exit stlc45xx_exit(void) | ||
2581 | { | ||
2582 | stlc45xx_debug(DEBUG_FUNC, "%s", __func__); | ||
2583 | |||
2584 | spi_unregister_driver(&stlc45xx_spi_driver); | ||
2585 | |||
2586 | stlc45xx_info("unloaded"); | ||
2587 | } | ||
2588 | |||
2589 | module_init(stlc45xx_init); | ||
2590 | module_exit(stlc45xx_exit); | ||
2591 | |||
2592 | MODULE_LICENSE("GPL"); | ||
2593 | MODULE_AUTHOR("Kalle Valo <kalle.valo@nokia.com>"); | ||
2594 | MODULE_ALIAS("spi:cx3110x"); | ||
diff --git a/drivers/staging/stlc45xx/stlc45xx.h b/drivers/staging/stlc45xx/stlc45xx.h deleted file mode 100644 index ac96bbbde79f..000000000000 --- a/drivers/staging/stlc45xx/stlc45xx.h +++ /dev/null | |||
@@ -1,283 +0,0 @@ | |||
1 | /* | ||
2 | * This file is part of stlc45xx | ||
3 | * | ||
4 | * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). | ||
5 | * | ||
6 | * Contact: Kalle Valo <kalle.valo@nokia.com> | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or | ||
9 | * modify it under the terms of the GNU General Public License | ||
10 | * version 2 as published by the Free Software Foundation. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA | ||
20 | * 02110-1301 USA | ||
21 | * | ||
22 | */ | ||
23 | |||
24 | #include <linux/mutex.h> | ||
25 | #include <linux/list.h> | ||
26 | #include <net/mac80211.h> | ||
27 | |||
28 | #include "stlc45xx_lmac.h" | ||
29 | |||
30 | #define DRIVER_NAME "stlc45xx" | ||
31 | #define DRIVER_VERSION "0.1.3" | ||
32 | |||
33 | #define DRIVER_PREFIX DRIVER_NAME ": " | ||
34 | |||
35 | enum { | ||
36 | DEBUG_NONE = 0, | ||
37 | DEBUG_FUNC = 1 << 0, | ||
38 | DEBUG_IRQ = 1 << 1, | ||
39 | DEBUG_BH = 1 << 2, | ||
40 | DEBUG_RX = 1 << 3, | ||
41 | DEBUG_RX_CONTENT = 1 << 5, | ||
42 | DEBUG_TX = 1 << 6, | ||
43 | DEBUG_TX_CONTENT = 1 << 8, | ||
44 | DEBUG_TXBUFFER = 1 << 9, | ||
45 | DEBUG_QUEUE = 1 << 10, | ||
46 | DEBUG_BOOT = 1 << 11, | ||
47 | DEBUG_PSM = 1 << 12, | ||
48 | DEBUG_ALL = ~0, | ||
49 | }; | ||
50 | |||
51 | #define DEBUG_LEVEL DEBUG_NONE | ||
52 | /* #define DEBUG_LEVEL DEBUG_ALL */ | ||
53 | /* #define DEBUG_LEVEL (DEBUG_TX | DEBUG_RX | DEBUG_IRQ) */ | ||
54 | /* #define DEBUG_LEVEL (DEBUG_TX | DEBUG_MEMREGION | DEBUG_QUEUE) */ | ||
55 | /* #define DEBUG_LEVEL (DEBUG_MEMREGION | DEBUG_QUEUE) */ | ||
56 | |||
57 | #define stlc45xx_error(fmt, arg...) \ | ||
58 | printk(KERN_ERR DRIVER_PREFIX "ERROR " fmt "\n", ##arg) | ||
59 | |||
60 | #define stlc45xx_warning(fmt, arg...) \ | ||
61 | printk(KERN_WARNING DRIVER_PREFIX "WARNING " fmt "\n", ##arg) | ||
62 | |||
63 | #define stlc45xx_info(fmt, arg...) \ | ||
64 | printk(KERN_INFO DRIVER_PREFIX fmt "\n", ##arg) | ||
65 | |||
66 | #define stlc45xx_debug(level, fmt, arg...) \ | ||
67 | do { \ | ||
68 | if (level & DEBUG_LEVEL) \ | ||
69 | printk(KERN_DEBUG DRIVER_PREFIX fmt "\n", ##arg); \ | ||
70 | } while (0) | ||
71 | |||
72 | #define stlc45xx_dump(level, buf, len) \ | ||
73 | do { \ | ||
74 | if (level & DEBUG_LEVEL) \ | ||
75 | print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, \ | ||
76 | 16, 1, buf, len, 1); \ | ||
77 | } while (0) | ||
78 | |||
79 | #define MAC2STR(a) ((a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]) | ||
80 | #define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x" | ||
81 | |||
82 | /* Bit 15 is read/write bit; ON = READ, OFF = WRITE */ | ||
83 | #define ADDR_READ_BIT_15 0x8000 | ||
84 | |||
85 | #define SPI_ADRS_ARM_INTERRUPTS 0x00 | ||
86 | #define SPI_ADRS_ARM_INT_EN 0x04 | ||
87 | |||
88 | #define SPI_ADRS_HOST_INTERRUPTS 0x08 | ||
89 | #define SPI_ADRS_HOST_INT_EN 0x0c | ||
90 | #define SPI_ADRS_HOST_INT_ACK 0x10 | ||
91 | |||
92 | #define SPI_ADRS_GEN_PURP_1 0x14 | ||
93 | #define SPI_ADRS_GEN_PURP_2 0x18 | ||
94 | |||
95 | /* high word */ | ||
96 | #define SPI_ADRS_DEV_CTRL_STAT 0x26 | ||
97 | |||
98 | #define SPI_ADRS_DMA_DATA 0x28 | ||
99 | |||
100 | #define SPI_ADRS_DMA_WRITE_CTRL 0x2c | ||
101 | #define SPI_ADRS_DMA_WRITE_LEN 0x2e | ||
102 | #define SPI_ADRS_DMA_WRITE_BASE 0x30 | ||
103 | |||
104 | #define SPI_ADRS_DMA_READ_CTRL 0x34 | ||
105 | #define SPI_ADRS_DMA_READ_LEN 0x36 | ||
106 | #define SPI_ADRS_DMA_READ_BASE 0x38 | ||
107 | |||
108 | #define SPI_CTRL_STAT_HOST_OVERRIDE 0x8000 | ||
109 | #define SPI_CTRL_STAT_START_HALTED 0x4000 | ||
110 | #define SPI_CTRL_STAT_RAM_BOOT 0x2000 | ||
111 | #define SPI_CTRL_STAT_HOST_RESET 0x1000 | ||
112 | #define SPI_CTRL_STAT_HOST_CPU_EN 0x0800 | ||
113 | |||
114 | #define SPI_DMA_WRITE_CTRL_ENABLE 0x0001 | ||
115 | #define SPI_DMA_READ_CTRL_ENABLE 0x0001 | ||
116 | #define HOST_ALLOWED (1 << 7) | ||
117 | |||
118 | #define FIRMWARE_ADDRESS 0x20000 | ||
119 | |||
120 | #define SPI_TIMEOUT 100 /* msec */ | ||
121 | |||
122 | #define SPI_MAX_TX_PACKETS 32 | ||
123 | |||
124 | #define SPI_MAX_PACKET_SIZE 32767 | ||
125 | |||
126 | #define SPI_TARGET_INT_WAKEUP 0x00000001 | ||
127 | #define SPI_TARGET_INT_SLEEP 0x00000002 | ||
128 | #define SPI_TARGET_INT_RDDONE 0x00000004 | ||
129 | |||
130 | #define SPI_TARGET_INT_CTS 0x00004000 | ||
131 | #define SPI_TARGET_INT_DR 0x00008000 | ||
132 | |||
133 | #define SPI_HOST_INT_READY 0x00000001 | ||
134 | #define SPI_HOST_INT_WR_READY 0x00000002 | ||
135 | #define SPI_HOST_INT_SW_UPDATE 0x00000004 | ||
136 | #define SPI_HOST_INT_UPDATE 0x10000000 | ||
137 | |||
138 | /* clear to send */ | ||
139 | #define SPI_HOST_INT_CTS 0x00004000 | ||
140 | |||
141 | /* data ready */ | ||
142 | #define SPI_HOST_INT_DR 0x00008000 | ||
143 | |||
144 | #define SPI_HOST_INTS_DEFAULT \ | ||
145 | (SPI_HOST_INT_READY | SPI_HOST_INT_UPDATE | SPI_HOST_INT_SW_UPDATE) | ||
146 | |||
147 | #define TARGET_BOOT_SLEEP 50 | ||
148 | |||
149 | /* The firmware buffer is divided into three areas: | ||
150 | * | ||
151 | * o config area (for control commands) | ||
152 | * o tx buffer | ||
153 | * o rx buffer | ||
154 | */ | ||
155 | #define FIRMWARE_BUFFER_START 0x20200 | ||
156 | #define FIRMWARE_BUFFER_END 0x27c60 | ||
157 | #define FIRMWARE_BUFFER_LEN (FIRMWARE_BUFFER_END - FIRMWARE_BUFFER_START) | ||
158 | #define FIRMWARE_MTU 3240 | ||
159 | #define FIRMWARE_CONFIG_PAYLOAD_LEN 1024 | ||
160 | #define FIRMWARE_CONFIG_START FIRMWARE_BUFFER_START | ||
161 | #define FIRMWARE_CONFIG_LEN (sizeof(struct s_lm_control) + \ | ||
162 | FIRMWARE_CONFIG_PAYLOAD_LEN) | ||
163 | #define FIRMWARE_CONFIG_END (FIRMWARE_CONFIG_START + FIRMWARE_CONFIG_LEN - 1) | ||
164 | #define FIRMWARE_RXBUFFER_LEN (5 * FIRMWARE_MTU + 1024) | ||
165 | #define FIRMWARE_RXBUFFER_START (FIRMWARE_BUFFER_END - FIRMWARE_RXBUFFER_LEN) | ||
166 | #define FIRMWARE_RXBUFFER_END (FIRMWARE_RXBUFFER_START + \ | ||
167 | FIRMWARE_RXBUFFER_LEN - 1) | ||
168 | #define FIRMWARE_TXBUFFER_START (FIRMWARE_BUFFER_START + FIRMWARE_CONFIG_LEN) | ||
169 | #define FIRMWARE_TXBUFFER_LEN (FIRMWARE_BUFFER_LEN - FIRMWARE_CONFIG_LEN - \ | ||
170 | FIRMWARE_RXBUFFER_LEN) | ||
171 | #define FIRMWARE_TXBUFFER_END (FIRMWARE_TXBUFFER_START + \ | ||
172 | FIRMWARE_TXBUFFER_LEN - 1) | ||
173 | |||
174 | #define FIRMWARE_TXBUFFER_HEADER 100 | ||
175 | #define FIRMWARE_TXBUFFER_TRAILER 4 | ||
176 | |||
177 | /* FIXME: come up with a proper value */ | ||
178 | #define MAX_FRAME_LEN 2500 | ||
179 | |||
180 | /* unit is ms */ | ||
181 | #define TX_FRAME_LIFETIME 2000 | ||
182 | #define TX_TIMEOUT 4000 | ||
183 | |||
184 | #define SUPPORTED_CHANNELS 13 | ||
185 | |||
186 | /* FIXME */ | ||
187 | /* #define CHANNEL_CAL_LEN offsetof(struct s_lmo_scan, bratemask) - \ */ | ||
188 | /* offsetof(struct s_lmo_scan, channel) */ | ||
189 | #define CHANNEL_CAL_LEN 292 | ||
190 | #define CHANNEL_CAL_ARRAY_LEN (SUPPORTED_CHANNELS * CHANNEL_CAL_LEN) | ||
191 | /* FIXME */ | ||
192 | /* #define RSSI_CAL_LEN sizeof(struct s_lmo_scan) - \ */ | ||
193 | /* offsetof(struct s_lmo_scan, rssical) */ | ||
194 | #define RSSI_CAL_LEN 8 | ||
195 | #define RSSI_CAL_ARRAY_LEN (SUPPORTED_CHANNELS * RSSI_CAL_LEN) | ||
196 | |||
197 | struct s_dma_regs { | ||
198 | unsigned short cmd; | ||
199 | unsigned short len; | ||
200 | unsigned long addr; | ||
201 | }; | ||
202 | |||
203 | struct stlc45xx_ie_tim { | ||
204 | u8 dtim_count; | ||
205 | u8 dtim_period; | ||
206 | u8 bmap_control; | ||
207 | u8 pvbmap[251]; | ||
208 | }; | ||
209 | |||
210 | struct txbuffer { | ||
211 | /* can be removed when switched to skb queue */ | ||
212 | struct list_head tx_list; | ||
213 | |||
214 | struct list_head buffer_list; | ||
215 | |||
216 | int start; | ||
217 | int frame_start; | ||
218 | int end; | ||
219 | |||
220 | struct sk_buff *skb; | ||
221 | u32 handle; | ||
222 | |||
223 | bool status_needed; | ||
224 | |||
225 | int header_len; | ||
226 | |||
227 | /* unit jiffies */ | ||
228 | unsigned long lifetime; | ||
229 | }; | ||
230 | |||
231 | enum fw_state { | ||
232 | FW_STATE_OFF, | ||
233 | FW_STATE_BOOTING, | ||
234 | FW_STATE_READY, | ||
235 | FW_STATE_RESET, | ||
236 | FW_STATE_RESETTING, | ||
237 | }; | ||
238 | |||
239 | struct stlc45xx { | ||
240 | struct ieee80211_hw *hw; | ||
241 | struct spi_device *spi; | ||
242 | struct work_struct work; | ||
243 | struct work_struct work_reset; | ||
244 | struct delayed_work work_tx_timeout; | ||
245 | struct mutex mutex; | ||
246 | struct completion fw_comp; | ||
247 | |||
248 | |||
249 | u8 bssid[ETH_ALEN]; | ||
250 | u8 mac_addr[ETH_ALEN]; | ||
251 | int channel; | ||
252 | |||
253 | u8 *cal_rssi; | ||
254 | u8 *cal_channels; | ||
255 | |||
256 | enum fw_state fw_state; | ||
257 | |||
258 | spinlock_t tx_lock; | ||
259 | |||
260 | /* protected by tx_lock */ | ||
261 | struct list_head txbuffer; | ||
262 | |||
263 | /* protected by tx_lock */ | ||
264 | struct list_head tx_pending; | ||
265 | |||
266 | /* protected by tx_lock */ | ||
267 | int tx_queue_stopped; | ||
268 | |||
269 | /* protected by mutex */ | ||
270 | struct list_head tx_sent; | ||
271 | |||
272 | int tx_frames; | ||
273 | |||
274 | u8 *fw; | ||
275 | int fw_len; | ||
276 | |||
277 | bool psm; | ||
278 | bool associated; | ||
279 | int aid; | ||
280 | bool pspolling; | ||
281 | }; | ||
282 | |||
283 | |||
diff --git a/drivers/staging/stlc45xx/stlc45xx_lmac.h b/drivers/staging/stlc45xx/stlc45xx_lmac.h deleted file mode 100644 index af5db801347f..000000000000 --- a/drivers/staging/stlc45xx/stlc45xx_lmac.h +++ /dev/null | |||
@@ -1,434 +0,0 @@ | |||
1 | /************************************************************************ | ||
2 | * This is the LMAC API interface header file for STLC4560. * | ||
3 | * Copyright (C) 2007 Conexant Systems, Inc. * | ||
4 | * This program is free software; you can redistribute it and/or * | ||
5 | * modify it under the terms of the GNU General Public License * | ||
6 | * as published by the Free Software Foundation; either version 2 * | ||
7 | * of the License, or (at your option) any later version. * | ||
8 | * * | ||
9 | * This program is distributed in the hope that it will be useful, * | ||
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * | ||
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * | ||
12 | * GNU General Public License for more details. * | ||
13 | * * | ||
14 | * You should have received a copy of the GNU General Public License * | ||
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>.* | ||
16 | *************************************************************************/ | ||
17 | |||
18 | #ifndef __lmac_h__ | ||
19 | #define __lmac_h__ | ||
20 | |||
21 | #define LM_TOP_VARIANT 0x0506 | ||
22 | #define LM_BOTTOM_VARIANT 0x0506 | ||
23 | |||
24 | /* | ||
25 | * LMAC - UMAC interface definition: | ||
26 | */ | ||
27 | |||
28 | #define LM_FLAG_CONTROL 0x8000 | ||
29 | #define LM_FLAG_ALIGN 0x4000 | ||
30 | |||
31 | #define LM_CTRL_OPSET 0x0001 | ||
32 | |||
33 | #define LM_OUT_PROMISC 0x0001 | ||
34 | #define LM_OUT_TIMESTAMP 0x0002 | ||
35 | #define LM_OUT_SEQNR 0x0004 | ||
36 | #define LM_OUT_BURST 0x0010 | ||
37 | #define LM_OUT_NOCANCEL 0x0020 | ||
38 | #define LM_OUT_CLEARTIM 0x0040 | ||
39 | #define LM_OUT_HITCHHIKE 0x0080 | ||
40 | #define LM_OUT_COMPRESS 0x0100 | ||
41 | #define LM_OUT_CONCAT 0x0200 | ||
42 | #define LM_OUT_PCS_ACCEPT 0x0400 | ||
43 | #define LM_OUT_WAITEOSP 0x0800 | ||
44 | |||
45 | |||
46 | #define LM_ALOFT_SP 0x10 | ||
47 | #define LM_ALOFT_CTS 0x20 | ||
48 | #define LM_ALOFT_RTS 0x40 | ||
49 | #define LM_ALOFT_MASK 0x1f | ||
50 | #define LM_ALOFT_RATE 0x0f | ||
51 | |||
52 | #define LM_IN_FCS_GOOD 0x0001 | ||
53 | #define LM_IN_MATCH_MAC 0x0002 | ||
54 | #define LM_IN_MCBC 0x0004 | ||
55 | #define LM_IN_BEACON 0x0008 | ||
56 | #define LM_IN_MATCH_BSS 0x0010 | ||
57 | #define LM_IN_BCAST_BSS 0x0020 | ||
58 | #define LM_IN_DATA 0x0040 | ||
59 | #define LM_IN_TRUNCATED 0x0080 | ||
60 | |||
61 | #define LM_IN_TRANSPARENT 0x0200 | ||
62 | |||
63 | #define LM_QUEUE_BEACON 0 | ||
64 | #define LM_QUEUE_SCAN 1 | ||
65 | #define LM_QUEUE_MGT 2 | ||
66 | #define LM_QUEUE_MCBC 3 | ||
67 | #define LM_QUEUE_DATA 4 | ||
68 | #define LM_QUEUE_DATA0 4 | ||
69 | #define LM_QUEUE_DATA1 5 | ||
70 | #define LM_QUEUE_DATA2 6 | ||
71 | #define LM_QUEUE_DATA3 7 | ||
72 | |||
73 | #define LM_SETUP_INFRA 0x0001 | ||
74 | #define LM_SETUP_IBSS 0x0002 | ||
75 | #define LM_SETUP_TRANSPARENT 0x0008 | ||
76 | #define LM_SETUP_PROMISCUOUS 0x0010 | ||
77 | #define LM_SETUP_HIBERNATE 0x0020 | ||
78 | #define LM_SETUP_NOACK 0x0040 | ||
79 | #define LM_SETUP_RX_DISABLED 0x0080 | ||
80 | |||
81 | #define LM_ANTENNA_0 0 | ||
82 | #define LM_ANTENNA_1 1 | ||
83 | #define LM_ANTENNA_DIVERSITY 2 | ||
84 | |||
85 | #define LM_TX_FAILED 0x0001 | ||
86 | #define LM_TX_PSM 0x0002 | ||
87 | #define LM_TX_PSM_CANCELLED 0x0004 | ||
88 | |||
89 | #define LM_SCAN_EXIT 0x0001 | ||
90 | #define LM_SCAN_TRAP 0x0002 | ||
91 | #define LM_SCAN_ACTIVE 0x0004 | ||
92 | #define LM_SCAN_FILTER 0x0008 | ||
93 | |||
94 | #define LM_PSM 0x0001 | ||
95 | #define LM_PSM_DTIM 0x0002 | ||
96 | #define LM_PSM_MCBC 0x0004 | ||
97 | #define LM_PSM_CHECKSUM 0x0008 | ||
98 | #define LM_PSM_SKIP_MORE_DATA 0x0010 | ||
99 | #define LM_PSM_BEACON_TIMEOUT 0x0020 | ||
100 | #define LM_PSM_HFOSLEEP 0x0040 | ||
101 | #define LM_PSM_AUTOSWITCH_SLEEP 0x0080 | ||
102 | #define LM_PSM_LPIT 0x0100 | ||
103 | #define LM_PSM_BF_UCAST_SKIP 0x0200 | ||
104 | #define LM_PSM_BF_MCAST_SKIP 0x0400 | ||
105 | |||
106 | /* hfosleep */ | ||
107 | #define LM_PSM_SLEEP_OPTION_MASK (LM_PSM_AUTOSWITCH_SLEEP | LM_PSM_HFOSLEEP) | ||
108 | #define LM_PSM_SLEEP_OPTION_SHIFT 6 | ||
109 | /* hfosleepend */ | ||
110 | #define LM_PSM_BF_OPTION_MASK (LM_PSM_BF_MCAST_SKIP | LM_PSM_BF_UCAST_SKIP) | ||
111 | #define LM_PSM_BF_OPTION_SHIFT 9 | ||
112 | |||
113 | |||
114 | #define LM_PRIVACC_WEP 0x01 | ||
115 | #define LM_PRIVACC_TKIP 0x02 | ||
116 | #define LM_PRIVACC_MICHAEL 0x04 | ||
117 | #define LM_PRIVACC_CCX_KP 0x08 | ||
118 | #define LM_PRIVACC_CCX_MIC 0x10 | ||
119 | #define LM_PRIVACC_AES_CCMP 0x20 | ||
120 | |||
121 | /* size of s_lm_descr in words */ | ||
122 | #define LM_DESCR_SIZE_WORDS 11 | ||
123 | |||
124 | #ifndef __ASSEMBLER__ | ||
125 | |||
126 | enum { | ||
127 | LM_MODE_CLIENT = 0, | ||
128 | LM_MODE_AP | ||
129 | }; | ||
130 | |||
131 | struct s_lm_descr { | ||
132 | uint16_t modes; | ||
133 | uint16_t flags; | ||
134 | uint32_t buffer_start; | ||
135 | uint32_t buffer_end; | ||
136 | uint8_t header; | ||
137 | uint8_t trailer; | ||
138 | uint8_t tx_queues; | ||
139 | uint8_t tx_depth; | ||
140 | uint8_t privacy; | ||
141 | uint8_t rx_keycache; | ||
142 | uint8_t tim_size; | ||
143 | uint8_t pad1; | ||
144 | uint8_t rates[16]; | ||
145 | uint32_t link; | ||
146 | uint16_t mtu; | ||
147 | }; | ||
148 | |||
149 | |||
150 | struct s_lm_control { | ||
151 | uint16_t flags; | ||
152 | uint16_t length; | ||
153 | uint32_t handle; | ||
154 | uint16_t oid; | ||
155 | uint16_t pad; | ||
156 | /* uint8_t data[]; */ | ||
157 | }; | ||
158 | |||
159 | enum { | ||
160 | LM_PRIV_NONE = 0, | ||
161 | LM_PRIV_WEP, | ||
162 | LM_PRIV_TKIP, | ||
163 | LM_PRIV_TKIPMICHAEL, | ||
164 | LM_PRIV_CCX_WEPMIC, | ||
165 | LM_PRIV_CCX_KPMIC, | ||
166 | LM_PRIV_CCX_KP, | ||
167 | LM_PRIV_AES_CCMP | ||
168 | }; | ||
169 | |||
170 | enum { | ||
171 | LM_DECRYPT_NONE, | ||
172 | LM_DECRYPT_OK, | ||
173 | LM_DECRYPT_NOKEY, | ||
174 | LM_DECRYPT_NOMICHAEL, | ||
175 | LM_DECRYPT_NOCKIPMIC, | ||
176 | LM_DECRYPT_FAIL_WEP, | ||
177 | LM_DECRYPT_FAIL_TKIP, | ||
178 | LM_DECRYPT_FAIL_MICHAEL, | ||
179 | LM_DECRYPT_FAIL_CKIPKP, | ||
180 | LM_DECRYPT_FAIL_CKIPMIC, | ||
181 | LM_DECRYPT_FAIL_AESCCMP | ||
182 | }; | ||
183 | |||
184 | struct s_lm_data_out { | ||
185 | uint16_t flags; | ||
186 | uint16_t length; | ||
187 | uint32_t handle; | ||
188 | uint16_t aid; | ||
189 | uint8_t rts_retries; | ||
190 | uint8_t retries; | ||
191 | uint8_t aloft[8]; | ||
192 | uint8_t aloft_ctrl; | ||
193 | uint8_t crypt_offset; | ||
194 | uint8_t keytype; | ||
195 | uint8_t keylen; | ||
196 | uint8_t key[16]; | ||
197 | uint8_t queue; | ||
198 | uint8_t backlog; | ||
199 | uint16_t durations[4]; | ||
200 | uint8_t antenna; | ||
201 | uint8_t cts; | ||
202 | int16_t power; | ||
203 | uint8_t pad[2]; | ||
204 | /*uint8_t data[];*/ | ||
205 | }; | ||
206 | |||
207 | #define LM_RCPI_INVALID (0xff) | ||
208 | |||
209 | struct s_lm_data_in { | ||
210 | uint16_t flags; | ||
211 | uint16_t length; | ||
212 | uint16_t frequency; | ||
213 | uint8_t antenna; | ||
214 | uint8_t rate; | ||
215 | uint8_t rcpi; | ||
216 | uint8_t sq; | ||
217 | uint8_t decrypt; | ||
218 | uint8_t rssi_raw; | ||
219 | uint32_t clock[2]; | ||
220 | /*uint8_t data[];*/ | ||
221 | }; | ||
222 | |||
223 | union u_lm_data { | ||
224 | struct s_lm_data_out out; | ||
225 | struct s_lm_data_in in; | ||
226 | }; | ||
227 | |||
228 | enum { | ||
229 | LM_OID_SETUP = 0, | ||
230 | LM_OID_SCAN = 1, | ||
231 | LM_OID_TRAP = 2, | ||
232 | LM_OID_EDCF = 3, | ||
233 | LM_OID_KEYCACHE = 4, | ||
234 | LM_OID_PSM = 6, | ||
235 | LM_OID_TXCANCEL = 7, | ||
236 | LM_OID_TX = 8, | ||
237 | LM_OID_BURST = 9, | ||
238 | LM_OID_STATS = 10, | ||
239 | LM_OID_LED = 13, | ||
240 | LM_OID_TIMER = 15, | ||
241 | LM_OID_NAV = 20, | ||
242 | LM_OID_PCS = 22, | ||
243 | LM_OID_BT_BALANCER = 28, | ||
244 | LM_OID_GROUP_ADDRESS_TABLE = 30, | ||
245 | LM_OID_ARPTABLE = 31, | ||
246 | LM_OID_BT_OPTIONS = 35 | ||
247 | }; | ||
248 | |||
249 | enum { | ||
250 | LM_FRONTEND_UNKNOWN = 0, | ||
251 | LM_FRONTEND_DUETTE3, | ||
252 | LM_FRONTEND_DUETTE2, | ||
253 | LM_FRONTEND_FRISBEE, | ||
254 | LM_FRONTEND_CROSSBOW, | ||
255 | LM_FRONTEND_LONGBOW | ||
256 | }; | ||
257 | |||
258 | |||
259 | #define INVALID_LPF_BANDWIDTH 0xffff | ||
260 | #define INVALID_OSC_START_DELAY 0xffff | ||
261 | |||
262 | struct s_lmo_setup { | ||
263 | uint16_t flags; | ||
264 | uint8_t macaddr[6]; | ||
265 | uint8_t bssid[6]; | ||
266 | uint8_t antenna; | ||
267 | uint8_t rx_align; | ||
268 | uint32_t rx_buffer; | ||
269 | uint16_t rx_mtu; | ||
270 | uint16_t frontend; | ||
271 | uint16_t timeout; | ||
272 | uint16_t truncate; | ||
273 | uint32_t bratemask; | ||
274 | uint8_t sbss_offset; | ||
275 | uint8_t mcast_window; | ||
276 | uint8_t rx_rssi_threshold; | ||
277 | uint8_t rx_ed_threshold; | ||
278 | uint32_t ref_clock; | ||
279 | uint16_t lpf_bandwidth; | ||
280 | uint16_t osc_start_delay; | ||
281 | }; | ||
282 | |||
283 | |||
284 | struct s_lmo_scan { | ||
285 | uint16_t flags; | ||
286 | uint16_t dwell; | ||
287 | uint8_t channel[292]; | ||
288 | uint32_t bratemask; | ||
289 | uint8_t aloft[8]; | ||
290 | uint8_t rssical[8]; | ||
291 | }; | ||
292 | |||
293 | |||
294 | enum { | ||
295 | LM_TRAP_SCAN = 0, | ||
296 | LM_TRAP_TIMER, | ||
297 | LM_TRAP_BEACON_TX, | ||
298 | LM_TRAP_FAA_RADIO_ON, | ||
299 | LM_TRAP_FAA_RADIO_OFF, | ||
300 | LM_TRAP_RADAR, | ||
301 | LM_TRAP_NO_BEACON, | ||
302 | LM_TRAP_TBTT, | ||
303 | LM_TRAP_SCO_ENTER, | ||
304 | LM_TRAP_SCO_EXIT | ||
305 | }; | ||
306 | |||
307 | struct s_lmo_trap { | ||
308 | uint16_t event; | ||
309 | uint16_t frequency; | ||
310 | }; | ||
311 | |||
312 | struct s_lmo_timer { | ||
313 | uint32_t interval; | ||
314 | }; | ||
315 | |||
316 | struct s_lmo_nav { | ||
317 | uint32_t period; | ||
318 | }; | ||
319 | |||
320 | |||
321 | struct s_lmo_edcf_queue; | ||
322 | |||
323 | struct s_lmo_edcf { | ||
324 | uint8_t flags; | ||
325 | uint8_t slottime; | ||
326 | uint8_t sifs; | ||
327 | uint8_t eofpad; | ||
328 | struct s_lmo_edcf_queue { | ||
329 | uint8_t aifs; | ||
330 | uint8_t pad0; | ||
331 | uint16_t cwmin; | ||
332 | uint16_t cwmax; | ||
333 | uint16_t txop; | ||
334 | } queues[8]; | ||
335 | uint8_t mapping[4]; | ||
336 | uint16_t maxburst; | ||
337 | uint16_t round_trip_delay; | ||
338 | }; | ||
339 | |||
340 | struct s_lmo_keycache { | ||
341 | uint8_t entry; | ||
342 | uint8_t keyid; | ||
343 | uint8_t address[6]; | ||
344 | uint8_t pad[2]; | ||
345 | uint8_t keytype; | ||
346 | uint8_t keylen; | ||
347 | uint8_t key[24]; | ||
348 | }; | ||
349 | |||
350 | |||
351 | struct s_lm_interval; | ||
352 | |||
353 | struct s_lmo_psm { | ||
354 | uint16_t flags; | ||
355 | uint16_t aid; | ||
356 | struct s_lm_interval { | ||
357 | uint16_t interval; | ||
358 | uint16_t periods; | ||
359 | } intervals[4]; | ||
360 | /* uint16_t pad; */ | ||
361 | uint8_t beacon_rcpi_skip_max; | ||
362 | uint8_t rcpi_delta_threshold; | ||
363 | uint8_t nr; | ||
364 | uint8_t exclude[1]; | ||
365 | }; | ||
366 | |||
367 | #define MC_FILTER_ADDRESS_NUM 4 | ||
368 | |||
369 | struct s_lmo_group_address_table { | ||
370 | uint16_t filter_enable; | ||
371 | uint16_t num_address; | ||
372 | uint8_t macaddr_list[MC_FILTER_ADDRESS_NUM][6]; | ||
373 | }; | ||
374 | |||
375 | struct s_lmo_txcancel { | ||
376 | uint32_t address[1]; | ||
377 | }; | ||
378 | |||
379 | |||
380 | struct s_lmo_tx { | ||
381 | uint8_t flags; | ||
382 | uint8_t retries; | ||
383 | uint8_t rcpi; | ||
384 | uint8_t sq; | ||
385 | uint16_t seqctrl; | ||
386 | uint8_t antenna; | ||
387 | uint8_t pad; | ||
388 | }; | ||
389 | |||
390 | struct s_lmo_burst { | ||
391 | uint8_t flags; | ||
392 | uint8_t queue; | ||
393 | uint8_t backlog; | ||
394 | uint8_t pad; | ||
395 | uint16_t durations[32]; | ||
396 | }; | ||
397 | |||
398 | struct s_lmo_stats { | ||
399 | uint32_t valid; | ||
400 | uint32_t fcs; | ||
401 | uint32_t abort; | ||
402 | uint32_t phyabort; | ||
403 | uint32_t rts_success; | ||
404 | uint32_t rts_fail; | ||
405 | uint32_t timestamp; | ||
406 | uint32_t time_tx; | ||
407 | uint32_t noisefloor; | ||
408 | uint32_t sample_noise[8]; | ||
409 | uint32_t sample_cca; | ||
410 | uint32_t sample_tx; | ||
411 | }; | ||
412 | |||
413 | |||
414 | struct s_lmo_led { | ||
415 | uint16_t flags; | ||
416 | uint16_t mask[2]; | ||
417 | uint16_t delay/*[2]*/; | ||
418 | }; | ||
419 | |||
420 | |||
421 | struct s_lmo_bt_balancer { | ||
422 | uint16_t prio_thresh; | ||
423 | uint16_t acl_thresh; | ||
424 | }; | ||
425 | |||
426 | |||
427 | struct s_lmo_arp_table { | ||
428 | uint16_t filter_enable; | ||
429 | uint32_t ipaddr; | ||
430 | }; | ||
431 | |||
432 | #endif /* __ASSEMBLER__ */ | ||
433 | |||
434 | #endif /* __lmac_h__ */ | ||
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index 7f96bcaf1c60..05186110c029 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c | |||
@@ -1332,7 +1332,6 @@ device_release_WPADEV(pDevice); | |||
1332 | free_netdev(pDevice->dev); | 1332 | free_netdev(pDevice->dev); |
1333 | } | 1333 | } |
1334 | 1334 | ||
1335 | kfree(pDevice); | ||
1336 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n"); | 1335 | DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_disconnect3.. \n"); |
1337 | } | 1336 | } |
1338 | 1337 | ||
diff --git a/drivers/staging/winbond/Kconfig b/drivers/staging/winbond/Kconfig index 940460c39f36..132671d96d0d 100644 --- a/drivers/staging/winbond/Kconfig +++ b/drivers/staging/winbond/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config W35UND | 1 | config W35UND |
2 | tristate "IS89C35 WLAN USB driver" | 2 | tristate "IS89C35 WLAN USB driver" |
3 | depends on MAC80211 && WLAN_80211 && USB && EXPERIMENTAL | 3 | depends on MAC80211 && WLAN && USB && EXPERIMENTAL |
4 | default n | 4 | default n |
5 | ---help--- | 5 | ---help--- |
6 | This is highly experimental driver for Winbond WIFI card. | 6 | This is highly experimental driver for Winbond WIFI card. |
diff --git a/drivers/staging/wlan-ng/Kconfig b/drivers/staging/wlan-ng/Kconfig index 9959b658c8cf..f44294b0d8dc 100644 --- a/drivers/staging/wlan-ng/Kconfig +++ b/drivers/staging/wlan-ng/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config PRISM2_USB | 1 | config PRISM2_USB |
2 | tristate "Prism2.5/3 USB driver" | 2 | tristate "Prism2.5/3 USB driver" |
3 | depends on WLAN_80211 && USB && WIRELESS_EXT | 3 | depends on WLAN && USB && WIRELESS_EXT |
4 | default n | 4 | default n |
5 | ---help--- | 5 | ---help--- |
6 | This is the wlan-ng prism 2.5/3 USB driver for a wide range of | 6 | This is the wlan-ng prism 2.5/3 USB driver for a wide range of |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 33351312327f..a18e3c5dd82e 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -223,6 +223,7 @@ config USB_OTG | |||
223 | config USB_GADGET_PXA25X | 223 | config USB_GADGET_PXA25X |
224 | boolean "PXA 25x or IXP 4xx" | 224 | boolean "PXA 25x or IXP 4xx" |
225 | depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX | 225 | depends on (ARCH_PXA && PXA25x) || ARCH_IXP4XX |
226 | select USB_OTG_UTILS | ||
226 | help | 227 | help |
227 | Intel's PXA 25x series XScale ARM-5TE processors include | 228 | Intel's PXA 25x series XScale ARM-5TE processors include |
228 | an integrated full speed USB 1.1 device controller. The | 229 | an integrated full speed USB 1.1 device controller. The |
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index 42a74b8a0bb8..fa3d142ba64d 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
@@ -2139,7 +2139,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count, | |||
2139 | static void fsl_udc_release(struct device *dev) | 2139 | static void fsl_udc_release(struct device *dev) |
2140 | { | 2140 | { |
2141 | complete(udc_controller->done); | 2141 | complete(udc_controller->done); |
2142 | dma_free_coherent(dev, udc_controller->ep_qh_size, | 2142 | dma_free_coherent(dev->parent, udc_controller->ep_qh_size, |
2143 | udc_controller->ep_qh, udc_controller->ep_qh_dma); | 2143 | udc_controller->ep_qh, udc_controller->ep_qh_dma); |
2144 | kfree(udc_controller); | 2144 | kfree(udc_controller); |
2145 | } | 2145 | } |
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c index 749b53742828..e33d36256350 100644 --- a/drivers/usb/host/r8a66597-hcd.c +++ b/drivers/usb/host/r8a66597-hcd.c | |||
@@ -1003,19 +1003,20 @@ static void r8a66597_check_syssts(struct r8a66597 *r8a66597, int port, | |||
1003 | if (syssts == SE0) { | 1003 | if (syssts == SE0) { |
1004 | r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); | 1004 | r8a66597_write(r8a66597, ~ATTCH, get_intsts_reg(port)); |
1005 | r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); | 1005 | r8a66597_bset(r8a66597, ATTCHE, get_intenb_reg(port)); |
1006 | return; | 1006 | } else { |
1007 | } | 1007 | if (syssts == FS_JSTS) |
1008 | r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); | ||
1009 | else if (syssts == LS_JSTS) | ||
1010 | r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); | ||
1008 | 1011 | ||
1009 | if (syssts == FS_JSTS) | 1012 | r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port)); |
1010 | r8a66597_bset(r8a66597, HSE, get_syscfg_reg(port)); | 1013 | r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port)); |
1011 | else if (syssts == LS_JSTS) | ||
1012 | r8a66597_bclr(r8a66597, HSE, get_syscfg_reg(port)); | ||
1013 | 1014 | ||
1014 | r8a66597_write(r8a66597, ~DTCH, get_intsts_reg(port)); | 1015 | if (r8a66597->bus_suspended) |
1015 | r8a66597_bset(r8a66597, DTCHE, get_intenb_reg(port)); | 1016 | usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); |
1017 | } | ||
1016 | 1018 | ||
1017 | if (r8a66597->bus_suspended) | 1019 | usb_hcd_poll_rh_status(r8a66597_to_hcd(r8a66597)); |
1018 | usb_hcd_resume_root_hub(r8a66597_to_hcd(r8a66597)); | ||
1019 | } | 1020 | } |
1020 | 1021 | ||
1021 | /* this function must be called with interrupt disabled */ | 1022 | /* this function must be called with interrupt disabled */ |
@@ -1024,6 +1025,8 @@ static void r8a66597_usb_connect(struct r8a66597 *r8a66597, int port) | |||
1024 | u16 speed = get_rh_usb_speed(r8a66597, port); | 1025 | u16 speed = get_rh_usb_speed(r8a66597, port); |
1025 | struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; | 1026 | struct r8a66597_root_hub *rh = &r8a66597->root_hub[port]; |
1026 | 1027 | ||
1028 | rh->port &= ~((1 << USB_PORT_FEAT_HIGHSPEED) | | ||
1029 | (1 << USB_PORT_FEAT_LOWSPEED)); | ||
1027 | if (speed == HSMODE) | 1030 | if (speed == HSMODE) |
1028 | rh->port |= (1 << USB_PORT_FEAT_HIGHSPEED); | 1031 | rh->port |= (1 << USB_PORT_FEAT_HIGHSPEED); |
1029 | else if (speed == LSMODE) | 1032 | else if (speed == LSMODE) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 65d96b214f95..cd44c68954df 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -315,6 +315,9 @@ static int option_resume(struct usb_serial *serial); | |||
315 | #define QISDA_PRODUCT_H20_4515 0x4515 | 315 | #define QISDA_PRODUCT_H20_4515 0x4515 |
316 | #define QISDA_PRODUCT_H20_4519 0x4519 | 316 | #define QISDA_PRODUCT_H20_4519 0x4519 |
317 | 317 | ||
318 | /* TLAYTECH PRODUCTS */ | ||
319 | #define TLAYTECH_VENDOR_ID 0x20B9 | ||
320 | #define TLAYTECH_PRODUCT_TEU800 0x1682 | ||
318 | 321 | ||
319 | /* TOSHIBA PRODUCTS */ | 322 | /* TOSHIBA PRODUCTS */ |
320 | #define TOSHIBA_VENDOR_ID 0x0930 | 323 | #define TOSHIBA_VENDOR_ID 0x0930 |
@@ -593,6 +596,7 @@ static struct usb_device_id option_ids[] = { | |||
593 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, | 596 | { USB_DEVICE_AND_INTERFACE_INFO(ALINK_VENDOR_ID, ALINK_PRODUCT_3GU, 0xff, 0xff, 0xff) }, |
594 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, | 597 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, |
595 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 598 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
599 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | ||
596 | { } /* Terminating entry */ | 600 | { } /* Terminating entry */ |
597 | }; | 601 | }; |
598 | MODULE_DEVICE_TABLE(usb, option_ids); | 602 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 45883988a005..5019325ba25d 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -296,7 +296,6 @@ struct sierra_port_private { | |||
296 | int dsr_state; | 296 | int dsr_state; |
297 | int dcd_state; | 297 | int dcd_state; |
298 | int ri_state; | 298 | int ri_state; |
299 | |||
300 | unsigned int opened:1; | 299 | unsigned int opened:1; |
301 | }; | 300 | }; |
302 | 301 | ||
@@ -306,6 +305,8 @@ static int sierra_send_setup(struct usb_serial_port *port) | |||
306 | struct sierra_port_private *portdata; | 305 | struct sierra_port_private *portdata; |
307 | __u16 interface = 0; | 306 | __u16 interface = 0; |
308 | int val = 0; | 307 | int val = 0; |
308 | int do_send = 0; | ||
309 | int retval; | ||
309 | 310 | ||
310 | dev_dbg(&port->dev, "%s\n", __func__); | 311 | dev_dbg(&port->dev, "%s\n", __func__); |
311 | 312 | ||
@@ -324,10 +325,7 @@ static int sierra_send_setup(struct usb_serial_port *port) | |||
324 | */ | 325 | */ |
325 | if (port->interrupt_in_urb) { | 326 | if (port->interrupt_in_urb) { |
326 | /* send control message */ | 327 | /* send control message */ |
327 | return usb_control_msg(serial->dev, | 328 | do_send = 1; |
328 | usb_rcvctrlpipe(serial->dev, 0), | ||
329 | 0x22, 0x21, val, interface, | ||
330 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
331 | } | 329 | } |
332 | } | 330 | } |
333 | 331 | ||
@@ -339,12 +337,18 @@ static int sierra_send_setup(struct usb_serial_port *port) | |||
339 | interface = 1; | 337 | interface = 1; |
340 | else if (port->bulk_out_endpointAddress == 5) | 338 | else if (port->bulk_out_endpointAddress == 5) |
341 | interface = 2; | 339 | interface = 2; |
342 | return usb_control_msg(serial->dev, | 340 | |
343 | usb_rcvctrlpipe(serial->dev, 0), | 341 | do_send = 1; |
344 | 0x22, 0x21, val, interface, | ||
345 | NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
346 | } | 342 | } |
347 | return 0; | 343 | if (!do_send) |
344 | return 0; | ||
345 | |||
346 | usb_autopm_get_interface(serial->interface); | ||
347 | retval = usb_control_msg(serial->dev, usb_rcvctrlpipe(serial->dev, 0), | ||
348 | 0x22, 0x21, val, interface, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
349 | usb_autopm_put_interface(serial->interface); | ||
350 | |||
351 | return retval; | ||
348 | } | 352 | } |
349 | 353 | ||
350 | static void sierra_set_termios(struct tty_struct *tty, | 354 | static void sierra_set_termios(struct tty_struct *tty, |
@@ -773,8 +777,11 @@ static void sierra_close(struct usb_serial_port *port) | |||
773 | 777 | ||
774 | if (serial->dev) { | 778 | if (serial->dev) { |
775 | mutex_lock(&serial->disc_mutex); | 779 | mutex_lock(&serial->disc_mutex); |
776 | if (!serial->disconnected) | 780 | if (!serial->disconnected) { |
781 | serial->interface->needs_remote_wakeup = 0; | ||
782 | usb_autopm_get_interface(serial->interface); | ||
777 | sierra_send_setup(port); | 783 | sierra_send_setup(port); |
784 | } | ||
778 | mutex_unlock(&serial->disc_mutex); | 785 | mutex_unlock(&serial->disc_mutex); |
779 | spin_lock_irq(&intfdata->susp_lock); | 786 | spin_lock_irq(&intfdata->susp_lock); |
780 | portdata->opened = 0; | 787 | portdata->opened = 0; |
@@ -788,8 +795,6 @@ static void sierra_close(struct usb_serial_port *port) | |||
788 | sierra_release_urb(portdata->in_urbs[i]); | 795 | sierra_release_urb(portdata->in_urbs[i]); |
789 | portdata->in_urbs[i] = NULL; | 796 | portdata->in_urbs[i] = NULL; |
790 | } | 797 | } |
791 | usb_autopm_get_interface(serial->interface); | ||
792 | serial->interface->needs_remote_wakeup = 0; | ||
793 | } | 798 | } |
794 | } | 799 | } |
795 | 800 | ||
@@ -827,6 +832,8 @@ static int sierra_open(struct tty_struct *tty, struct usb_serial_port *port) | |||
827 | if (err) { | 832 | if (err) { |
828 | /* get rid of everything as in close */ | 833 | /* get rid of everything as in close */ |
829 | sierra_close(port); | 834 | sierra_close(port); |
835 | /* restore balance for autopm */ | ||
836 | usb_autopm_put_interface(serial->interface); | ||
830 | return err; | 837 | return err; |
831 | } | 838 | } |
832 | sierra_send_setup(port); | 839 | sierra_send_setup(port); |
@@ -915,7 +922,7 @@ static void sierra_release(struct usb_serial *serial) | |||
915 | #ifdef CONFIG_PM | 922 | #ifdef CONFIG_PM |
916 | static void stop_read_write_urbs(struct usb_serial *serial) | 923 | static void stop_read_write_urbs(struct usb_serial *serial) |
917 | { | 924 | { |
918 | int i, j; | 925 | int i; |
919 | struct usb_serial_port *port; | 926 | struct usb_serial_port *port; |
920 | struct sierra_port_private *portdata; | 927 | struct sierra_port_private *portdata; |
921 | 928 | ||
@@ -923,8 +930,7 @@ static void stop_read_write_urbs(struct usb_serial *serial) | |||
923 | for (i = 0; i < serial->num_ports; ++i) { | 930 | for (i = 0; i < serial->num_ports; ++i) { |
924 | port = serial->port[i]; | 931 | port = serial->port[i]; |
925 | portdata = usb_get_serial_port_data(port); | 932 | portdata = usb_get_serial_port_data(port); |
926 | for (j = 0; j < N_IN_URB; j++) | 933 | sierra_stop_rx_urbs(port); |
927 | usb_kill_urb(portdata->in_urbs[j]); | ||
928 | usb_kill_anchored_urbs(&portdata->active); | 934 | usb_kill_anchored_urbs(&portdata->active); |
929 | } | 935 | } |
930 | } | 936 | } |
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 200c22f55130..9dd588042880 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c | |||
@@ -19,7 +19,6 @@ | |||
19 | */ | 19 | */ |
20 | //#define DEBUG | 20 | //#define DEBUG |
21 | #include <linux/virtio.h> | 21 | #include <linux/virtio.h> |
22 | #include <linux/virtio_ids.h> | ||
23 | #include <linux/virtio_balloon.h> | 22 | #include <linux/virtio_balloon.h> |
24 | #include <linux/swap.h> | 23 | #include <linux/swap.h> |
25 | #include <linux/kthread.h> | 24 | #include <linux/kthread.h> |
@@ -248,7 +247,7 @@ out: | |||
248 | return err; | 247 | return err; |
249 | } | 248 | } |
250 | 249 | ||
251 | static void virtballoon_remove(struct virtio_device *vdev) | 250 | static void __devexit virtballoon_remove(struct virtio_device *vdev) |
252 | { | 251 | { |
253 | struct virtio_balloon *vb = vdev->priv; | 252 | struct virtio_balloon *vb = vdev->priv; |
254 | 253 | ||
diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 4a1f1ebff7bf..28d9cf7cf72f 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c | |||
@@ -530,19 +530,22 @@ static int vp_try_to_find_vqs(struct virtio_device *vdev, unsigned nvqs, | |||
530 | err = PTR_ERR(vqs[i]); | 530 | err = PTR_ERR(vqs[i]); |
531 | goto error_find; | 531 | goto error_find; |
532 | } | 532 | } |
533 | |||
534 | if (!vp_dev->per_vq_vectors || msix_vec == VIRTIO_MSI_NO_VECTOR) | ||
535 | continue; | ||
536 | |||
533 | /* allocate per-vq irq if available and necessary */ | 537 | /* allocate per-vq irq if available and necessary */ |
534 | if (vp_dev->per_vq_vectors) { | 538 | snprintf(vp_dev->msix_names[msix_vec], |
535 | snprintf(vp_dev->msix_names[msix_vec], | 539 | sizeof *vp_dev->msix_names, |
536 | sizeof *vp_dev->msix_names, | 540 | "%s-%s", |
537 | "%s-%s", | 541 | dev_name(&vp_dev->vdev.dev), names[i]); |
538 | dev_name(&vp_dev->vdev.dev), names[i]); | 542 | err = request_irq(vp_dev->msix_entries[msix_vec].vector, |
539 | err = request_irq(msix_vec, vring_interrupt, 0, | 543 | vring_interrupt, 0, |
540 | vp_dev->msix_names[msix_vec], | 544 | vp_dev->msix_names[msix_vec], |
541 | vqs[i]); | 545 | vqs[i]); |
542 | if (err) { | 546 | if (err) { |
543 | vp_del_vq(vqs[i]); | 547 | vp_del_vq(vqs[i]); |
544 | goto error_find; | 548 | goto error_find; |
545 | } | ||
546 | } | 549 | } |
547 | } | 550 | } |
548 | return 0; | 551 | return 0; |
diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c index f53600580726..fbd2ecde93e4 100644 --- a/drivers/virtio/virtio_ring.c +++ b/drivers/virtio/virtio_ring.c | |||
@@ -285,6 +285,9 @@ static void *vring_get_buf(struct virtqueue *_vq, unsigned int *len) | |||
285 | return NULL; | 285 | return NULL; |
286 | } | 286 | } |
287 | 287 | ||
288 | /* Only get used array entries after they have been exposed by host. */ | ||
289 | rmb(); | ||
290 | |||
288 | i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id; | 291 | i = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].id; |
289 | *len = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].len; | 292 | *len = vq->vring.used->ring[vq->last_used_idx%vq->vring.num].len; |
290 | 293 | ||