diff options
author | David S. Miller <davem@davemloft.net> | 2008-05-15 03:34:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-05-15 03:34:44 -0400 |
commit | 63fe46da9c380b3f2bbdf3765044649517cc717c (patch) | |
tree | 9478c1aca1d692b408955aea20c9cd9a37e589c0 /drivers | |
parent | 99dd1a2b8347ac2ae802300b7862f6f7bcf17139 (diff) | |
parent | 066b2118976e6e7cc50eed39e2747c75343a23c4 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-4965-rs.c
drivers/net/wireless/rt2x00/rt61pci.c
Diffstat (limited to 'drivers')
366 files changed, 16360 insertions, 4944 deletions
diff --git a/drivers/accessibility/Kconfig b/drivers/accessibility/Kconfig index 1264c4b98094..ef3b65bfdd0a 100644 --- a/drivers/accessibility/Kconfig +++ b/drivers/accessibility/Kconfig | |||
@@ -1,7 +1,17 @@ | |||
1 | menuconfig ACCESSIBILITY | 1 | menuconfig ACCESSIBILITY |
2 | bool "Accessibility support" | 2 | bool "Accessibility support" |
3 | ---help--- | 3 | ---help--- |
4 | Enable a submenu where accessibility items may be enabled. | 4 | Accessibility handles all special kinds of hardware devices or |
5 | software adapters which help people with disabilities (e.g. | ||
6 | blindness) to use computers. | ||
7 | |||
8 | That includes braille devices, speech synthesis, keyboard | ||
9 | remapping, etc. | ||
10 | |||
11 | Say Y here to get to see options for accessibility. | ||
12 | This option alone does not add any kernel code. | ||
13 | |||
14 | If you say N, all options in this submenu will be skipped and disabled. | ||
5 | 15 | ||
6 | If unsure, say N. | 16 | If unsure, say N. |
7 | 17 | ||
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index 1c11df9a5f32..9bf2986a2788 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -205,8 +205,8 @@ config SATA_VITESSE | |||
205 | If unsure, say N. | 205 | If unsure, say N. |
206 | 206 | ||
207 | config SATA_INIC162X | 207 | config SATA_INIC162X |
208 | tristate "Initio 162x SATA support (HIGHLY EXPERIMENTAL)" | 208 | tristate "Initio 162x SATA support" |
209 | depends on PCI && EXPERIMENTAL | 209 | depends on PCI |
210 | help | 210 | help |
211 | This option enables support for Initio 162x Serial ATA. | 211 | This option enables support for Initio 162x Serial ATA. |
212 | 212 | ||
@@ -697,6 +697,15 @@ config PATA_SCC | |||
697 | 697 | ||
698 | If unsure, say N. | 698 | If unsure, say N. |
699 | 699 | ||
700 | config PATA_SCH | ||
701 | tristate "Intel SCH PATA support" | ||
702 | depends on PCI | ||
703 | help | ||
704 | This option enables support for Intel SCH PATA on the Intel | ||
705 | SCH (US15W, US15L, UL11L) series host controllers. | ||
706 | |||
707 | If unsure, say N. | ||
708 | |||
700 | config PATA_BF54X | 709 | config PATA_BF54X |
701 | tristate "Blackfin 54x ATAPI support" | 710 | tristate "Blackfin 54x ATAPI support" |
702 | depends on BF542 || BF548 || BF549 | 711 | depends on BF542 || BF548 || BF549 |
diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index b693d829383a..674965fa326d 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile | |||
@@ -67,6 +67,7 @@ obj-$(CONFIG_PATA_SIS) += pata_sis.o | |||
67 | obj-$(CONFIG_PATA_TRIFLEX) += pata_triflex.o | 67 | obj-$(CONFIG_PATA_TRIFLEX) += pata_triflex.o |
68 | obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp4xx_cf.o | 68 | obj-$(CONFIG_PATA_IXP4XX_CF) += pata_ixp4xx_cf.o |
69 | obj-$(CONFIG_PATA_SCC) += pata_scc.o | 69 | obj-$(CONFIG_PATA_SCC) += pata_scc.o |
70 | obj-$(CONFIG_PATA_SCH) += pata_sch.o | ||
70 | obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o | 71 | obj-$(CONFIG_PATA_BF54X) += pata_bf54x.o |
71 | obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o | 72 | obj-$(CONFIG_PATA_PLATFORM) += pata_platform.o |
72 | obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o | 73 | obj-$(CONFIG_PATA_OF_PLATFORM) += pata_of_platform.o |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 8cace9aa9c03..97f83fb2ee2e 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -1267,9 +1267,7 @@ static int ahci_check_ready(struct ata_link *link) | |||
1267 | void __iomem *port_mmio = ahci_port_base(link->ap); | 1267 | void __iomem *port_mmio = ahci_port_base(link->ap); |
1268 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF; | 1268 | u8 status = readl(port_mmio + PORT_TFDATA) & 0xFF; |
1269 | 1269 | ||
1270 | if (!(status & ATA_BUSY)) | 1270 | return ata_check_ready(status); |
1271 | return 1; | ||
1272 | return 0; | ||
1273 | } | 1271 | } |
1274 | 1272 | ||
1275 | static int ahci_softreset(struct ata_link *link, unsigned int *class, | 1273 | static int ahci_softreset(struct ata_link *link, unsigned int *class, |
diff --git a/drivers/ata/ata_generic.c b/drivers/ata/ata_generic.c index 47aeccd52fa9..75a406f5e694 100644 --- a/drivers/ata/ata_generic.c +++ b/drivers/ata/ata_generic.c | |||
@@ -152,6 +152,12 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id | |||
152 | if (dev->vendor == PCI_VENDOR_ID_AL) | 152 | if (dev->vendor == PCI_VENDOR_ID_AL) |
153 | ata_pci_bmdma_clear_simplex(dev); | 153 | ata_pci_bmdma_clear_simplex(dev); |
154 | 154 | ||
155 | if (dev->vendor == PCI_VENDOR_ID_ATI) { | ||
156 | int rc = pcim_enable_device(dev); | ||
157 | if (rc < 0) | ||
158 | return rc; | ||
159 | pcim_pin_device(dev); | ||
160 | } | ||
155 | return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL); | 161 | return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL); |
156 | } | 162 | } |
157 | 163 | ||
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index ea2c7649d399..a9027b8fbdd5 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -1348,6 +1348,8 @@ static void __devinit piix_init_sidpr(struct ata_host *host) | |||
1348 | { | 1348 | { |
1349 | struct pci_dev *pdev = to_pci_dev(host->dev); | 1349 | struct pci_dev *pdev = to_pci_dev(host->dev); |
1350 | struct piix_host_priv *hpriv = host->private_data; | 1350 | struct piix_host_priv *hpriv = host->private_data; |
1351 | struct ata_device *dev0 = &host->ports[0]->link.device[0]; | ||
1352 | u32 scontrol; | ||
1351 | int i; | 1353 | int i; |
1352 | 1354 | ||
1353 | /* check for availability */ | 1355 | /* check for availability */ |
@@ -1366,6 +1368,29 @@ static void __devinit piix_init_sidpr(struct ata_host *host) | |||
1366 | return; | 1368 | return; |
1367 | 1369 | ||
1368 | hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR]; | 1370 | hpriv->sidpr = pcim_iomap_table(pdev)[PIIX_SIDPR_BAR]; |
1371 | |||
1372 | /* SCR access via SIDPR doesn't work on some configurations. | ||
1373 | * Give it a test drive by inhibiting power save modes which | ||
1374 | * we'll do anyway. | ||
1375 | */ | ||
1376 | scontrol = piix_sidpr_read(dev0, SCR_CONTROL); | ||
1377 | |||
1378 | /* if IPM is already 3, SCR access is probably working. Don't | ||
1379 | * un-inhibit power save modes as BIOS might have inhibited | ||
1380 | * them for a reason. | ||
1381 | */ | ||
1382 | if ((scontrol & 0xf00) != 0x300) { | ||
1383 | scontrol |= 0x300; | ||
1384 | piix_sidpr_write(dev0, SCR_CONTROL, scontrol); | ||
1385 | scontrol = piix_sidpr_read(dev0, SCR_CONTROL); | ||
1386 | |||
1387 | if ((scontrol & 0xf00) != 0x300) { | ||
1388 | dev_printk(KERN_INFO, host->dev, "SCR access via " | ||
1389 | "SIDPR is available but doesn't work\n"); | ||
1390 | return; | ||
1391 | } | ||
1392 | } | ||
1393 | |||
1369 | host->ports[0]->ops = &piix_sidpr_sata_ops; | 1394 | host->ports[0]->ops = &piix_sidpr_sata_ops; |
1370 | host->ports[1]->ops = &piix_sidpr_sata_ops; | 1395 | host->ports[1]->ops = &piix_sidpr_sata_ops; |
1371 | } | 1396 | } |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3bc488538204..927b692d723c 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -6292,6 +6292,7 @@ EXPORT_SYMBOL_GPL(ata_eh_freeze_port); | |||
6292 | EXPORT_SYMBOL_GPL(ata_eh_thaw_port); | 6292 | EXPORT_SYMBOL_GPL(ata_eh_thaw_port); |
6293 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); | 6293 | EXPORT_SYMBOL_GPL(ata_eh_qc_complete); |
6294 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); | 6294 | EXPORT_SYMBOL_GPL(ata_eh_qc_retry); |
6295 | EXPORT_SYMBOL_GPL(ata_eh_analyze_ncq_error); | ||
6295 | EXPORT_SYMBOL_GPL(ata_do_eh); | 6296 | EXPORT_SYMBOL_GPL(ata_do_eh); |
6296 | EXPORT_SYMBOL_GPL(ata_std_error_handler); | 6297 | EXPORT_SYMBOL_GPL(ata_std_error_handler); |
6297 | 6298 | ||
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 61dcd0026c64..62e033146bed 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1357,7 +1357,7 @@ static void ata_eh_analyze_serror(struct ata_link *link) | |||
1357 | * LOCKING: | 1357 | * LOCKING: |
1358 | * Kernel thread context (may sleep). | 1358 | * Kernel thread context (may sleep). |
1359 | */ | 1359 | */ |
1360 | static void ata_eh_analyze_ncq_error(struct ata_link *link) | 1360 | void ata_eh_analyze_ncq_error(struct ata_link *link) |
1361 | { | 1361 | { |
1362 | struct ata_port *ap = link->ap; | 1362 | struct ata_port *ap = link->ap; |
1363 | struct ata_eh_context *ehc = &link->eh_context; | 1363 | struct ata_eh_context *ehc = &link->eh_context; |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index 2ec65a8fda79..3c2d2289f85e 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -314,11 +314,7 @@ static int ata_sff_check_ready(struct ata_link *link) | |||
314 | { | 314 | { |
315 | u8 status = link->ap->ops->sff_check_status(link->ap); | 315 | u8 status = link->ap->ops->sff_check_status(link->ap); |
316 | 316 | ||
317 | if (!(status & ATA_BUSY)) | 317 | return ata_check_ready(status); |
318 | return 1; | ||
319 | if (status == 0xff) | ||
320 | return -ENODEV; | ||
321 | return 0; | ||
322 | } | 318 | } |
323 | 319 | ||
324 | /** | 320 | /** |
diff --git a/drivers/ata/pata_acpi.c b/drivers/ata/pata_acpi.c index c5f91e629945..fbe605711554 100644 --- a/drivers/ata/pata_acpi.c +++ b/drivers/ata/pata_acpi.c | |||
@@ -259,6 +259,12 @@ static int pacpi_init_one (struct pci_dev *pdev, const struct pci_device_id *id) | |||
259 | .port_ops = &pacpi_ops, | 259 | .port_ops = &pacpi_ops, |
260 | }; | 260 | }; |
261 | const struct ata_port_info *ppi[] = { &info, NULL }; | 261 | const struct ata_port_info *ppi[] = { &info, NULL }; |
262 | if (pdev->vendor == PCI_VENDOR_ID_ATI) { | ||
263 | int rc = pcim_enable_device(pdev); | ||
264 | if (rc < 0) | ||
265 | return rc; | ||
266 | pcim_pin_device(pdev); | ||
267 | } | ||
262 | return ata_pci_sff_init_one(pdev, ppi, &pacpi_sht, NULL); | 268 | return ata_pci_sff_init_one(pdev, ppi, &pacpi_sht, NULL); |
263 | } | 269 | } |
264 | 270 | ||
diff --git a/drivers/ata/pata_sch.c b/drivers/ata/pata_sch.c new file mode 100644 index 000000000000..c8cc027789fe --- /dev/null +++ b/drivers/ata/pata_sch.c | |||
@@ -0,0 +1,206 @@ | |||
1 | /* | ||
2 | * pata_sch.c - Intel SCH PATA controllers | ||
3 | * | ||
4 | * Copyright (c) 2008 Alek Du <alek.du@intel.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License 2 as published | ||
8 | * by the Free Software Foundation. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; see the file COPYING. If not, write to | ||
17 | * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ||
18 | * | ||
19 | */ | ||
20 | |||
21 | /* | ||
22 | * Supports: | ||
23 | * Intel SCH (AF82US15W, AF82US15L, AF82UL11L) chipsets -- see spec at: | ||
24 | * http://download.intel.com/design/chipsets/embedded/datashts/319537.pdf | ||
25 | */ | ||
26 | |||
27 | #include <linux/kernel.h> | ||
28 | #include <linux/module.h> | ||
29 | #include <linux/pci.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/blkdev.h> | ||
32 | #include <linux/delay.h> | ||
33 | #include <linux/device.h> | ||
34 | #include <scsi/scsi_host.h> | ||
35 | #include <linux/libata.h> | ||
36 | #include <linux/dmi.h> | ||
37 | |||
38 | #define DRV_NAME "pata_sch" | ||
39 | #define DRV_VERSION "0.2" | ||
40 | |||
41 | /* see SCH datasheet page 351 */ | ||
42 | enum { | ||
43 | D0TIM = 0x80, /* Device 0 Timing Register */ | ||
44 | D1TIM = 0x84, /* Device 1 Timing Register */ | ||
45 | PM = 0x07, /* PIO Mode Bit Mask */ | ||
46 | MDM = (0x03 << 8), /* Multi-word DMA Mode Bit Mask */ | ||
47 | UDM = (0x07 << 16), /* Ultra DMA Mode Bit Mask */ | ||
48 | PPE = (1 << 30), /* Prefetch/Post Enable */ | ||
49 | USD = (1 << 31), /* Use Synchronous DMA */ | ||
50 | }; | ||
51 | |||
52 | static int sch_init_one(struct pci_dev *pdev, | ||
53 | const struct pci_device_id *ent); | ||
54 | static void sch_set_piomode(struct ata_port *ap, struct ata_device *adev); | ||
55 | static void sch_set_dmamode(struct ata_port *ap, struct ata_device *adev); | ||
56 | |||
57 | static const struct pci_device_id sch_pci_tbl[] = { | ||
58 | /* Intel SCH PATA Controller */ | ||
59 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SCH_IDE), 0 }, | ||
60 | { } /* terminate list */ | ||
61 | }; | ||
62 | |||
63 | static struct pci_driver sch_pci_driver = { | ||
64 | .name = DRV_NAME, | ||
65 | .id_table = sch_pci_tbl, | ||
66 | .probe = sch_init_one, | ||
67 | .remove = ata_pci_remove_one, | ||
68 | #ifdef CONFIG_PM | ||
69 | .suspend = ata_pci_device_suspend, | ||
70 | .resume = ata_pci_device_resume, | ||
71 | #endif | ||
72 | }; | ||
73 | |||
74 | static struct scsi_host_template sch_sht = { | ||
75 | ATA_BMDMA_SHT(DRV_NAME), | ||
76 | }; | ||
77 | |||
78 | static struct ata_port_operations sch_pata_ops = { | ||
79 | .inherits = &ata_bmdma_port_ops, | ||
80 | .cable_detect = ata_cable_unknown, | ||
81 | .set_piomode = sch_set_piomode, | ||
82 | .set_dmamode = sch_set_dmamode, | ||
83 | }; | ||
84 | |||
85 | static struct ata_port_info sch_port_info = { | ||
86 | .flags = 0, | ||
87 | .pio_mask = ATA_PIO4, /* pio0-4 */ | ||
88 | .mwdma_mask = ATA_MWDMA2, /* mwdma0-2 */ | ||
89 | .udma_mask = ATA_UDMA5, /* udma0-5 */ | ||
90 | .port_ops = &sch_pata_ops, | ||
91 | }; | ||
92 | |||
93 | MODULE_AUTHOR("Alek Du <alek.du@intel.com>"); | ||
94 | MODULE_DESCRIPTION("SCSI low-level driver for Intel SCH PATA controllers"); | ||
95 | MODULE_LICENSE("GPL"); | ||
96 | MODULE_DEVICE_TABLE(pci, sch_pci_tbl); | ||
97 | MODULE_VERSION(DRV_VERSION); | ||
98 | |||
99 | /** | ||
100 | * sch_set_piomode - Initialize host controller PATA PIO timings | ||
101 | * @ap: Port whose timings we are configuring | ||
102 | * @adev: ATA device | ||
103 | * | ||
104 | * Set PIO mode for device, in host controller PCI config space. | ||
105 | * | ||
106 | * LOCKING: | ||
107 | * None (inherited from caller). | ||
108 | */ | ||
109 | |||
110 | static void sch_set_piomode(struct ata_port *ap, struct ata_device *adev) | ||
111 | { | ||
112 | unsigned int pio = adev->pio_mode - XFER_PIO_0; | ||
113 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | ||
114 | unsigned int port = adev->devno ? D1TIM : D0TIM; | ||
115 | unsigned int data; | ||
116 | |||
117 | pci_read_config_dword(dev, port, &data); | ||
118 | /* see SCH datasheet page 351 */ | ||
119 | /* set PIO mode */ | ||
120 | data &= ~(PM | PPE); | ||
121 | data |= pio; | ||
122 | /* enable PPE for block device */ | ||
123 | if (adev->class == ATA_DEV_ATA) | ||
124 | data |= PPE; | ||
125 | pci_write_config_dword(dev, port, data); | ||
126 | } | ||
127 | |||
128 | /** | ||
129 | * sch_set_dmamode - Initialize host controller PATA DMA timings | ||
130 | * @ap: Port whose timings we are configuring | ||
131 | * @adev: ATA device | ||
132 | * | ||
133 | * Set MW/UDMA mode for device, in host controller PCI config space. | ||
134 | * | ||
135 | * LOCKING: | ||
136 | * None (inherited from caller). | ||
137 | */ | ||
138 | |||
139 | static void sch_set_dmamode(struct ata_port *ap, struct ata_device *adev) | ||
140 | { | ||
141 | unsigned int dma_mode = adev->dma_mode; | ||
142 | struct pci_dev *dev = to_pci_dev(ap->host->dev); | ||
143 | unsigned int port = adev->devno ? D1TIM : D0TIM; | ||
144 | unsigned int data; | ||
145 | |||
146 | pci_read_config_dword(dev, port, &data); | ||
147 | /* see SCH datasheet page 351 */ | ||
148 | if (dma_mode >= XFER_UDMA_0) { | ||
149 | /* enable Synchronous DMA mode */ | ||
150 | data |= USD; | ||
151 | data &= ~UDM; | ||
152 | data |= (dma_mode - XFER_UDMA_0) << 16; | ||
153 | } else { /* must be MWDMA mode, since we masked SWDMA already */ | ||
154 | data &= ~(USD | MDM); | ||
155 | data |= (dma_mode - XFER_MW_DMA_0) << 8; | ||
156 | } | ||
157 | pci_write_config_dword(dev, port, data); | ||
158 | } | ||
159 | |||
160 | /** | ||
161 | * sch_init_one - Register SCH ATA PCI device with kernel services | ||
162 | * @pdev: PCI device to register | ||
163 | * @ent: Entry in sch_pci_tbl matching with @pdev | ||
164 | * | ||
165 | * LOCKING: | ||
166 | * Inherited from PCI layer (may sleep). | ||
167 | * | ||
168 | * RETURNS: | ||
169 | * Zero on success, or -ERRNO value. | ||
170 | */ | ||
171 | |||
172 | static int __devinit sch_init_one(struct pci_dev *pdev, | ||
173 | const struct pci_device_id *ent) | ||
174 | { | ||
175 | static int printed_version; | ||
176 | const struct ata_port_info *ppi[] = { &sch_port_info, NULL }; | ||
177 | struct ata_host *host; | ||
178 | int rc; | ||
179 | |||
180 | if (!printed_version++) | ||
181 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
182 | "version " DRV_VERSION "\n"); | ||
183 | |||
184 | /* enable device and prepare host */ | ||
185 | rc = pcim_enable_device(pdev); | ||
186 | if (rc) | ||
187 | return rc; | ||
188 | rc = ata_pci_sff_prepare_host(pdev, ppi, &host); | ||
189 | if (rc) | ||
190 | return rc; | ||
191 | pci_set_master(pdev); | ||
192 | return ata_pci_sff_activate_host(host, ata_sff_interrupt, &sch_sht); | ||
193 | } | ||
194 | |||
195 | static int __init sch_init(void) | ||
196 | { | ||
197 | return pci_register_driver(&sch_pci_driver); | ||
198 | } | ||
199 | |||
200 | static void __exit sch_exit(void) | ||
201 | { | ||
202 | pci_unregister_driver(&sch_pci_driver); | ||
203 | } | ||
204 | |||
205 | module_init(sch_init); | ||
206 | module_exit(sch_exit); | ||
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index d27bb9a2568f..3ead02fe379e 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -10,13 +10,33 @@ | |||
10 | * right. Documentation is available at initio's website but it only | 10 | * right. Documentation is available at initio's website but it only |
11 | * documents registers (not programming model). | 11 | * documents registers (not programming model). |
12 | * | 12 | * |
13 | * - ATA disks work. | 13 | * This driver has interesting history. The first version was written |
14 | * - Hotplug works. | 14 | * from the documentation and a 2.4 IDE driver posted on a Taiwan |
15 | * - ATAPI read works but burning doesn't. This thing is really | 15 | * company, which didn't use any IDMA features and couldn't handle |
16 | * peculiar about ATAPI and I couldn't figure out how ATAPI PIO and | 16 | * LBA48. The resulting driver couldn't handle LBA48 devices either |
17 | * ATAPI DMA WRITE should be programmed. If you've got a clue, be | 17 | * making it pretty useless. |
18 | * my guest. | 18 | * |
19 | * - Both STR and STD work. | 19 | * After a while, initio picked the driver up, renamed it to |
20 | * sata_initio162x, updated it to use IDMA for ATA DMA commands and | ||
21 | * posted it on their website. It only used ATA_PROT_DMA for IDMA and | ||
22 | * attaching both devices and issuing IDMA and !IDMA commands | ||
23 | * simultaneously broke it due to PIRQ masking interaction but it did | ||
24 | * show how to use the IDMA (ADMA + some initio specific twists) | ||
25 | * engine. | ||
26 | * | ||
27 | * Then, I picked up their changes again and here's the usable driver | ||
28 | * which uses IDMA for everything. Everything works now including | ||
29 | * LBA48, CD/DVD burning, suspend/resume and hotplug. There are some | ||
30 | * issues tho. Result Tf is not resported properly, NCQ isn't | ||
31 | * supported yet and CD/DVD writing works with DMA assisted PIO | ||
32 | * protocol (which, for native SATA devices, shouldn't cause any | ||
33 | * noticeable difference). | ||
34 | * | ||
35 | * Anyways, so, here's finally a working driver for inic162x. Enjoy! | ||
36 | * | ||
37 | * initio: If you guys wanna improve the driver regarding result TF | ||
38 | * access and other stuff, please feel free to contact me. I'll be | ||
39 | * happy to assist. | ||
20 | */ | 40 | */ |
21 | 41 | ||
22 | #include <linux/kernel.h> | 42 | #include <linux/kernel.h> |
@@ -28,13 +48,19 @@ | |||
28 | #include <scsi/scsi_device.h> | 48 | #include <scsi/scsi_device.h> |
29 | 49 | ||
30 | #define DRV_NAME "sata_inic162x" | 50 | #define DRV_NAME "sata_inic162x" |
31 | #define DRV_VERSION "0.3" | 51 | #define DRV_VERSION "0.4" |
32 | 52 | ||
33 | enum { | 53 | enum { |
34 | MMIO_BAR = 5, | 54 | MMIO_BAR_PCI = 5, |
55 | MMIO_BAR_CARDBUS = 1, | ||
35 | 56 | ||
36 | NR_PORTS = 2, | 57 | NR_PORTS = 2, |
37 | 58 | ||
59 | IDMA_CPB_TBL_SIZE = 4 * 32, | ||
60 | |||
61 | INIC_DMA_BOUNDARY = 0xffffff, | ||
62 | |||
63 | HOST_ACTRL = 0x08, | ||
38 | HOST_CTL = 0x7c, | 64 | HOST_CTL = 0x7c, |
39 | HOST_STAT = 0x7e, | 65 | HOST_STAT = 0x7e, |
40 | HOST_IRQ_STAT = 0xbc, | 66 | HOST_IRQ_STAT = 0xbc, |
@@ -43,22 +69,37 @@ enum { | |||
43 | PORT_SIZE = 0x40, | 69 | PORT_SIZE = 0x40, |
44 | 70 | ||
45 | /* registers for ATA TF operation */ | 71 | /* registers for ATA TF operation */ |
46 | PORT_TF = 0x00, | 72 | PORT_TF_DATA = 0x00, |
47 | PORT_ALT_STAT = 0x08, | 73 | PORT_TF_FEATURE = 0x01, |
74 | PORT_TF_NSECT = 0x02, | ||
75 | PORT_TF_LBAL = 0x03, | ||
76 | PORT_TF_LBAM = 0x04, | ||
77 | PORT_TF_LBAH = 0x05, | ||
78 | PORT_TF_DEVICE = 0x06, | ||
79 | PORT_TF_COMMAND = 0x07, | ||
80 | PORT_TF_ALT_STAT = 0x08, | ||
48 | PORT_IRQ_STAT = 0x09, | 81 | PORT_IRQ_STAT = 0x09, |
49 | PORT_IRQ_MASK = 0x0a, | 82 | PORT_IRQ_MASK = 0x0a, |
50 | PORT_PRD_CTL = 0x0b, | 83 | PORT_PRD_CTL = 0x0b, |
51 | PORT_PRD_ADDR = 0x0c, | 84 | PORT_PRD_ADDR = 0x0c, |
52 | PORT_PRD_XFERLEN = 0x10, | 85 | PORT_PRD_XFERLEN = 0x10, |
86 | PORT_CPB_CPBLAR = 0x18, | ||
87 | PORT_CPB_PTQFIFO = 0x1c, | ||
53 | 88 | ||
54 | /* IDMA register */ | 89 | /* IDMA register */ |
55 | PORT_IDMA_CTL = 0x14, | 90 | PORT_IDMA_CTL = 0x14, |
91 | PORT_IDMA_STAT = 0x16, | ||
92 | |||
93 | PORT_RPQ_FIFO = 0x1e, | ||
94 | PORT_RPQ_CNT = 0x1f, | ||
56 | 95 | ||
57 | PORT_SCR = 0x20, | 96 | PORT_SCR = 0x20, |
58 | 97 | ||
59 | /* HOST_CTL bits */ | 98 | /* HOST_CTL bits */ |
60 | HCTL_IRQOFF = (1 << 8), /* global IRQ off */ | 99 | HCTL_IRQOFF = (1 << 8), /* global IRQ off */ |
61 | HCTL_PWRDWN = (1 << 13), /* power down PHYs */ | 100 | HCTL_FTHD0 = (1 << 10), /* fifo threshold 0 */ |
101 | HCTL_FTHD1 = (1 << 11), /* fifo threshold 1*/ | ||
102 | HCTL_PWRDWN = (1 << 12), /* power down PHYs */ | ||
62 | HCTL_SOFTRST = (1 << 13), /* global reset (no phy reset) */ | 103 | HCTL_SOFTRST = (1 << 13), /* global reset (no phy reset) */ |
63 | HCTL_RPGSEL = (1 << 15), /* register page select */ | 104 | HCTL_RPGSEL = (1 << 15), /* register page select */ |
64 | 105 | ||
@@ -81,9 +122,7 @@ enum { | |||
81 | PIRQ_PENDING = (1 << 7), /* port IRQ pending (STAT only) */ | 122 | PIRQ_PENDING = (1 << 7), /* port IRQ pending (STAT only) */ |
82 | 123 | ||
83 | PIRQ_ERR = PIRQ_OFFLINE | PIRQ_ONLINE | PIRQ_FATAL, | 124 | PIRQ_ERR = PIRQ_OFFLINE | PIRQ_ONLINE | PIRQ_FATAL, |
84 | 125 | PIRQ_MASK_DEFAULT = PIRQ_REPLY | PIRQ_ATA, | |
85 | PIRQ_MASK_DMA_READ = PIRQ_REPLY | PIRQ_ATA, | ||
86 | PIRQ_MASK_OTHER = PIRQ_REPLY | PIRQ_COMPLETE, | ||
87 | PIRQ_MASK_FREEZE = 0xff, | 126 | PIRQ_MASK_FREEZE = 0xff, |
88 | 127 | ||
89 | /* PORT_PRD_CTL bits */ | 128 | /* PORT_PRD_CTL bits */ |
@@ -96,20 +135,104 @@ enum { | |||
96 | IDMA_CTL_RST_IDMA = (1 << 5), /* reset IDMA machinary */ | 135 | IDMA_CTL_RST_IDMA = (1 << 5), /* reset IDMA machinary */ |
97 | IDMA_CTL_GO = (1 << 7), /* IDMA mode go */ | 136 | IDMA_CTL_GO = (1 << 7), /* IDMA mode go */ |
98 | IDMA_CTL_ATA_NIEN = (1 << 8), /* ATA IRQ disable */ | 137 | IDMA_CTL_ATA_NIEN = (1 << 8), /* ATA IRQ disable */ |
138 | |||
139 | /* PORT_IDMA_STAT bits */ | ||
140 | IDMA_STAT_PERR = (1 << 0), /* PCI ERROR MODE */ | ||
141 | IDMA_STAT_CPBERR = (1 << 1), /* ADMA CPB error */ | ||
142 | IDMA_STAT_LGCY = (1 << 3), /* ADMA legacy */ | ||
143 | IDMA_STAT_UIRQ = (1 << 4), /* ADMA unsolicited irq */ | ||
144 | IDMA_STAT_STPD = (1 << 5), /* ADMA stopped */ | ||
145 | IDMA_STAT_PSD = (1 << 6), /* ADMA pause */ | ||
146 | IDMA_STAT_DONE = (1 << 7), /* ADMA done */ | ||
147 | |||
148 | IDMA_STAT_ERR = IDMA_STAT_PERR | IDMA_STAT_CPBERR, | ||
149 | |||
150 | /* CPB Control Flags*/ | ||
151 | CPB_CTL_VALID = (1 << 0), /* CPB valid */ | ||
152 | CPB_CTL_QUEUED = (1 << 1), /* queued command */ | ||
153 | CPB_CTL_DATA = (1 << 2), /* data, rsvd in datasheet */ | ||
154 | CPB_CTL_IEN = (1 << 3), /* PCI interrupt enable */ | ||
155 | CPB_CTL_DEVDIR = (1 << 4), /* device direction control */ | ||
156 | |||
157 | /* CPB Response Flags */ | ||
158 | CPB_RESP_DONE = (1 << 0), /* ATA command complete */ | ||
159 | CPB_RESP_REL = (1 << 1), /* ATA release */ | ||
160 | CPB_RESP_IGNORED = (1 << 2), /* CPB ignored */ | ||
161 | CPB_RESP_ATA_ERR = (1 << 3), /* ATA command error */ | ||
162 | CPB_RESP_SPURIOUS = (1 << 4), /* ATA spurious interrupt error */ | ||
163 | CPB_RESP_UNDERFLOW = (1 << 5), /* APRD deficiency length error */ | ||
164 | CPB_RESP_OVERFLOW = (1 << 6), /* APRD exccess length error */ | ||
165 | CPB_RESP_CPB_ERR = (1 << 7), /* CPB error flag */ | ||
166 | |||
167 | /* PRD Control Flags */ | ||
168 | PRD_DRAIN = (1 << 1), /* ignore data excess */ | ||
169 | PRD_CDB = (1 << 2), /* atapi packet command pointer */ | ||
170 | PRD_DIRECT_INTR = (1 << 3), /* direct interrupt */ | ||
171 | PRD_DMA = (1 << 4), /* data transfer method */ | ||
172 | PRD_WRITE = (1 << 5), /* data dir, rsvd in datasheet */ | ||
173 | PRD_IOM = (1 << 6), /* io/memory transfer */ | ||
174 | PRD_END = (1 << 7), /* APRD chain end */ | ||
99 | }; | 175 | }; |
100 | 176 | ||
177 | /* Comman Parameter Block */ | ||
178 | struct inic_cpb { | ||
179 | u8 resp_flags; /* Response Flags */ | ||
180 | u8 error; /* ATA Error */ | ||
181 | u8 status; /* ATA Status */ | ||
182 | u8 ctl_flags; /* Control Flags */ | ||
183 | __le32 len; /* Total Transfer Length */ | ||
184 | __le32 prd; /* First PRD pointer */ | ||
185 | u8 rsvd[4]; | ||
186 | /* 16 bytes */ | ||
187 | u8 feature; /* ATA Feature */ | ||
188 | u8 hob_feature; /* ATA Ex. Feature */ | ||
189 | u8 device; /* ATA Device/Head */ | ||
190 | u8 mirctl; /* Mirror Control */ | ||
191 | u8 nsect; /* ATA Sector Count */ | ||
192 | u8 hob_nsect; /* ATA Ex. Sector Count */ | ||
193 | u8 lbal; /* ATA Sector Number */ | ||
194 | u8 hob_lbal; /* ATA Ex. Sector Number */ | ||
195 | u8 lbam; /* ATA Cylinder Low */ | ||
196 | u8 hob_lbam; /* ATA Ex. Cylinder Low */ | ||
197 | u8 lbah; /* ATA Cylinder High */ | ||
198 | u8 hob_lbah; /* ATA Ex. Cylinder High */ | ||
199 | u8 command; /* ATA Command */ | ||
200 | u8 ctl; /* ATA Control */ | ||
201 | u8 slave_error; /* Slave ATA Error */ | ||
202 | u8 slave_status; /* Slave ATA Status */ | ||
203 | /* 32 bytes */ | ||
204 | } __packed; | ||
205 | |||
206 | /* Physical Region Descriptor */ | ||
207 | struct inic_prd { | ||
208 | __le32 mad; /* Physical Memory Address */ | ||
209 | __le16 len; /* Transfer Length */ | ||
210 | u8 rsvd; | ||
211 | u8 flags; /* Control Flags */ | ||
212 | } __packed; | ||
213 | |||
214 | struct inic_pkt { | ||
215 | struct inic_cpb cpb; | ||
216 | struct inic_prd prd[LIBATA_MAX_PRD + 1]; /* + 1 for cdb */ | ||
217 | u8 cdb[ATAPI_CDB_LEN]; | ||
218 | } __packed; | ||
219 | |||
101 | struct inic_host_priv { | 220 | struct inic_host_priv { |
102 | u16 cached_hctl; | 221 | void __iomem *mmio_base; |
222 | u16 cached_hctl; | ||
103 | }; | 223 | }; |
104 | 224 | ||
105 | struct inic_port_priv { | 225 | struct inic_port_priv { |
106 | u8 dfl_prdctl; | 226 | struct inic_pkt *pkt; |
107 | u8 cached_prdctl; | 227 | dma_addr_t pkt_dma; |
108 | u8 cached_pirq_mask; | 228 | u32 *cpb_tbl; |
229 | dma_addr_t cpb_tbl_dma; | ||
109 | }; | 230 | }; |
110 | 231 | ||
111 | static struct scsi_host_template inic_sht = { | 232 | static struct scsi_host_template inic_sht = { |
112 | ATA_BMDMA_SHT(DRV_NAME), | 233 | ATA_BASE_SHT(DRV_NAME), |
234 | .sg_tablesize = LIBATA_MAX_PRD, /* maybe it can be larger? */ | ||
235 | .dma_boundary = INIC_DMA_BOUNDARY, | ||
113 | }; | 236 | }; |
114 | 237 | ||
115 | static const int scr_map[] = { | 238 | static const int scr_map[] = { |
@@ -120,54 +243,34 @@ static const int scr_map[] = { | |||
120 | 243 | ||
121 | static void __iomem *inic_port_base(struct ata_port *ap) | 244 | static void __iomem *inic_port_base(struct ata_port *ap) |
122 | { | 245 | { |
123 | return ap->host->iomap[MMIO_BAR] + ap->port_no * PORT_SIZE; | 246 | struct inic_host_priv *hpriv = ap->host->private_data; |
124 | } | ||
125 | |||
126 | static void __inic_set_pirq_mask(struct ata_port *ap, u8 mask) | ||
127 | { | ||
128 | void __iomem *port_base = inic_port_base(ap); | ||
129 | struct inic_port_priv *pp = ap->private_data; | ||
130 | 247 | ||
131 | writeb(mask, port_base + PORT_IRQ_MASK); | 248 | return hpriv->mmio_base + ap->port_no * PORT_SIZE; |
132 | pp->cached_pirq_mask = mask; | ||
133 | } | ||
134 | |||
135 | static void inic_set_pirq_mask(struct ata_port *ap, u8 mask) | ||
136 | { | ||
137 | struct inic_port_priv *pp = ap->private_data; | ||
138 | |||
139 | if (pp->cached_pirq_mask != mask) | ||
140 | __inic_set_pirq_mask(ap, mask); | ||
141 | } | 249 | } |
142 | 250 | ||
143 | static void inic_reset_port(void __iomem *port_base) | 251 | static void inic_reset_port(void __iomem *port_base) |
144 | { | 252 | { |
145 | void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; | 253 | void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; |
146 | u16 ctl; | ||
147 | 254 | ||
148 | ctl = readw(idma_ctl); | 255 | /* stop IDMA engine */ |
149 | ctl &= ~(IDMA_CTL_RST_IDMA | IDMA_CTL_ATA_NIEN | IDMA_CTL_GO); | 256 | readw(idma_ctl); /* flush */ |
257 | msleep(1); | ||
150 | 258 | ||
151 | /* mask IRQ and assert reset */ | 259 | /* mask IRQ and assert reset */ |
152 | writew(ctl | IDMA_CTL_RST_IDMA | IDMA_CTL_ATA_NIEN, idma_ctl); | 260 | writew(IDMA_CTL_RST_IDMA, idma_ctl); |
153 | readw(idma_ctl); /* flush */ | 261 | readw(idma_ctl); /* flush */ |
154 | |||
155 | /* give it some time */ | ||
156 | msleep(1); | 262 | msleep(1); |
157 | 263 | ||
158 | /* release reset */ | 264 | /* release reset */ |
159 | writew(ctl | IDMA_CTL_ATA_NIEN, idma_ctl); | 265 | writew(0, idma_ctl); |
160 | 266 | ||
161 | /* clear irq */ | 267 | /* clear irq */ |
162 | writeb(0xff, port_base + PORT_IRQ_STAT); | 268 | writeb(0xff, port_base + PORT_IRQ_STAT); |
163 | |||
164 | /* reenable ATA IRQ, turn off IDMA mode */ | ||
165 | writew(ctl, idma_ctl); | ||
166 | } | 269 | } |
167 | 270 | ||
168 | static int inic_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | 271 | static int inic_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) |
169 | { | 272 | { |
170 | void __iomem *scr_addr = ap->ioaddr.scr_addr; | 273 | void __iomem *scr_addr = inic_port_base(ap) + PORT_SCR; |
171 | void __iomem *addr; | 274 | void __iomem *addr; |
172 | 275 | ||
173 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 276 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) |
@@ -184,120 +287,126 @@ static int inic_scr_read(struct ata_port *ap, unsigned sc_reg, u32 *val) | |||
184 | 287 | ||
185 | static int inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) | 288 | static int inic_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val) |
186 | { | 289 | { |
187 | void __iomem *scr_addr = ap->ioaddr.scr_addr; | 290 | void __iomem *scr_addr = inic_port_base(ap) + PORT_SCR; |
188 | void __iomem *addr; | ||
189 | 291 | ||
190 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) | 292 | if (unlikely(sc_reg >= ARRAY_SIZE(scr_map))) |
191 | return -EINVAL; | 293 | return -EINVAL; |
192 | 294 | ||
193 | addr = scr_addr + scr_map[sc_reg] * 4; | ||
194 | writel(val, scr_addr + scr_map[sc_reg] * 4); | 295 | writel(val, scr_addr + scr_map[sc_reg] * 4); |
195 | return 0; | 296 | return 0; |
196 | } | 297 | } |
197 | 298 | ||
198 | /* | 299 | static void inic_stop_idma(struct ata_port *ap) |
199 | * In TF mode, inic162x is very similar to SFF device. TF registers | ||
200 | * function the same. DMA engine behaves similary using the same PRD | ||
201 | * format as BMDMA but different command register, interrupt and event | ||
202 | * notification methods are used. The following inic_bmdma_*() | ||
203 | * functions do the impedance matching. | ||
204 | */ | ||
205 | static void inic_bmdma_setup(struct ata_queued_cmd *qc) | ||
206 | { | 300 | { |
207 | struct ata_port *ap = qc->ap; | ||
208 | struct inic_port_priv *pp = ap->private_data; | ||
209 | void __iomem *port_base = inic_port_base(ap); | 301 | void __iomem *port_base = inic_port_base(ap); |
210 | int rw = qc->tf.flags & ATA_TFLAG_WRITE; | ||
211 | |||
212 | /* make sure device sees PRD table writes */ | ||
213 | wmb(); | ||
214 | |||
215 | /* load transfer length */ | ||
216 | writel(qc->nbytes, port_base + PORT_PRD_XFERLEN); | ||
217 | |||
218 | /* turn on DMA and specify data direction */ | ||
219 | pp->cached_prdctl = pp->dfl_prdctl | PRD_CTL_DMAEN; | ||
220 | if (!rw) | ||
221 | pp->cached_prdctl |= PRD_CTL_WR; | ||
222 | writeb(pp->cached_prdctl, port_base + PORT_PRD_CTL); | ||
223 | 302 | ||
224 | /* issue r/w command */ | 303 | readb(port_base + PORT_RPQ_FIFO); |
225 | ap->ops->sff_exec_command(ap, &qc->tf); | 304 | readb(port_base + PORT_RPQ_CNT); |
305 | writew(0, port_base + PORT_IDMA_CTL); | ||
226 | } | 306 | } |
227 | 307 | ||
228 | static void inic_bmdma_start(struct ata_queued_cmd *qc) | 308 | static void inic_host_err_intr(struct ata_port *ap, u8 irq_stat, u16 idma_stat) |
229 | { | 309 | { |
230 | struct ata_port *ap = qc->ap; | 310 | struct ata_eh_info *ehi = &ap->link.eh_info; |
231 | struct inic_port_priv *pp = ap->private_data; | 311 | struct inic_port_priv *pp = ap->private_data; |
232 | void __iomem *port_base = inic_port_base(ap); | 312 | struct inic_cpb *cpb = &pp->pkt->cpb; |
313 | bool freeze = false; | ||
233 | 314 | ||
234 | /* start host DMA transaction */ | 315 | ata_ehi_clear_desc(ehi); |
235 | pp->cached_prdctl |= PRD_CTL_START; | 316 | ata_ehi_push_desc(ehi, "irq_stat=0x%x idma_stat=0x%x", |
236 | writeb(pp->cached_prdctl, port_base + PORT_PRD_CTL); | 317 | irq_stat, idma_stat); |
237 | } | ||
238 | 318 | ||
239 | static void inic_bmdma_stop(struct ata_queued_cmd *qc) | 319 | inic_stop_idma(ap); |
240 | { | ||
241 | struct ata_port *ap = qc->ap; | ||
242 | struct inic_port_priv *pp = ap->private_data; | ||
243 | void __iomem *port_base = inic_port_base(ap); | ||
244 | 320 | ||
245 | /* stop DMA engine */ | 321 | if (irq_stat & (PIRQ_OFFLINE | PIRQ_ONLINE)) { |
246 | writeb(pp->dfl_prdctl, port_base + PORT_PRD_CTL); | 322 | ata_ehi_push_desc(ehi, "hotplug"); |
247 | } | 323 | ata_ehi_hotplugged(ehi); |
324 | freeze = true; | ||
325 | } | ||
248 | 326 | ||
249 | static u8 inic_bmdma_status(struct ata_port *ap) | 327 | if (idma_stat & IDMA_STAT_PERR) { |
250 | { | 328 | ata_ehi_push_desc(ehi, "PCI error"); |
251 | /* event is already verified by the interrupt handler */ | 329 | freeze = true; |
252 | return ATA_DMA_INTR; | 330 | } |
331 | |||
332 | if (idma_stat & IDMA_STAT_CPBERR) { | ||
333 | ata_ehi_push_desc(ehi, "CPB error"); | ||
334 | |||
335 | if (cpb->resp_flags & CPB_RESP_IGNORED) { | ||
336 | __ata_ehi_push_desc(ehi, " ignored"); | ||
337 | ehi->err_mask |= AC_ERR_INVALID; | ||
338 | freeze = true; | ||
339 | } | ||
340 | |||
341 | if (cpb->resp_flags & CPB_RESP_ATA_ERR) | ||
342 | ehi->err_mask |= AC_ERR_DEV; | ||
343 | |||
344 | if (cpb->resp_flags & CPB_RESP_SPURIOUS) { | ||
345 | __ata_ehi_push_desc(ehi, " spurious-intr"); | ||
346 | ehi->err_mask |= AC_ERR_HSM; | ||
347 | freeze = true; | ||
348 | } | ||
349 | |||
350 | if (cpb->resp_flags & | ||
351 | (CPB_RESP_UNDERFLOW | CPB_RESP_OVERFLOW)) { | ||
352 | __ata_ehi_push_desc(ehi, " data-over/underflow"); | ||
353 | ehi->err_mask |= AC_ERR_HSM; | ||
354 | freeze = true; | ||
355 | } | ||
356 | } | ||
357 | |||
358 | if (freeze) | ||
359 | ata_port_freeze(ap); | ||
360 | else | ||
361 | ata_port_abort(ap); | ||
253 | } | 362 | } |
254 | 363 | ||
255 | static void inic_host_intr(struct ata_port *ap) | 364 | static void inic_host_intr(struct ata_port *ap) |
256 | { | 365 | { |
257 | void __iomem *port_base = inic_port_base(ap); | 366 | void __iomem *port_base = inic_port_base(ap); |
258 | struct ata_eh_info *ehi = &ap->link.eh_info; | 367 | struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag); |
259 | u8 irq_stat; | 368 | u8 irq_stat; |
369 | u16 idma_stat; | ||
260 | 370 | ||
261 | /* fetch and clear irq */ | 371 | /* read and clear IRQ status */ |
262 | irq_stat = readb(port_base + PORT_IRQ_STAT); | 372 | irq_stat = readb(port_base + PORT_IRQ_STAT); |
263 | writeb(irq_stat, port_base + PORT_IRQ_STAT); | 373 | writeb(irq_stat, port_base + PORT_IRQ_STAT); |
374 | idma_stat = readw(port_base + PORT_IDMA_STAT); | ||
264 | 375 | ||
265 | if (likely(!(irq_stat & PIRQ_ERR))) { | 376 | if (unlikely((irq_stat & PIRQ_ERR) || (idma_stat & IDMA_STAT_ERR))) |
266 | struct ata_queued_cmd *qc = | 377 | inic_host_err_intr(ap, irq_stat, idma_stat); |
267 | ata_qc_from_tag(ap, ap->link.active_tag); | ||
268 | 378 | ||
269 | if (unlikely(!qc || (qc->tf.flags & ATA_TFLAG_POLLING))) { | 379 | if (unlikely(!qc)) |
270 | ap->ops->sff_check_status(ap); /* clear ATA interrupt */ | 380 | goto spurious; |
271 | return; | ||
272 | } | ||
273 | 381 | ||
274 | if (likely(ata_sff_host_intr(ap, qc))) | 382 | if (likely(idma_stat & IDMA_STAT_DONE)) { |
275 | return; | 383 | inic_stop_idma(ap); |
276 | 384 | ||
277 | ap->ops->sff_check_status(ap); /* clear ATA interrupt */ | 385 | /* Depending on circumstances, device error |
278 | ata_port_printk(ap, KERN_WARNING, "unhandled " | 386 | * isn't reported by IDMA, check it explicitly. |
279 | "interrupt, irq_stat=%x\n", irq_stat); | 387 | */ |
388 | if (unlikely(readb(port_base + PORT_TF_COMMAND) & | ||
389 | (ATA_DF | ATA_ERR))) | ||
390 | qc->err_mask |= AC_ERR_DEV; | ||
391 | |||
392 | ata_qc_complete(qc); | ||
280 | return; | 393 | return; |
281 | } | 394 | } |
282 | 395 | ||
283 | /* error */ | 396 | spurious: |
284 | ata_ehi_push_desc(ehi, "irq_stat=0x%x", irq_stat); | 397 | ata_port_printk(ap, KERN_WARNING, "unhandled interrupt: " |
285 | 398 | "cmd=0x%x irq_stat=0x%x idma_stat=0x%x\n", | |
286 | if (irq_stat & (PIRQ_OFFLINE | PIRQ_ONLINE)) { | 399 | qc ? qc->tf.command : 0xff, irq_stat, idma_stat); |
287 | ata_ehi_hotplugged(ehi); | ||
288 | ata_port_freeze(ap); | ||
289 | } else | ||
290 | ata_port_abort(ap); | ||
291 | } | 400 | } |
292 | 401 | ||
293 | static irqreturn_t inic_interrupt(int irq, void *dev_instance) | 402 | static irqreturn_t inic_interrupt(int irq, void *dev_instance) |
294 | { | 403 | { |
295 | struct ata_host *host = dev_instance; | 404 | struct ata_host *host = dev_instance; |
296 | void __iomem *mmio_base = host->iomap[MMIO_BAR]; | 405 | struct inic_host_priv *hpriv = host->private_data; |
297 | u16 host_irq_stat; | 406 | u16 host_irq_stat; |
298 | int i, handled = 0;; | 407 | int i, handled = 0;; |
299 | 408 | ||
300 | host_irq_stat = readw(mmio_base + HOST_IRQ_STAT); | 409 | host_irq_stat = readw(hpriv->mmio_base + HOST_IRQ_STAT); |
301 | 410 | ||
302 | if (unlikely(!(host_irq_stat & HIRQ_GLOBAL))) | 411 | if (unlikely(!(host_irq_stat & HIRQ_GLOBAL))) |
303 | goto out; | 412 | goto out; |
@@ -327,60 +436,173 @@ static irqreturn_t inic_interrupt(int irq, void *dev_instance) | |||
327 | return IRQ_RETVAL(handled); | 436 | return IRQ_RETVAL(handled); |
328 | } | 437 | } |
329 | 438 | ||
439 | static int inic_check_atapi_dma(struct ata_queued_cmd *qc) | ||
440 | { | ||
441 | /* For some reason ATAPI_PROT_DMA doesn't work for some | ||
442 | * commands including writes and other misc ops. Use PIO | ||
443 | * protocol instead, which BTW is driven by the DMA engine | ||
444 | * anyway, so it shouldn't make much difference for native | ||
445 | * SATA devices. | ||
446 | */ | ||
447 | if (atapi_cmd_type(qc->cdb[0]) == READ) | ||
448 | return 0; | ||
449 | return 1; | ||
450 | } | ||
451 | |||
452 | static void inic_fill_sg(struct inic_prd *prd, struct ata_queued_cmd *qc) | ||
453 | { | ||
454 | struct scatterlist *sg; | ||
455 | unsigned int si; | ||
456 | u8 flags = 0; | ||
457 | |||
458 | if (qc->tf.flags & ATA_TFLAG_WRITE) | ||
459 | flags |= PRD_WRITE; | ||
460 | |||
461 | if (ata_is_dma(qc->tf.protocol)) | ||
462 | flags |= PRD_DMA; | ||
463 | |||
464 | for_each_sg(qc->sg, sg, qc->n_elem, si) { | ||
465 | prd->mad = cpu_to_le32(sg_dma_address(sg)); | ||
466 | prd->len = cpu_to_le16(sg_dma_len(sg)); | ||
467 | prd->flags = flags; | ||
468 | prd++; | ||
469 | } | ||
470 | |||
471 | WARN_ON(!si); | ||
472 | prd[-1].flags |= PRD_END; | ||
473 | } | ||
474 | |||
475 | static void inic_qc_prep(struct ata_queued_cmd *qc) | ||
476 | { | ||
477 | struct inic_port_priv *pp = qc->ap->private_data; | ||
478 | struct inic_pkt *pkt = pp->pkt; | ||
479 | struct inic_cpb *cpb = &pkt->cpb; | ||
480 | struct inic_prd *prd = pkt->prd; | ||
481 | bool is_atapi = ata_is_atapi(qc->tf.protocol); | ||
482 | bool is_data = ata_is_data(qc->tf.protocol); | ||
483 | unsigned int cdb_len = 0; | ||
484 | |||
485 | VPRINTK("ENTER\n"); | ||
486 | |||
487 | if (is_atapi) | ||
488 | cdb_len = qc->dev->cdb_len; | ||
489 | |||
490 | /* prepare packet, based on initio driver */ | ||
491 | memset(pkt, 0, sizeof(struct inic_pkt)); | ||
492 | |||
493 | cpb->ctl_flags = CPB_CTL_VALID | CPB_CTL_IEN; | ||
494 | if (is_atapi || is_data) | ||
495 | cpb->ctl_flags |= CPB_CTL_DATA; | ||
496 | |||
497 | cpb->len = cpu_to_le32(qc->nbytes + cdb_len); | ||
498 | cpb->prd = cpu_to_le32(pp->pkt_dma + offsetof(struct inic_pkt, prd)); | ||
499 | |||
500 | cpb->device = qc->tf.device; | ||
501 | cpb->feature = qc->tf.feature; | ||
502 | cpb->nsect = qc->tf.nsect; | ||
503 | cpb->lbal = qc->tf.lbal; | ||
504 | cpb->lbam = qc->tf.lbam; | ||
505 | cpb->lbah = qc->tf.lbah; | ||
506 | |||
507 | if (qc->tf.flags & ATA_TFLAG_LBA48) { | ||
508 | cpb->hob_feature = qc->tf.hob_feature; | ||
509 | cpb->hob_nsect = qc->tf.hob_nsect; | ||
510 | cpb->hob_lbal = qc->tf.hob_lbal; | ||
511 | cpb->hob_lbam = qc->tf.hob_lbam; | ||
512 | cpb->hob_lbah = qc->tf.hob_lbah; | ||
513 | } | ||
514 | |||
515 | cpb->command = qc->tf.command; | ||
516 | /* don't load ctl - dunno why. it's like that in the initio driver */ | ||
517 | |||
518 | /* setup PRD for CDB */ | ||
519 | if (is_atapi) { | ||
520 | memcpy(pkt->cdb, qc->cdb, ATAPI_CDB_LEN); | ||
521 | prd->mad = cpu_to_le32(pp->pkt_dma + | ||
522 | offsetof(struct inic_pkt, cdb)); | ||
523 | prd->len = cpu_to_le16(cdb_len); | ||
524 | prd->flags = PRD_CDB | PRD_WRITE; | ||
525 | if (!is_data) | ||
526 | prd->flags |= PRD_END; | ||
527 | prd++; | ||
528 | } | ||
529 | |||
530 | /* setup sg table */ | ||
531 | if (is_data) | ||
532 | inic_fill_sg(prd, qc); | ||
533 | |||
534 | pp->cpb_tbl[0] = pp->pkt_dma; | ||
535 | } | ||
536 | |||
330 | static unsigned int inic_qc_issue(struct ata_queued_cmd *qc) | 537 | static unsigned int inic_qc_issue(struct ata_queued_cmd *qc) |
331 | { | 538 | { |
332 | struct ata_port *ap = qc->ap; | 539 | struct ata_port *ap = qc->ap; |
540 | void __iomem *port_base = inic_port_base(ap); | ||
333 | 541 | ||
334 | /* ATA IRQ doesn't wait for DMA transfer completion and vice | 542 | /* fire up the ADMA engine */ |
335 | * versa. Mask IRQ selectively to detect command completion. | 543 | writew(HCTL_FTHD0, port_base + HOST_CTL); |
336 | * Without it, ATA DMA read command can cause data corruption. | 544 | writew(IDMA_CTL_GO, port_base + PORT_IDMA_CTL); |
337 | * | 545 | writeb(0, port_base + PORT_CPB_PTQFIFO); |
338 | * Something similar might be needed for ATAPI writes. I | 546 | |
339 | * tried a lot of combinations but couldn't find the solution. | 547 | return 0; |
340 | */ | 548 | } |
341 | if (qc->tf.protocol == ATA_PROT_DMA && | 549 | |
342 | !(qc->tf.flags & ATA_TFLAG_WRITE)) | 550 | static void inic_tf_read(struct ata_port *ap, struct ata_taskfile *tf) |
343 | inic_set_pirq_mask(ap, PIRQ_MASK_DMA_READ); | 551 | { |
344 | else | 552 | void __iomem *port_base = inic_port_base(ap); |
345 | inic_set_pirq_mask(ap, PIRQ_MASK_OTHER); | 553 | |
554 | tf->feature = readb(port_base + PORT_TF_FEATURE); | ||
555 | tf->nsect = readb(port_base + PORT_TF_NSECT); | ||
556 | tf->lbal = readb(port_base + PORT_TF_LBAL); | ||
557 | tf->lbam = readb(port_base + PORT_TF_LBAM); | ||
558 | tf->lbah = readb(port_base + PORT_TF_LBAH); | ||
559 | tf->device = readb(port_base + PORT_TF_DEVICE); | ||
560 | tf->command = readb(port_base + PORT_TF_COMMAND); | ||
561 | } | ||
346 | 562 | ||
347 | /* Issuing a command to yet uninitialized port locks up the | 563 | static bool inic_qc_fill_rtf(struct ata_queued_cmd *qc) |
348 | * controller. Most of the time, this happens for the first | 564 | { |
349 | * command after reset which are ATA and ATAPI IDENTIFYs. | 565 | struct ata_taskfile *rtf = &qc->result_tf; |
350 | * Fast fail if stat is 0x7f or 0xff for those commands. | 566 | struct ata_taskfile tf; |
567 | |||
568 | /* FIXME: Except for status and error, result TF access | ||
569 | * doesn't work. I tried reading from BAR0/2, CPB and BAR5. | ||
570 | * None works regardless of which command interface is used. | ||
571 | * For now return true iff status indicates device error. | ||
572 | * This means that we're reporting bogus sector for RW | ||
573 | * failures. Eeekk.... | ||
351 | */ | 574 | */ |
352 | if (unlikely(qc->tf.command == ATA_CMD_ID_ATA || | 575 | inic_tf_read(qc->ap, &tf); |
353 | qc->tf.command == ATA_CMD_ID_ATAPI)) { | ||
354 | u8 stat = ap->ops->sff_check_status(ap); | ||
355 | if (stat == 0x7f || stat == 0xff) | ||
356 | return AC_ERR_HSM; | ||
357 | } | ||
358 | 576 | ||
359 | return ata_sff_qc_issue(qc); | 577 | if (!(tf.command & ATA_ERR)) |
578 | return false; | ||
579 | |||
580 | rtf->command = tf.command; | ||
581 | rtf->feature = tf.feature; | ||
582 | return true; | ||
360 | } | 583 | } |
361 | 584 | ||
362 | static void inic_freeze(struct ata_port *ap) | 585 | static void inic_freeze(struct ata_port *ap) |
363 | { | 586 | { |
364 | void __iomem *port_base = inic_port_base(ap); | 587 | void __iomem *port_base = inic_port_base(ap); |
365 | 588 | ||
366 | __inic_set_pirq_mask(ap, PIRQ_MASK_FREEZE); | 589 | writeb(PIRQ_MASK_FREEZE, port_base + PORT_IRQ_MASK); |
367 | |||
368 | ap->ops->sff_check_status(ap); | ||
369 | writeb(0xff, port_base + PORT_IRQ_STAT); | 590 | writeb(0xff, port_base + PORT_IRQ_STAT); |
370 | |||
371 | readb(port_base + PORT_IRQ_STAT); /* flush */ | ||
372 | } | 591 | } |
373 | 592 | ||
374 | static void inic_thaw(struct ata_port *ap) | 593 | static void inic_thaw(struct ata_port *ap) |
375 | { | 594 | { |
376 | void __iomem *port_base = inic_port_base(ap); | 595 | void __iomem *port_base = inic_port_base(ap); |
377 | 596 | ||
378 | ap->ops->sff_check_status(ap); | ||
379 | writeb(0xff, port_base + PORT_IRQ_STAT); | 597 | writeb(0xff, port_base + PORT_IRQ_STAT); |
598 | writeb(PIRQ_MASK_DEFAULT, port_base + PORT_IRQ_MASK); | ||
599 | } | ||
380 | 600 | ||
381 | __inic_set_pirq_mask(ap, PIRQ_MASK_OTHER); | 601 | static int inic_check_ready(struct ata_link *link) |
602 | { | ||
603 | void __iomem *port_base = inic_port_base(link->ap); | ||
382 | 604 | ||
383 | readb(port_base + PORT_IRQ_STAT); /* flush */ | 605 | return ata_check_ready(readb(port_base + PORT_TF_COMMAND)); |
384 | } | 606 | } |
385 | 607 | ||
386 | /* | 608 | /* |
@@ -394,17 +616,15 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
394 | void __iomem *port_base = inic_port_base(ap); | 616 | void __iomem *port_base = inic_port_base(ap); |
395 | void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; | 617 | void __iomem *idma_ctl = port_base + PORT_IDMA_CTL; |
396 | const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); | 618 | const unsigned long *timing = sata_ehc_deb_timing(&link->eh_context); |
397 | u16 val; | ||
398 | int rc; | 619 | int rc; |
399 | 620 | ||
400 | /* hammer it into sane state */ | 621 | /* hammer it into sane state */ |
401 | inic_reset_port(port_base); | 622 | inic_reset_port(port_base); |
402 | 623 | ||
403 | val = readw(idma_ctl); | 624 | writew(IDMA_CTL_RST_ATA, idma_ctl); |
404 | writew(val | IDMA_CTL_RST_ATA, idma_ctl); | ||
405 | readw(idma_ctl); /* flush */ | 625 | readw(idma_ctl); /* flush */ |
406 | msleep(1); | 626 | msleep(1); |
407 | writew(val & ~IDMA_CTL_RST_ATA, idma_ctl); | 627 | writew(0, idma_ctl); |
408 | 628 | ||
409 | rc = sata_link_resume(link, timing, deadline); | 629 | rc = sata_link_resume(link, timing, deadline); |
410 | if (rc) { | 630 | if (rc) { |
@@ -418,7 +638,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
418 | struct ata_taskfile tf; | 638 | struct ata_taskfile tf; |
419 | 639 | ||
420 | /* wait for link to become ready */ | 640 | /* wait for link to become ready */ |
421 | rc = ata_sff_wait_after_reset(link, 1, deadline); | 641 | rc = ata_wait_after_reset(link, deadline, inic_check_ready); |
422 | /* link occupied, -ENODEV too is an error */ | 642 | /* link occupied, -ENODEV too is an error */ |
423 | if (rc) { | 643 | if (rc) { |
424 | ata_link_printk(link, KERN_WARNING, "device not ready " | 644 | ata_link_printk(link, KERN_WARNING, "device not ready " |
@@ -426,7 +646,7 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
426 | return rc; | 646 | return rc; |
427 | } | 647 | } |
428 | 648 | ||
429 | ata_sff_tf_read(ap, &tf); | 649 | inic_tf_read(ap, &tf); |
430 | *class = ata_dev_classify(&tf); | 650 | *class = ata_dev_classify(&tf); |
431 | } | 651 | } |
432 | 652 | ||
@@ -436,18 +656,8 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
436 | static void inic_error_handler(struct ata_port *ap) | 656 | static void inic_error_handler(struct ata_port *ap) |
437 | { | 657 | { |
438 | void __iomem *port_base = inic_port_base(ap); | 658 | void __iomem *port_base = inic_port_base(ap); |
439 | struct inic_port_priv *pp = ap->private_data; | ||
440 | unsigned long flags; | ||
441 | 659 | ||
442 | /* reset PIO HSM and stop DMA engine */ | ||
443 | inic_reset_port(port_base); | 660 | inic_reset_port(port_base); |
444 | |||
445 | spin_lock_irqsave(ap->lock, flags); | ||
446 | ap->hsm_task_state = HSM_ST_IDLE; | ||
447 | writeb(pp->dfl_prdctl, port_base + PORT_PRD_CTL); | ||
448 | spin_unlock_irqrestore(ap->lock, flags); | ||
449 | |||
450 | /* PIO and DMA engines have been stopped, perform recovery */ | ||
451 | ata_std_error_handler(ap); | 661 | ata_std_error_handler(ap); |
452 | } | 662 | } |
453 | 663 | ||
@@ -458,26 +668,18 @@ static void inic_post_internal_cmd(struct ata_queued_cmd *qc) | |||
458 | inic_reset_port(inic_port_base(qc->ap)); | 668 | inic_reset_port(inic_port_base(qc->ap)); |
459 | } | 669 | } |
460 | 670 | ||
461 | static void inic_dev_config(struct ata_device *dev) | ||
462 | { | ||
463 | /* inic can only handle upto LBA28 max sectors */ | ||
464 | if (dev->max_sectors > ATA_MAX_SECTORS) | ||
465 | dev->max_sectors = ATA_MAX_SECTORS; | ||
466 | |||
467 | if (dev->n_sectors >= 1 << 28) { | ||
468 | ata_dev_printk(dev, KERN_ERR, | ||
469 | "ERROR: This driver doesn't support LBA48 yet and may cause\n" | ||
470 | " data corruption on such devices. Disabling.\n"); | ||
471 | ata_dev_disable(dev); | ||
472 | } | ||
473 | } | ||
474 | |||
475 | static void init_port(struct ata_port *ap) | 671 | static void init_port(struct ata_port *ap) |
476 | { | 672 | { |
477 | void __iomem *port_base = inic_port_base(ap); | 673 | void __iomem *port_base = inic_port_base(ap); |
674 | struct inic_port_priv *pp = ap->private_data; | ||
478 | 675 | ||
479 | /* Setup PRD address */ | 676 | /* clear packet and CPB table */ |
677 | memset(pp->pkt, 0, sizeof(struct inic_pkt)); | ||
678 | memset(pp->cpb_tbl, 0, IDMA_CPB_TBL_SIZE); | ||
679 | |||
680 | /* setup PRD and CPB lookup table addresses */ | ||
480 | writel(ap->prd_dma, port_base + PORT_PRD_ADDR); | 681 | writel(ap->prd_dma, port_base + PORT_PRD_ADDR); |
682 | writel(pp->cpb_tbl_dma, port_base + PORT_CPB_CPBLAR); | ||
481 | } | 683 | } |
482 | 684 | ||
483 | static int inic_port_resume(struct ata_port *ap) | 685 | static int inic_port_resume(struct ata_port *ap) |
@@ -488,28 +690,30 @@ static int inic_port_resume(struct ata_port *ap) | |||
488 | 690 | ||
489 | static int inic_port_start(struct ata_port *ap) | 691 | static int inic_port_start(struct ata_port *ap) |
490 | { | 692 | { |
491 | void __iomem *port_base = inic_port_base(ap); | 693 | struct device *dev = ap->host->dev; |
492 | struct inic_port_priv *pp; | 694 | struct inic_port_priv *pp; |
493 | u8 tmp; | ||
494 | int rc; | 695 | int rc; |
495 | 696 | ||
496 | /* alloc and initialize private data */ | 697 | /* alloc and initialize private data */ |
497 | pp = devm_kzalloc(ap->host->dev, sizeof(*pp), GFP_KERNEL); | 698 | pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL); |
498 | if (!pp) | 699 | if (!pp) |
499 | return -ENOMEM; | 700 | return -ENOMEM; |
500 | ap->private_data = pp; | 701 | ap->private_data = pp; |
501 | 702 | ||
502 | /* default PRD_CTL value, DMAEN, WR and START off */ | ||
503 | tmp = readb(port_base + PORT_PRD_CTL); | ||
504 | tmp &= ~(PRD_CTL_DMAEN | PRD_CTL_WR | PRD_CTL_START); | ||
505 | pp->dfl_prdctl = tmp; | ||
506 | |||
507 | /* Alloc resources */ | 703 | /* Alloc resources */ |
508 | rc = ata_port_start(ap); | 704 | rc = ata_port_start(ap); |
509 | if (rc) { | 705 | if (rc) |
510 | kfree(pp); | ||
511 | return rc; | 706 | return rc; |
512 | } | 707 | |
708 | pp->pkt = dmam_alloc_coherent(dev, sizeof(struct inic_pkt), | ||
709 | &pp->pkt_dma, GFP_KERNEL); | ||
710 | if (!pp->pkt) | ||
711 | return -ENOMEM; | ||
712 | |||
713 | pp->cpb_tbl = dmam_alloc_coherent(dev, IDMA_CPB_TBL_SIZE, | ||
714 | &pp->cpb_tbl_dma, GFP_KERNEL); | ||
715 | if (!pp->cpb_tbl) | ||
716 | return -ENOMEM; | ||
513 | 717 | ||
514 | init_port(ap); | 718 | init_port(ap); |
515 | 719 | ||
@@ -517,21 +721,18 @@ static int inic_port_start(struct ata_port *ap) | |||
517 | } | 721 | } |
518 | 722 | ||
519 | static struct ata_port_operations inic_port_ops = { | 723 | static struct ata_port_operations inic_port_ops = { |
520 | .inherits = &ata_sff_port_ops, | 724 | .inherits = &sata_port_ops, |
521 | 725 | ||
522 | .bmdma_setup = inic_bmdma_setup, | 726 | .check_atapi_dma = inic_check_atapi_dma, |
523 | .bmdma_start = inic_bmdma_start, | 727 | .qc_prep = inic_qc_prep, |
524 | .bmdma_stop = inic_bmdma_stop, | ||
525 | .bmdma_status = inic_bmdma_status, | ||
526 | .qc_issue = inic_qc_issue, | 728 | .qc_issue = inic_qc_issue, |
729 | .qc_fill_rtf = inic_qc_fill_rtf, | ||
527 | 730 | ||
528 | .freeze = inic_freeze, | 731 | .freeze = inic_freeze, |
529 | .thaw = inic_thaw, | 732 | .thaw = inic_thaw, |
530 | .softreset = ATA_OP_NULL, /* softreset is broken */ | ||
531 | .hardreset = inic_hardreset, | 733 | .hardreset = inic_hardreset, |
532 | .error_handler = inic_error_handler, | 734 | .error_handler = inic_error_handler, |
533 | .post_internal_cmd = inic_post_internal_cmd, | 735 | .post_internal_cmd = inic_post_internal_cmd, |
534 | .dev_config = inic_dev_config, | ||
535 | 736 | ||
536 | .scr_read = inic_scr_read, | 737 | .scr_read = inic_scr_read, |
537 | .scr_write = inic_scr_write, | 738 | .scr_write = inic_scr_write, |
@@ -541,12 +742,6 @@ static struct ata_port_operations inic_port_ops = { | |||
541 | }; | 742 | }; |
542 | 743 | ||
543 | static struct ata_port_info inic_port_info = { | 744 | static struct ata_port_info inic_port_info = { |
544 | /* For some reason, ATAPI_PROT_PIO is broken on this | ||
545 | * controller, and no, PIO_POLLING does't fix it. It somehow | ||
546 | * manages to report the wrong ireason and ignoring ireason | ||
547 | * results in machine lock up. Tell libata to always prefer | ||
548 | * DMA. | ||
549 | */ | ||
550 | .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA, | 745 | .flags = ATA_FLAG_SATA | ATA_FLAG_PIO_DMA, |
551 | .pio_mask = 0x1f, /* pio0-4 */ | 746 | .pio_mask = 0x1f, /* pio0-4 */ |
552 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 747 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -599,7 +794,6 @@ static int inic_pci_device_resume(struct pci_dev *pdev) | |||
599 | { | 794 | { |
600 | struct ata_host *host = dev_get_drvdata(&pdev->dev); | 795 | struct ata_host *host = dev_get_drvdata(&pdev->dev); |
601 | struct inic_host_priv *hpriv = host->private_data; | 796 | struct inic_host_priv *hpriv = host->private_data; |
602 | void __iomem *mmio_base = host->iomap[MMIO_BAR]; | ||
603 | int rc; | 797 | int rc; |
604 | 798 | ||
605 | rc = ata_pci_device_do_resume(pdev); | 799 | rc = ata_pci_device_do_resume(pdev); |
@@ -607,7 +801,7 @@ static int inic_pci_device_resume(struct pci_dev *pdev) | |||
607 | return rc; | 801 | return rc; |
608 | 802 | ||
609 | if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { | 803 | if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) { |
610 | rc = init_controller(mmio_base, hpriv->cached_hctl); | 804 | rc = init_controller(hpriv->mmio_base, hpriv->cached_hctl); |
611 | if (rc) | 805 | if (rc) |
612 | return rc; | 806 | return rc; |
613 | } | 807 | } |
@@ -625,6 +819,7 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
625 | struct ata_host *host; | 819 | struct ata_host *host; |
626 | struct inic_host_priv *hpriv; | 820 | struct inic_host_priv *hpriv; |
627 | void __iomem * const *iomap; | 821 | void __iomem * const *iomap; |
822 | int mmio_bar; | ||
628 | int i, rc; | 823 | int i, rc; |
629 | 824 | ||
630 | if (!printed_version++) | 825 | if (!printed_version++) |
@@ -638,38 +833,31 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
638 | 833 | ||
639 | host->private_data = hpriv; | 834 | host->private_data = hpriv; |
640 | 835 | ||
641 | /* acquire resources and fill host */ | 836 | /* Acquire resources and fill host. Note that PCI and cardbus |
837 | * use different BARs. | ||
838 | */ | ||
642 | rc = pcim_enable_device(pdev); | 839 | rc = pcim_enable_device(pdev); |
643 | if (rc) | 840 | if (rc) |
644 | return rc; | 841 | return rc; |
645 | 842 | ||
646 | rc = pcim_iomap_regions(pdev, 0x3f, DRV_NAME); | 843 | if (pci_resource_flags(pdev, MMIO_BAR_PCI) & IORESOURCE_MEM) |
844 | mmio_bar = MMIO_BAR_PCI; | ||
845 | else | ||
846 | mmio_bar = MMIO_BAR_CARDBUS; | ||
847 | |||
848 | rc = pcim_iomap_regions(pdev, 1 << mmio_bar, DRV_NAME); | ||
647 | if (rc) | 849 | if (rc) |
648 | return rc; | 850 | return rc; |
649 | host->iomap = iomap = pcim_iomap_table(pdev); | 851 | host->iomap = iomap = pcim_iomap_table(pdev); |
852 | hpriv->mmio_base = iomap[mmio_bar]; | ||
853 | hpriv->cached_hctl = readw(hpriv->mmio_base + HOST_CTL); | ||
650 | 854 | ||
651 | for (i = 0; i < NR_PORTS; i++) { | 855 | for (i = 0; i < NR_PORTS; i++) { |
652 | struct ata_port *ap = host->ports[i]; | 856 | struct ata_port *ap = host->ports[i]; |
653 | struct ata_ioports *port = &ap->ioaddr; | ||
654 | unsigned int offset = i * PORT_SIZE; | ||
655 | |||
656 | port->cmd_addr = iomap[2 * i]; | ||
657 | port->altstatus_addr = | ||
658 | port->ctl_addr = (void __iomem *) | ||
659 | ((unsigned long)iomap[2 * i + 1] | ATA_PCI_CTL_OFS); | ||
660 | port->scr_addr = iomap[MMIO_BAR] + offset + PORT_SCR; | ||
661 | |||
662 | ata_sff_std_ports(port); | ||
663 | |||
664 | ata_port_pbar_desc(ap, MMIO_BAR, -1, "mmio"); | ||
665 | ata_port_pbar_desc(ap, MMIO_BAR, offset, "port"); | ||
666 | ata_port_desc(ap, "cmd 0x%llx ctl 0x%llx", | ||
667 | (unsigned long long)pci_resource_start(pdev, 2 * i), | ||
668 | (unsigned long long)pci_resource_start(pdev, (2 * i + 1)) | | ||
669 | ATA_PCI_CTL_OFS); | ||
670 | } | ||
671 | 857 | ||
672 | hpriv->cached_hctl = readw(iomap[MMIO_BAR] + HOST_CTL); | 858 | ata_port_pbar_desc(ap, mmio_bar, -1, "mmio"); |
859 | ata_port_pbar_desc(ap, mmio_bar, i * PORT_SIZE, "port"); | ||
860 | } | ||
673 | 861 | ||
674 | /* Set dma_mask. This devices doesn't support 64bit addressing. */ | 862 | /* Set dma_mask. This devices doesn't support 64bit addressing. */ |
675 | rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); | 863 | rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK); |
@@ -698,7 +886,7 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
698 | return rc; | 886 | return rc; |
699 | } | 887 | } |
700 | 888 | ||
701 | rc = init_controller(iomap[MMIO_BAR], hpriv->cached_hctl); | 889 | rc = init_controller(hpriv->mmio_base, hpriv->cached_hctl); |
702 | if (rc) { | 890 | if (rc) { |
703 | dev_printk(KERN_ERR, &pdev->dev, | 891 | dev_printk(KERN_ERR, &pdev->dev, |
704 | "failed to initialize controller\n"); | 892 | "failed to initialize controller\n"); |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 842b1a15b78c..bb73b2222627 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
@@ -65,6 +65,7 @@ | |||
65 | #include <linux/platform_device.h> | 65 | #include <linux/platform_device.h> |
66 | #include <linux/ata_platform.h> | 66 | #include <linux/ata_platform.h> |
67 | #include <linux/mbus.h> | 67 | #include <linux/mbus.h> |
68 | #include <linux/bitops.h> | ||
68 | #include <scsi/scsi_host.h> | 69 | #include <scsi/scsi_host.h> |
69 | #include <scsi/scsi_cmnd.h> | 70 | #include <scsi/scsi_cmnd.h> |
70 | #include <scsi/scsi_device.h> | 71 | #include <scsi/scsi_device.h> |
@@ -91,9 +92,9 @@ enum { | |||
91 | MV_IRQ_COAL_TIME_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xd0), | 92 | MV_IRQ_COAL_TIME_THRESHOLD = (MV_IRQ_COAL_REG_BASE + 0xd0), |
92 | 93 | ||
93 | MV_SATAHC0_REG_BASE = 0x20000, | 94 | MV_SATAHC0_REG_BASE = 0x20000, |
94 | MV_FLASH_CTL = 0x1046c, | 95 | MV_FLASH_CTL_OFS = 0x1046c, |
95 | MV_GPIO_PORT_CTL = 0x104f0, | 96 | MV_GPIO_PORT_CTL_OFS = 0x104f0, |
96 | MV_RESET_CFG = 0x180d8, | 97 | MV_RESET_CFG_OFS = 0x180d8, |
97 | 98 | ||
98 | MV_PCI_REG_SZ = MV_MAJOR_REG_AREA_SZ, | 99 | MV_PCI_REG_SZ = MV_MAJOR_REG_AREA_SZ, |
99 | MV_SATAHC_REG_SZ = MV_MAJOR_REG_AREA_SZ, | 100 | MV_SATAHC_REG_SZ = MV_MAJOR_REG_AREA_SZ, |
@@ -147,18 +148,21 @@ enum { | |||
147 | /* PCI interface registers */ | 148 | /* PCI interface registers */ |
148 | 149 | ||
149 | PCI_COMMAND_OFS = 0xc00, | 150 | PCI_COMMAND_OFS = 0xc00, |
151 | PCI_COMMAND_MRDTRIG = (1 << 7), /* PCI Master Read Trigger */ | ||
150 | 152 | ||
151 | PCI_MAIN_CMD_STS_OFS = 0xd30, | 153 | PCI_MAIN_CMD_STS_OFS = 0xd30, |
152 | STOP_PCI_MASTER = (1 << 2), | 154 | STOP_PCI_MASTER = (1 << 2), |
153 | PCI_MASTER_EMPTY = (1 << 3), | 155 | PCI_MASTER_EMPTY = (1 << 3), |
154 | GLOB_SFT_RST = (1 << 4), | 156 | GLOB_SFT_RST = (1 << 4), |
155 | 157 | ||
156 | MV_PCI_MODE = 0xd00, | 158 | MV_PCI_MODE_OFS = 0xd00, |
159 | MV_PCI_MODE_MASK = 0x30, | ||
160 | |||
157 | MV_PCI_EXP_ROM_BAR_CTL = 0xd2c, | 161 | MV_PCI_EXP_ROM_BAR_CTL = 0xd2c, |
158 | MV_PCI_DISC_TIMER = 0xd04, | 162 | MV_PCI_DISC_TIMER = 0xd04, |
159 | MV_PCI_MSI_TRIGGER = 0xc38, | 163 | MV_PCI_MSI_TRIGGER = 0xc38, |
160 | MV_PCI_SERR_MASK = 0xc28, | 164 | MV_PCI_SERR_MASK = 0xc28, |
161 | MV_PCI_XBAR_TMOUT = 0x1d04, | 165 | MV_PCI_XBAR_TMOUT_OFS = 0x1d04, |
162 | MV_PCI_ERR_LOW_ADDRESS = 0x1d40, | 166 | MV_PCI_ERR_LOW_ADDRESS = 0x1d40, |
163 | MV_PCI_ERR_HIGH_ADDRESS = 0x1d44, | 167 | MV_PCI_ERR_HIGH_ADDRESS = 0x1d44, |
164 | MV_PCI_ERR_ATTRIBUTE = 0x1d48, | 168 | MV_PCI_ERR_ATTRIBUTE = 0x1d48, |
@@ -225,16 +229,18 @@ enum { | |||
225 | PHY_MODE4 = 0x314, | 229 | PHY_MODE4 = 0x314, |
226 | PHY_MODE2 = 0x330, | 230 | PHY_MODE2 = 0x330, |
227 | SATA_IFCTL_OFS = 0x344, | 231 | SATA_IFCTL_OFS = 0x344, |
232 | SATA_TESTCTL_OFS = 0x348, | ||
228 | SATA_IFSTAT_OFS = 0x34c, | 233 | SATA_IFSTAT_OFS = 0x34c, |
229 | VENDOR_UNIQUE_FIS_OFS = 0x35c, | 234 | VENDOR_UNIQUE_FIS_OFS = 0x35c, |
230 | 235 | ||
231 | FIS_CFG_OFS = 0x360, | 236 | FISCFG_OFS = 0x360, |
232 | FIS_CFG_SINGLE_SYNC = (1 << 16), /* SYNC on DMA activation */ | 237 | FISCFG_WAIT_DEV_ERR = (1 << 8), /* wait for host on DevErr */ |
238 | FISCFG_SINGLE_SYNC = (1 << 16), /* SYNC on DMA activation */ | ||
233 | 239 | ||
234 | MV5_PHY_MODE = 0x74, | 240 | MV5_PHY_MODE = 0x74, |
235 | MV5_LT_MODE = 0x30, | 241 | MV5_LTMODE_OFS = 0x30, |
236 | MV5_PHY_CTL = 0x0C, | 242 | MV5_PHY_CTL_OFS = 0x0C, |
237 | SATA_INTERFACE_CFG = 0x050, | 243 | SATA_INTERFACE_CFG_OFS = 0x050, |
238 | 244 | ||
239 | MV_M2_PREAMP_MASK = 0x7e0, | 245 | MV_M2_PREAMP_MASK = 0x7e0, |
240 | 246 | ||
@@ -332,10 +338,16 @@ enum { | |||
332 | EDMA_CMD_OFS = 0x28, /* EDMA command register */ | 338 | EDMA_CMD_OFS = 0x28, /* EDMA command register */ |
333 | EDMA_EN = (1 << 0), /* enable EDMA */ | 339 | EDMA_EN = (1 << 0), /* enable EDMA */ |
334 | EDMA_DS = (1 << 1), /* disable EDMA; self-negated */ | 340 | EDMA_DS = (1 << 1), /* disable EDMA; self-negated */ |
335 | ATA_RST = (1 << 2), /* reset trans/link/phy */ | 341 | EDMA_RESET = (1 << 2), /* reset eng/trans/link/phy */ |
342 | |||
343 | EDMA_STATUS_OFS = 0x30, /* EDMA engine status */ | ||
344 | EDMA_STATUS_CACHE_EMPTY = (1 << 6), /* GenIIe command cache empty */ | ||
345 | EDMA_STATUS_IDLE = (1 << 7), /* GenIIe EDMA enabled/idle */ | ||
336 | 346 | ||
337 | EDMA_IORDY_TMOUT = 0x34, | 347 | EDMA_IORDY_TMOUT_OFS = 0x34, |
338 | EDMA_ARB_CFG = 0x38, | 348 | EDMA_ARB_CFG_OFS = 0x38, |
349 | |||
350 | EDMA_HALTCOND_OFS = 0x60, /* GenIIe halt conditions */ | ||
339 | 351 | ||
340 | GEN_II_NCQ_MAX_SECTORS = 256, /* max sects/io on Gen2 w/NCQ */ | 352 | GEN_II_NCQ_MAX_SECTORS = 256, /* max sects/io on Gen2 w/NCQ */ |
341 | 353 | ||
@@ -350,15 +362,19 @@ enum { | |||
350 | MV_HP_GEN_II = (1 << 7), /* Generation II: 60xx */ | 362 | MV_HP_GEN_II = (1 << 7), /* Generation II: 60xx */ |
351 | MV_HP_GEN_IIE = (1 << 8), /* Generation IIE: 6042/7042 */ | 363 | MV_HP_GEN_IIE = (1 << 8), /* Generation IIE: 6042/7042 */ |
352 | MV_HP_PCIE = (1 << 9), /* PCIe bus/regs: 7042 */ | 364 | MV_HP_PCIE = (1 << 9), /* PCIe bus/regs: 7042 */ |
365 | MV_HP_CUT_THROUGH = (1 << 10), /* can use EDMA cut-through */ | ||
353 | 366 | ||
354 | /* Port private flags (pp_flags) */ | 367 | /* Port private flags (pp_flags) */ |
355 | MV_PP_FLAG_EDMA_EN = (1 << 0), /* is EDMA engine enabled? */ | 368 | MV_PP_FLAG_EDMA_EN = (1 << 0), /* is EDMA engine enabled? */ |
356 | MV_PP_FLAG_NCQ_EN = (1 << 1), /* is EDMA set up for NCQ? */ | 369 | MV_PP_FLAG_NCQ_EN = (1 << 1), /* is EDMA set up for NCQ? */ |
370 | MV_PP_FLAG_FBS_EN = (1 << 2), /* is EDMA set up for FBS? */ | ||
371 | MV_PP_FLAG_DELAYED_EH = (1 << 3), /* delayed dev err handling */ | ||
357 | }; | 372 | }; |
358 | 373 | ||
359 | #define IS_GEN_I(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_I) | 374 | #define IS_GEN_I(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_I) |
360 | #define IS_GEN_II(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_II) | 375 | #define IS_GEN_II(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_II) |
361 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) | 376 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) |
377 | #define IS_PCIE(hpriv) ((hpriv)->hp_flags & MV_HP_PCIE) | ||
362 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) | 378 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) |
363 | 379 | ||
364 | #define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) | 380 | #define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) |
@@ -433,6 +449,7 @@ struct mv_port_priv { | |||
433 | unsigned int resp_idx; | 449 | unsigned int resp_idx; |
434 | 450 | ||
435 | u32 pp_flags; | 451 | u32 pp_flags; |
452 | unsigned int delayed_eh_pmp_map; | ||
436 | }; | 453 | }; |
437 | 454 | ||
438 | struct mv_port_signal { | 455 | struct mv_port_signal { |
@@ -479,6 +496,7 @@ static int mv5_scr_read(struct ata_port *ap, unsigned int sc_reg_in, u32 *val); | |||
479 | static int mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); | 496 | static int mv5_scr_write(struct ata_port *ap, unsigned int sc_reg_in, u32 val); |
480 | static int mv_port_start(struct ata_port *ap); | 497 | static int mv_port_start(struct ata_port *ap); |
481 | static void mv_port_stop(struct ata_port *ap); | 498 | static void mv_port_stop(struct ata_port *ap); |
499 | static int mv_qc_defer(struct ata_queued_cmd *qc); | ||
482 | static void mv_qc_prep(struct ata_queued_cmd *qc); | 500 | static void mv_qc_prep(struct ata_queued_cmd *qc); |
483 | static void mv_qc_prep_iie(struct ata_queued_cmd *qc); | 501 | static void mv_qc_prep_iie(struct ata_queued_cmd *qc); |
484 | static unsigned int mv_qc_issue(struct ata_queued_cmd *qc); | 502 | static unsigned int mv_qc_issue(struct ata_queued_cmd *qc); |
@@ -527,6 +545,9 @@ static int mv_pmp_hardreset(struct ata_link *link, unsigned int *class, | |||
527 | unsigned long deadline); | 545 | unsigned long deadline); |
528 | static int mv_softreset(struct ata_link *link, unsigned int *class, | 546 | static int mv_softreset(struct ata_link *link, unsigned int *class, |
529 | unsigned long deadline); | 547 | unsigned long deadline); |
548 | static void mv_pmp_error_handler(struct ata_port *ap); | ||
549 | static void mv_process_crpb_entries(struct ata_port *ap, | ||
550 | struct mv_port_priv *pp); | ||
530 | 551 | ||
531 | /* .sg_tablesize is (MV_MAX_SG_CT / 2) in the structures below | 552 | /* .sg_tablesize is (MV_MAX_SG_CT / 2) in the structures below |
532 | * because we have to allow room for worst case splitting of | 553 | * because we have to allow room for worst case splitting of |
@@ -548,6 +569,7 @@ static struct scsi_host_template mv6_sht = { | |||
548 | static struct ata_port_operations mv5_ops = { | 569 | static struct ata_port_operations mv5_ops = { |
549 | .inherits = &ata_sff_port_ops, | 570 | .inherits = &ata_sff_port_ops, |
550 | 571 | ||
572 | .qc_defer = mv_qc_defer, | ||
551 | .qc_prep = mv_qc_prep, | 573 | .qc_prep = mv_qc_prep, |
552 | .qc_issue = mv_qc_issue, | 574 | .qc_issue = mv_qc_issue, |
553 | 575 | ||
@@ -566,7 +588,6 @@ static struct ata_port_operations mv5_ops = { | |||
566 | 588 | ||
567 | static struct ata_port_operations mv6_ops = { | 589 | static struct ata_port_operations mv6_ops = { |
568 | .inherits = &mv5_ops, | 590 | .inherits = &mv5_ops, |
569 | .qc_defer = sata_pmp_qc_defer_cmd_switch, | ||
570 | .dev_config = mv6_dev_config, | 591 | .dev_config = mv6_dev_config, |
571 | .scr_read = mv_scr_read, | 592 | .scr_read = mv_scr_read, |
572 | .scr_write = mv_scr_write, | 593 | .scr_write = mv_scr_write, |
@@ -574,12 +595,11 @@ static struct ata_port_operations mv6_ops = { | |||
574 | .pmp_hardreset = mv_pmp_hardreset, | 595 | .pmp_hardreset = mv_pmp_hardreset, |
575 | .pmp_softreset = mv_softreset, | 596 | .pmp_softreset = mv_softreset, |
576 | .softreset = mv_softreset, | 597 | .softreset = mv_softreset, |
577 | .error_handler = sata_pmp_error_handler, | 598 | .error_handler = mv_pmp_error_handler, |
578 | }; | 599 | }; |
579 | 600 | ||
580 | static struct ata_port_operations mv_iie_ops = { | 601 | static struct ata_port_operations mv_iie_ops = { |
581 | .inherits = &mv6_ops, | 602 | .inherits = &mv6_ops, |
582 | .qc_defer = ata_std_qc_defer, /* FIS-based switching */ | ||
583 | .dev_config = ATA_OP_NULL, | 603 | .dev_config = ATA_OP_NULL, |
584 | .qc_prep = mv_qc_prep_iie, | 604 | .qc_prep = mv_qc_prep_iie, |
585 | }; | 605 | }; |
@@ -875,6 +895,29 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio, | |||
875 | } | 895 | } |
876 | } | 896 | } |
877 | 897 | ||
898 | static void mv_wait_for_edma_empty_idle(struct ata_port *ap) | ||
899 | { | ||
900 | void __iomem *port_mmio = mv_ap_base(ap); | ||
901 | const u32 empty_idle = (EDMA_STATUS_CACHE_EMPTY | EDMA_STATUS_IDLE); | ||
902 | const int per_loop = 5, timeout = (15 * 1000 / per_loop); | ||
903 | int i; | ||
904 | |||
905 | /* | ||
906 | * Wait for the EDMA engine to finish transactions in progress. | ||
907 | * No idea what a good "timeout" value might be, but measurements | ||
908 | * indicate that it often requires hundreds of microseconds | ||
909 | * with two drives in-use. So we use the 15msec value above | ||
910 | * as a rough guess at what even more drives might require. | ||
911 | */ | ||
912 | for (i = 0; i < timeout; ++i) { | ||
913 | u32 edma_stat = readl(port_mmio + EDMA_STATUS_OFS); | ||
914 | if ((edma_stat & empty_idle) == empty_idle) | ||
915 | break; | ||
916 | udelay(per_loop); | ||
917 | } | ||
918 | /* ata_port_printk(ap, KERN_INFO, "%s: %u+ usecs\n", __func__, i); */ | ||
919 | } | ||
920 | |||
878 | /** | 921 | /** |
879 | * mv_stop_edma_engine - Disable eDMA engine | 922 | * mv_stop_edma_engine - Disable eDMA engine |
880 | * @port_mmio: io base address | 923 | * @port_mmio: io base address |
@@ -907,6 +950,7 @@ static int mv_stop_edma(struct ata_port *ap) | |||
907 | if (!(pp->pp_flags & MV_PP_FLAG_EDMA_EN)) | 950 | if (!(pp->pp_flags & MV_PP_FLAG_EDMA_EN)) |
908 | return 0; | 951 | return 0; |
909 | pp->pp_flags &= ~MV_PP_FLAG_EDMA_EN; | 952 | pp->pp_flags &= ~MV_PP_FLAG_EDMA_EN; |
953 | mv_wait_for_edma_empty_idle(ap); | ||
910 | if (mv_stop_edma_engine(port_mmio)) { | 954 | if (mv_stop_edma_engine(port_mmio)) { |
911 | ata_port_printk(ap, KERN_ERR, "Unable to stop eDMA\n"); | 955 | ata_port_printk(ap, KERN_ERR, "Unable to stop eDMA\n"); |
912 | return -EIO; | 956 | return -EIO; |
@@ -1057,26 +1101,95 @@ static void mv6_dev_config(struct ata_device *adev) | |||
1057 | } | 1101 | } |
1058 | } | 1102 | } |
1059 | 1103 | ||
1060 | static void mv_config_fbs(void __iomem *port_mmio, int enable_fbs) | 1104 | static int mv_qc_defer(struct ata_queued_cmd *qc) |
1061 | { | 1105 | { |
1062 | u32 old_fcfg, new_fcfg, old_ltmode, new_ltmode; | 1106 | struct ata_link *link = qc->dev->link; |
1107 | struct ata_port *ap = link->ap; | ||
1108 | struct mv_port_priv *pp = ap->private_data; | ||
1109 | |||
1110 | /* | ||
1111 | * Don't allow new commands if we're in a delayed EH state | ||
1112 | * for NCQ and/or FIS-based switching. | ||
1113 | */ | ||
1114 | if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH) | ||
1115 | return ATA_DEFER_PORT; | ||
1063 | /* | 1116 | /* |
1064 | * Various bit settings required for operation | 1117 | * If the port is completely idle, then allow the new qc. |
1065 | * in FIS-based switching (fbs) mode on GenIIe: | ||
1066 | */ | 1118 | */ |
1067 | old_fcfg = readl(port_mmio + FIS_CFG_OFS); | 1119 | if (ap->nr_active_links == 0) |
1068 | old_ltmode = readl(port_mmio + LTMODE_OFS); | 1120 | return 0; |
1069 | if (enable_fbs) { | 1121 | |
1070 | new_fcfg = old_fcfg | FIS_CFG_SINGLE_SYNC; | 1122 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { |
1071 | new_ltmode = old_ltmode | LTMODE_BIT8; | 1123 | /* |
1072 | } else { /* disable fbs */ | 1124 | * The port is operating in host queuing mode (EDMA). |
1073 | new_fcfg = old_fcfg & ~FIS_CFG_SINGLE_SYNC; | 1125 | * It can accomodate a new qc if the qc protocol |
1074 | new_ltmode = old_ltmode & ~LTMODE_BIT8; | 1126 | * is compatible with the current host queue mode. |
1075 | } | 1127 | */ |
1076 | if (new_fcfg != old_fcfg) | 1128 | if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) { |
1077 | writelfl(new_fcfg, port_mmio + FIS_CFG_OFS); | 1129 | /* |
1130 | * The host queue (EDMA) is in NCQ mode. | ||
1131 | * If the new qc is also an NCQ command, | ||
1132 | * then allow the new qc. | ||
1133 | */ | ||
1134 | if (qc->tf.protocol == ATA_PROT_NCQ) | ||
1135 | return 0; | ||
1136 | } else { | ||
1137 | /* | ||
1138 | * The host queue (EDMA) is in non-NCQ, DMA mode. | ||
1139 | * If the new qc is also a non-NCQ, DMA command, | ||
1140 | * then allow the new qc. | ||
1141 | */ | ||
1142 | if (qc->tf.protocol == ATA_PROT_DMA) | ||
1143 | return 0; | ||
1144 | } | ||
1145 | } | ||
1146 | return ATA_DEFER_PORT; | ||
1147 | } | ||
1148 | |||
1149 | static void mv_config_fbs(void __iomem *port_mmio, int want_ncq, int want_fbs) | ||
1150 | { | ||
1151 | u32 new_fiscfg, old_fiscfg; | ||
1152 | u32 new_ltmode, old_ltmode; | ||
1153 | u32 new_haltcond, old_haltcond; | ||
1154 | |||
1155 | old_fiscfg = readl(port_mmio + FISCFG_OFS); | ||
1156 | old_ltmode = readl(port_mmio + LTMODE_OFS); | ||
1157 | old_haltcond = readl(port_mmio + EDMA_HALTCOND_OFS); | ||
1158 | |||
1159 | new_fiscfg = old_fiscfg & ~(FISCFG_SINGLE_SYNC | FISCFG_WAIT_DEV_ERR); | ||
1160 | new_ltmode = old_ltmode & ~LTMODE_BIT8; | ||
1161 | new_haltcond = old_haltcond | EDMA_ERR_DEV; | ||
1162 | |||
1163 | if (want_fbs) { | ||
1164 | new_fiscfg = old_fiscfg | FISCFG_SINGLE_SYNC; | ||
1165 | new_ltmode = old_ltmode | LTMODE_BIT8; | ||
1166 | if (want_ncq) | ||
1167 | new_haltcond &= ~EDMA_ERR_DEV; | ||
1168 | else | ||
1169 | new_fiscfg |= FISCFG_WAIT_DEV_ERR; | ||
1170 | } | ||
1171 | |||
1172 | if (new_fiscfg != old_fiscfg) | ||
1173 | writelfl(new_fiscfg, port_mmio + FISCFG_OFS); | ||
1078 | if (new_ltmode != old_ltmode) | 1174 | if (new_ltmode != old_ltmode) |
1079 | writelfl(new_ltmode, port_mmio + LTMODE_OFS); | 1175 | writelfl(new_ltmode, port_mmio + LTMODE_OFS); |
1176 | if (new_haltcond != old_haltcond) | ||
1177 | writelfl(new_haltcond, port_mmio + EDMA_HALTCOND_OFS); | ||
1178 | } | ||
1179 | |||
1180 | static void mv_60x1_errata_sata25(struct ata_port *ap, int want_ncq) | ||
1181 | { | ||
1182 | struct mv_host_priv *hpriv = ap->host->private_data; | ||
1183 | u32 old, new; | ||
1184 | |||
1185 | /* workaround for 88SX60x1 FEr SATA#25 (part 1) */ | ||
1186 | old = readl(hpriv->base + MV_GPIO_PORT_CTL_OFS); | ||
1187 | if (want_ncq) | ||
1188 | new = old | (1 << 22); | ||
1189 | else | ||
1190 | new = old & ~(1 << 22); | ||
1191 | if (new != old) | ||
1192 | writel(new, hpriv->base + MV_GPIO_PORT_CTL_OFS); | ||
1080 | } | 1193 | } |
1081 | 1194 | ||
1082 | static void mv_edma_cfg(struct ata_port *ap, int want_ncq) | 1195 | static void mv_edma_cfg(struct ata_port *ap, int want_ncq) |
@@ -1088,25 +1201,40 @@ static void mv_edma_cfg(struct ata_port *ap, int want_ncq) | |||
1088 | 1201 | ||
1089 | /* set up non-NCQ EDMA configuration */ | 1202 | /* set up non-NCQ EDMA configuration */ |
1090 | cfg = EDMA_CFG_Q_DEPTH; /* always 0x1f for *all* chips */ | 1203 | cfg = EDMA_CFG_Q_DEPTH; /* always 0x1f for *all* chips */ |
1204 | pp->pp_flags &= ~MV_PP_FLAG_FBS_EN; | ||
1091 | 1205 | ||
1092 | if (IS_GEN_I(hpriv)) | 1206 | if (IS_GEN_I(hpriv)) |
1093 | cfg |= (1 << 8); /* enab config burst size mask */ | 1207 | cfg |= (1 << 8); /* enab config burst size mask */ |
1094 | 1208 | ||
1095 | else if (IS_GEN_II(hpriv)) | 1209 | else if (IS_GEN_II(hpriv)) { |
1096 | cfg |= EDMA_CFG_RD_BRST_EXT | EDMA_CFG_WR_BUFF_LEN; | 1210 | cfg |= EDMA_CFG_RD_BRST_EXT | EDMA_CFG_WR_BUFF_LEN; |
1211 | mv_60x1_errata_sata25(ap, want_ncq); | ||
1097 | 1212 | ||
1098 | else if (IS_GEN_IIE(hpriv)) { | 1213 | } else if (IS_GEN_IIE(hpriv)) { |
1099 | cfg |= (1 << 23); /* do not mask PM field in rx'd FIS */ | 1214 | int want_fbs = sata_pmp_attached(ap); |
1100 | cfg |= (1 << 22); /* enab 4-entry host queue cache */ | 1215 | /* |
1101 | cfg |= (1 << 18); /* enab early completion */ | 1216 | * Possible future enhancement: |
1102 | cfg |= (1 << 17); /* enab cut-through (dis stor&forwrd) */ | 1217 | * |
1218 | * The chip can use FBS with non-NCQ, if we allow it, | ||
1219 | * But first we need to have the error handling in place | ||
1220 | * for this mode (datasheet section 7.3.15.4.2.3). | ||
1221 | * So disallow non-NCQ FBS for now. | ||
1222 | */ | ||
1223 | want_fbs &= want_ncq; | ||
1224 | |||
1225 | mv_config_fbs(port_mmio, want_ncq, want_fbs); | ||
1103 | 1226 | ||
1104 | if (want_ncq && sata_pmp_attached(ap)) { | 1227 | if (want_fbs) { |
1228 | pp->pp_flags |= MV_PP_FLAG_FBS_EN; | ||
1105 | cfg |= EDMA_CFG_EDMA_FBS; /* FIS-based switching */ | 1229 | cfg |= EDMA_CFG_EDMA_FBS; /* FIS-based switching */ |
1106 | mv_config_fbs(port_mmio, 1); | ||
1107 | } else { | ||
1108 | mv_config_fbs(port_mmio, 0); | ||
1109 | } | 1230 | } |
1231 | |||
1232 | cfg |= (1 << 23); /* do not mask PM field in rx'd FIS */ | ||
1233 | cfg |= (1 << 22); /* enab 4-entry host queue cache */ | ||
1234 | if (HAS_PCI(ap->host)) | ||
1235 | cfg |= (1 << 18); /* enab early completion */ | ||
1236 | if (hpriv->hp_flags & MV_HP_CUT_THROUGH) | ||
1237 | cfg |= (1 << 17); /* enab cut-thru (dis stor&forwrd) */ | ||
1110 | } | 1238 | } |
1111 | 1239 | ||
1112 | if (want_ncq) { | 1240 | if (want_ncq) { |
@@ -1483,25 +1611,186 @@ static struct ata_queued_cmd *mv_get_active_qc(struct ata_port *ap) | |||
1483 | return qc; | 1611 | return qc; |
1484 | } | 1612 | } |
1485 | 1613 | ||
1486 | static void mv_unexpected_intr(struct ata_port *ap) | 1614 | static void mv_pmp_error_handler(struct ata_port *ap) |
1487 | { | 1615 | { |
1616 | unsigned int pmp, pmp_map; | ||
1488 | struct mv_port_priv *pp = ap->private_data; | 1617 | struct mv_port_priv *pp = ap->private_data; |
1489 | struct ata_eh_info *ehi = &ap->link.eh_info; | ||
1490 | char *when = ""; | ||
1491 | 1618 | ||
1619 | if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH) { | ||
1620 | /* | ||
1621 | * Perform NCQ error analysis on failed PMPs | ||
1622 | * before we freeze the port entirely. | ||
1623 | * | ||
1624 | * The failed PMPs are marked earlier by mv_pmp_eh_prep(). | ||
1625 | */ | ||
1626 | pmp_map = pp->delayed_eh_pmp_map; | ||
1627 | pp->pp_flags &= ~MV_PP_FLAG_DELAYED_EH; | ||
1628 | for (pmp = 0; pmp_map != 0; pmp++) { | ||
1629 | unsigned int this_pmp = (1 << pmp); | ||
1630 | if (pmp_map & this_pmp) { | ||
1631 | struct ata_link *link = &ap->pmp_link[pmp]; | ||
1632 | pmp_map &= ~this_pmp; | ||
1633 | ata_eh_analyze_ncq_error(link); | ||
1634 | } | ||
1635 | } | ||
1636 | ata_port_freeze(ap); | ||
1637 | } | ||
1638 | sata_pmp_error_handler(ap); | ||
1639 | } | ||
1640 | |||
1641 | static unsigned int mv_get_err_pmp_map(struct ata_port *ap) | ||
1642 | { | ||
1643 | void __iomem *port_mmio = mv_ap_base(ap); | ||
1644 | |||
1645 | return readl(port_mmio + SATA_TESTCTL_OFS) >> 16; | ||
1646 | } | ||
1647 | |||
1648 | static void mv_pmp_eh_prep(struct ata_port *ap, unsigned int pmp_map) | ||
1649 | { | ||
1650 | struct ata_eh_info *ehi; | ||
1651 | unsigned int pmp; | ||
1652 | |||
1653 | /* | ||
1654 | * Initialize EH info for PMPs which saw device errors | ||
1655 | */ | ||
1656 | ehi = &ap->link.eh_info; | ||
1657 | for (pmp = 0; pmp_map != 0; pmp++) { | ||
1658 | unsigned int this_pmp = (1 << pmp); | ||
1659 | if (pmp_map & this_pmp) { | ||
1660 | struct ata_link *link = &ap->pmp_link[pmp]; | ||
1661 | |||
1662 | pmp_map &= ~this_pmp; | ||
1663 | ehi = &link->eh_info; | ||
1664 | ata_ehi_clear_desc(ehi); | ||
1665 | ata_ehi_push_desc(ehi, "dev err"); | ||
1666 | ehi->err_mask |= AC_ERR_DEV; | ||
1667 | ehi->action |= ATA_EH_RESET; | ||
1668 | ata_link_abort(link); | ||
1669 | } | ||
1670 | } | ||
1671 | } | ||
1672 | |||
1673 | static int mv_handle_fbs_ncq_dev_err(struct ata_port *ap) | ||
1674 | { | ||
1675 | struct mv_port_priv *pp = ap->private_data; | ||
1676 | int failed_links; | ||
1677 | unsigned int old_map, new_map; | ||
1678 | |||
1679 | /* | ||
1680 | * Device error during FBS+NCQ operation: | ||
1681 | * | ||
1682 | * Set a port flag to prevent further I/O being enqueued. | ||
1683 | * Leave the EDMA running to drain outstanding commands from this port. | ||
1684 | * Perform the post-mortem/EH only when all responses are complete. | ||
1685 | * Follow recovery sequence from 6042/7042 datasheet (7.3.15.4.2.2). | ||
1686 | */ | ||
1687 | if (!(pp->pp_flags & MV_PP_FLAG_DELAYED_EH)) { | ||
1688 | pp->pp_flags |= MV_PP_FLAG_DELAYED_EH; | ||
1689 | pp->delayed_eh_pmp_map = 0; | ||
1690 | } | ||
1691 | old_map = pp->delayed_eh_pmp_map; | ||
1692 | new_map = old_map | mv_get_err_pmp_map(ap); | ||
1693 | |||
1694 | if (old_map != new_map) { | ||
1695 | pp->delayed_eh_pmp_map = new_map; | ||
1696 | mv_pmp_eh_prep(ap, new_map & ~old_map); | ||
1697 | } | ||
1698 | failed_links = hweight16(new_map); | ||
1699 | |||
1700 | ata_port_printk(ap, KERN_INFO, "%s: pmp_map=%04x qc_map=%04x " | ||
1701 | "failed_links=%d nr_active_links=%d\n", | ||
1702 | __func__, pp->delayed_eh_pmp_map, | ||
1703 | ap->qc_active, failed_links, | ||
1704 | ap->nr_active_links); | ||
1705 | |||
1706 | if (ap->nr_active_links <= failed_links) { | ||
1707 | mv_process_crpb_entries(ap, pp); | ||
1708 | mv_stop_edma(ap); | ||
1709 | mv_eh_freeze(ap); | ||
1710 | ata_port_printk(ap, KERN_INFO, "%s: done\n", __func__); | ||
1711 | return 1; /* handled */ | ||
1712 | } | ||
1713 | ata_port_printk(ap, KERN_INFO, "%s: waiting\n", __func__); | ||
1714 | return 1; /* handled */ | ||
1715 | } | ||
1716 | |||
1717 | static int mv_handle_fbs_non_ncq_dev_err(struct ata_port *ap) | ||
1718 | { | ||
1492 | /* | 1719 | /* |
1493 | * We got a device interrupt from something that | 1720 | * Possible future enhancement: |
1494 | * was supposed to be using EDMA or polling. | 1721 | * |
1722 | * FBS+non-NCQ operation is not yet implemented. | ||
1723 | * See related notes in mv_edma_cfg(). | ||
1724 | * | ||
1725 | * Device error during FBS+non-NCQ operation: | ||
1726 | * | ||
1727 | * We need to snapshot the shadow registers for each failed command. | ||
1728 | * Follow recovery sequence from 6042/7042 datasheet (7.3.15.4.2.3). | ||
1495 | */ | 1729 | */ |
1730 | return 0; /* not handled */ | ||
1731 | } | ||
1732 | |||
1733 | static int mv_handle_dev_err(struct ata_port *ap, u32 edma_err_cause) | ||
1734 | { | ||
1735 | struct mv_port_priv *pp = ap->private_data; | ||
1736 | |||
1737 | if (!(pp->pp_flags & MV_PP_FLAG_EDMA_EN)) | ||
1738 | return 0; /* EDMA was not active: not handled */ | ||
1739 | if (!(pp->pp_flags & MV_PP_FLAG_FBS_EN)) | ||
1740 | return 0; /* FBS was not active: not handled */ | ||
1741 | |||
1742 | if (!(edma_err_cause & EDMA_ERR_DEV)) | ||
1743 | return 0; /* non DEV error: not handled */ | ||
1744 | edma_err_cause &= ~EDMA_ERR_IRQ_TRANSIENT; | ||
1745 | if (edma_err_cause & ~(EDMA_ERR_DEV | EDMA_ERR_SELF_DIS)) | ||
1746 | return 0; /* other problems: not handled */ | ||
1747 | |||
1748 | if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) { | ||
1749 | /* | ||
1750 | * EDMA should NOT have self-disabled for this case. | ||
1751 | * If it did, then something is wrong elsewhere, | ||
1752 | * and we cannot handle it here. | ||
1753 | */ | ||
1754 | if (edma_err_cause & EDMA_ERR_SELF_DIS) { | ||
1755 | ata_port_printk(ap, KERN_WARNING, | ||
1756 | "%s: err_cause=0x%x pp_flags=0x%x\n", | ||
1757 | __func__, edma_err_cause, pp->pp_flags); | ||
1758 | return 0; /* not handled */ | ||
1759 | } | ||
1760 | return mv_handle_fbs_ncq_dev_err(ap); | ||
1761 | } else { | ||
1762 | /* | ||
1763 | * EDMA should have self-disabled for this case. | ||
1764 | * If it did not, then something is wrong elsewhere, | ||
1765 | * and we cannot handle it here. | ||
1766 | */ | ||
1767 | if (!(edma_err_cause & EDMA_ERR_SELF_DIS)) { | ||
1768 | ata_port_printk(ap, KERN_WARNING, | ||
1769 | "%s: err_cause=0x%x pp_flags=0x%x\n", | ||
1770 | __func__, edma_err_cause, pp->pp_flags); | ||
1771 | return 0; /* not handled */ | ||
1772 | } | ||
1773 | return mv_handle_fbs_non_ncq_dev_err(ap); | ||
1774 | } | ||
1775 | return 0; /* not handled */ | ||
1776 | } | ||
1777 | |||
1778 | static void mv_unexpected_intr(struct ata_port *ap, int edma_was_enabled) | ||
1779 | { | ||
1780 | struct ata_eh_info *ehi = &ap->link.eh_info; | ||
1781 | char *when = "idle"; | ||
1782 | |||
1496 | ata_ehi_clear_desc(ehi); | 1783 | ata_ehi_clear_desc(ehi); |
1497 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) { | 1784 | if (!ap || (ap->flags & ATA_FLAG_DISABLED)) { |
1498 | when = " while EDMA enabled"; | 1785 | when = "disabled"; |
1786 | } else if (edma_was_enabled) { | ||
1787 | when = "EDMA enabled"; | ||
1499 | } else { | 1788 | } else { |
1500 | struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag); | 1789 | struct ata_queued_cmd *qc = ata_qc_from_tag(ap, ap->link.active_tag); |
1501 | if (qc && (qc->tf.flags & ATA_TFLAG_POLLING)) | 1790 | if (qc && (qc->tf.flags & ATA_TFLAG_POLLING)) |
1502 | when = " while polling"; | 1791 | when = "polling"; |
1503 | } | 1792 | } |
1504 | ata_ehi_push_desc(ehi, "unexpected device interrupt%s", when); | 1793 | ata_ehi_push_desc(ehi, "unexpected device interrupt while %s", when); |
1505 | ehi->err_mask |= AC_ERR_OTHER; | 1794 | ehi->err_mask |= AC_ERR_OTHER; |
1506 | ehi->action |= ATA_EH_RESET; | 1795 | ehi->action |= ATA_EH_RESET; |
1507 | ata_port_freeze(ap); | 1796 | ata_port_freeze(ap); |
@@ -1519,7 +1808,7 @@ static void mv_unexpected_intr(struct ata_port *ap) | |||
1519 | * LOCKING: | 1808 | * LOCKING: |
1520 | * Inherited from caller. | 1809 | * Inherited from caller. |
1521 | */ | 1810 | */ |
1522 | static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | 1811 | static void mv_err_intr(struct ata_port *ap) |
1523 | { | 1812 | { |
1524 | void __iomem *port_mmio = mv_ap_base(ap); | 1813 | void __iomem *port_mmio = mv_ap_base(ap); |
1525 | u32 edma_err_cause, eh_freeze_mask, serr = 0; | 1814 | u32 edma_err_cause, eh_freeze_mask, serr = 0; |
@@ -1527,24 +1816,42 @@ static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
1527 | struct mv_host_priv *hpriv = ap->host->private_data; | 1816 | struct mv_host_priv *hpriv = ap->host->private_data; |
1528 | unsigned int action = 0, err_mask = 0; | 1817 | unsigned int action = 0, err_mask = 0; |
1529 | struct ata_eh_info *ehi = &ap->link.eh_info; | 1818 | struct ata_eh_info *ehi = &ap->link.eh_info; |
1530 | 1819 | struct ata_queued_cmd *qc; | |
1531 | ata_ehi_clear_desc(ehi); | 1820 | int abort = 0; |
1532 | 1821 | ||
1533 | /* | 1822 | /* |
1534 | * Read and clear the err_cause bits. This won't actually | 1823 | * Read and clear the SError and err_cause bits. |
1535 | * clear for some errors (eg. SError), but we will be doing | ||
1536 | * a hard reset in those cases regardless, which *will* clear it. | ||
1537 | */ | 1824 | */ |
1825 | sata_scr_read(&ap->link, SCR_ERROR, &serr); | ||
1826 | sata_scr_write_flush(&ap->link, SCR_ERROR, serr); | ||
1827 | |||
1538 | edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); | 1828 | edma_err_cause = readl(port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); |
1539 | writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); | 1829 | writelfl(~edma_err_cause, port_mmio + EDMA_ERR_IRQ_CAUSE_OFS); |
1540 | 1830 | ||
1541 | ata_ehi_push_desc(ehi, "edma_err_cause=%08x", edma_err_cause); | 1831 | ata_port_printk(ap, KERN_INFO, "%s: err_cause=%08x pp_flags=0x%x\n", |
1832 | __func__, edma_err_cause, pp->pp_flags); | ||
1833 | |||
1834 | if (edma_err_cause & EDMA_ERR_DEV) { | ||
1835 | /* | ||
1836 | * Device errors during FIS-based switching operation | ||
1837 | * require special handling. | ||
1838 | */ | ||
1839 | if (mv_handle_dev_err(ap, edma_err_cause)) | ||
1840 | return; | ||
1841 | } | ||
1542 | 1842 | ||
1843 | qc = mv_get_active_qc(ap); | ||
1844 | ata_ehi_clear_desc(ehi); | ||
1845 | ata_ehi_push_desc(ehi, "edma_err_cause=%08x pp_flags=%08x", | ||
1846 | edma_err_cause, pp->pp_flags); | ||
1543 | /* | 1847 | /* |
1544 | * All generations share these EDMA error cause bits: | 1848 | * All generations share these EDMA error cause bits: |
1545 | */ | 1849 | */ |
1546 | if (edma_err_cause & EDMA_ERR_DEV) | 1850 | if (edma_err_cause & EDMA_ERR_DEV) { |
1547 | err_mask |= AC_ERR_DEV; | 1851 | err_mask |= AC_ERR_DEV; |
1852 | action |= ATA_EH_RESET; | ||
1853 | ata_ehi_push_desc(ehi, "dev error"); | ||
1854 | } | ||
1548 | if (edma_err_cause & (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR | | 1855 | if (edma_err_cause & (EDMA_ERR_D_PAR | EDMA_ERR_PRD_PAR | |
1549 | EDMA_ERR_CRQB_PAR | EDMA_ERR_CRPB_PAR | | 1856 | EDMA_ERR_CRQB_PAR | EDMA_ERR_CRPB_PAR | |
1550 | EDMA_ERR_INTRL_PAR)) { | 1857 | EDMA_ERR_INTRL_PAR)) { |
@@ -1576,13 +1883,6 @@ static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
1576 | ata_ehi_push_desc(ehi, "EDMA self-disable"); | 1883 | ata_ehi_push_desc(ehi, "EDMA self-disable"); |
1577 | } | 1884 | } |
1578 | if (edma_err_cause & EDMA_ERR_SERR) { | 1885 | if (edma_err_cause & EDMA_ERR_SERR) { |
1579 | /* | ||
1580 | * Ensure that we read our own SCR, not a pmp link SCR: | ||
1581 | */ | ||
1582 | ap->ops->scr_read(ap, SCR_ERROR, &serr); | ||
1583 | /* | ||
1584 | * Don't clear SError here; leave it for libata-eh: | ||
1585 | */ | ||
1586 | ata_ehi_push_desc(ehi, "SError=%08x", serr); | 1886 | ata_ehi_push_desc(ehi, "SError=%08x", serr); |
1587 | err_mask |= AC_ERR_ATA_BUS; | 1887 | err_mask |= AC_ERR_ATA_BUS; |
1588 | action |= ATA_EH_RESET; | 1888 | action |= ATA_EH_RESET; |
@@ -1602,10 +1902,29 @@ static void mv_err_intr(struct ata_port *ap, struct ata_queued_cmd *qc) | |||
1602 | else | 1902 | else |
1603 | ehi->err_mask |= err_mask; | 1903 | ehi->err_mask |= err_mask; |
1604 | 1904 | ||
1605 | if (edma_err_cause & eh_freeze_mask) | 1905 | if (err_mask == AC_ERR_DEV) { |
1906 | /* | ||
1907 | * Cannot do ata_port_freeze() here, | ||
1908 | * because it would kill PIO access, | ||
1909 | * which is needed for further diagnosis. | ||
1910 | */ | ||
1911 | mv_eh_freeze(ap); | ||
1912 | abort = 1; | ||
1913 | } else if (edma_err_cause & eh_freeze_mask) { | ||
1914 | /* | ||
1915 | * Note to self: ata_port_freeze() calls ata_port_abort() | ||
1916 | */ | ||
1606 | ata_port_freeze(ap); | 1917 | ata_port_freeze(ap); |
1607 | else | 1918 | } else { |
1608 | ata_port_abort(ap); | 1919 | abort = 1; |
1920 | } | ||
1921 | |||
1922 | if (abort) { | ||
1923 | if (qc) | ||
1924 | ata_link_abort(qc->dev->link); | ||
1925 | else | ||
1926 | ata_port_abort(ap); | ||
1927 | } | ||
1609 | } | 1928 | } |
1610 | 1929 | ||
1611 | static void mv_process_crpb_response(struct ata_port *ap, | 1930 | static void mv_process_crpb_response(struct ata_port *ap, |
@@ -1632,8 +1951,9 @@ static void mv_process_crpb_response(struct ata_port *ap, | |||
1632 | } | 1951 | } |
1633 | } | 1952 | } |
1634 | ata_status = edma_status >> CRPB_FLAG_STATUS_SHIFT; | 1953 | ata_status = edma_status >> CRPB_FLAG_STATUS_SHIFT; |
1635 | qc->err_mask |= ac_err_mask(ata_status); | 1954 | if (!ac_err_mask(ata_status)) |
1636 | ata_qc_complete(qc); | 1955 | ata_qc_complete(qc); |
1956 | /* else: leave it for mv_err_intr() */ | ||
1637 | } else { | 1957 | } else { |
1638 | ata_port_printk(ap, KERN_ERR, "%s: no qc for tag=%d\n", | 1958 | ata_port_printk(ap, KERN_ERR, "%s: no qc for tag=%d\n", |
1639 | __func__, tag); | 1959 | __func__, tag); |
@@ -1677,6 +1997,44 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp | |||
1677 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); | 1997 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
1678 | } | 1998 | } |
1679 | 1999 | ||
2000 | static void mv_port_intr(struct ata_port *ap, u32 port_cause) | ||
2001 | { | ||
2002 | struct mv_port_priv *pp; | ||
2003 | int edma_was_enabled; | ||
2004 | |||
2005 | if (!ap || (ap->flags & ATA_FLAG_DISABLED)) { | ||
2006 | mv_unexpected_intr(ap, 0); | ||
2007 | return; | ||
2008 | } | ||
2009 | /* | ||
2010 | * Grab a snapshot of the EDMA_EN flag setting, | ||
2011 | * so that we have a consistent view for this port, | ||
2012 | * even if something we call of our routines changes it. | ||
2013 | */ | ||
2014 | pp = ap->private_data; | ||
2015 | edma_was_enabled = (pp->pp_flags & MV_PP_FLAG_EDMA_EN); | ||
2016 | /* | ||
2017 | * Process completed CRPB response(s) before other events. | ||
2018 | */ | ||
2019 | if (edma_was_enabled && (port_cause & DONE_IRQ)) { | ||
2020 | mv_process_crpb_entries(ap, pp); | ||
2021 | if (pp->pp_flags & MV_PP_FLAG_DELAYED_EH) | ||
2022 | mv_handle_fbs_ncq_dev_err(ap); | ||
2023 | } | ||
2024 | /* | ||
2025 | * Handle chip-reported errors, or continue on to handle PIO. | ||
2026 | */ | ||
2027 | if (unlikely(port_cause & ERR_IRQ)) { | ||
2028 | mv_err_intr(ap); | ||
2029 | } else if (!edma_was_enabled) { | ||
2030 | struct ata_queued_cmd *qc = mv_get_active_qc(ap); | ||
2031 | if (qc) | ||
2032 | ata_sff_host_intr(ap, qc); | ||
2033 | else | ||
2034 | mv_unexpected_intr(ap, edma_was_enabled); | ||
2035 | } | ||
2036 | } | ||
2037 | |||
1680 | /** | 2038 | /** |
1681 | * mv_host_intr - Handle all interrupts on the given host controller | 2039 | * mv_host_intr - Handle all interrupts on the given host controller |
1682 | * @host: host specific structure | 2040 | * @host: host specific structure |
@@ -1688,66 +2046,58 @@ static void mv_process_crpb_entries(struct ata_port *ap, struct mv_port_priv *pp | |||
1688 | static int mv_host_intr(struct ata_host *host, u32 main_irq_cause) | 2046 | static int mv_host_intr(struct ata_host *host, u32 main_irq_cause) |
1689 | { | 2047 | { |
1690 | struct mv_host_priv *hpriv = host->private_data; | 2048 | struct mv_host_priv *hpriv = host->private_data; |
1691 | void __iomem *mmio = hpriv->base, *hc_mmio = NULL; | 2049 | void __iomem *mmio = hpriv->base, *hc_mmio; |
1692 | u32 hc_irq_cause = 0; | ||
1693 | unsigned int handled = 0, port; | 2050 | unsigned int handled = 0, port; |
1694 | 2051 | ||
1695 | for (port = 0; port < hpriv->n_ports; port++) { | 2052 | for (port = 0; port < hpriv->n_ports; port++) { |
1696 | struct ata_port *ap = host->ports[port]; | 2053 | struct ata_port *ap = host->ports[port]; |
1697 | struct mv_port_priv *pp; | 2054 | unsigned int p, shift, hardport, port_cause; |
1698 | unsigned int shift, hardport, port_cause; | 2055 | |
1699 | /* | ||
1700 | * When we move to the second hc, flag our cached | ||
1701 | * copies of hc_mmio (and hc_irq_cause) as invalid again. | ||
1702 | */ | ||
1703 | if (port == MV_PORTS_PER_HC) | ||
1704 | hc_mmio = NULL; | ||
1705 | /* | ||
1706 | * Do nothing if port is not interrupting or is disabled: | ||
1707 | */ | ||
1708 | MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport); | 2056 | MV_PORT_TO_SHIFT_AND_HARDPORT(port, shift, hardport); |
1709 | port_cause = (main_irq_cause >> shift) & (DONE_IRQ | ERR_IRQ); | ||
1710 | if (!port_cause || !ap || (ap->flags & ATA_FLAG_DISABLED)) | ||
1711 | continue; | ||
1712 | /* | 2057 | /* |
1713 | * Each hc within the host has its own hc_irq_cause register. | 2058 | * Each hc within the host has its own hc_irq_cause register, |
1714 | * We defer reading it until we know we need it, right now: | 2059 | * where the interrupting ports bits get ack'd. |
1715 | * | ||
1716 | * FIXME later: we don't really need to read this register | ||
1717 | * (some logic changes required below if we go that way), | ||
1718 | * because it doesn't tell us anything new. But we do need | ||
1719 | * to write to it, outside the top of this loop, | ||
1720 | * to reset the interrupt triggers for next time. | ||
1721 | */ | 2060 | */ |
1722 | if (!hc_mmio) { | 2061 | if (hardport == 0) { /* first port on this hc ? */ |
2062 | u32 hc_cause = (main_irq_cause >> shift) & HC0_IRQ_PEND; | ||
2063 | u32 port_mask, ack_irqs; | ||
2064 | /* | ||
2065 | * Skip this entire hc if nothing pending for any ports | ||
2066 | */ | ||
2067 | if (!hc_cause) { | ||
2068 | port += MV_PORTS_PER_HC - 1; | ||
2069 | continue; | ||
2070 | } | ||
2071 | /* | ||
2072 | * We don't need/want to read the hc_irq_cause register, | ||
2073 | * because doing so hurts performance, and | ||
2074 | * main_irq_cause already gives us everything we need. | ||
2075 | * | ||
2076 | * But we do have to *write* to the hc_irq_cause to ack | ||
2077 | * the ports that we are handling this time through. | ||
2078 | * | ||
2079 | * This requires that we create a bitmap for those | ||
2080 | * ports which interrupted us, and use that bitmap | ||
2081 | * to ack (only) those ports via hc_irq_cause. | ||
2082 | */ | ||
2083 | ack_irqs = 0; | ||
2084 | for (p = 0; p < MV_PORTS_PER_HC; ++p) { | ||
2085 | if ((port + p) >= hpriv->n_ports) | ||
2086 | break; | ||
2087 | port_mask = (DONE_IRQ | ERR_IRQ) << (p * 2); | ||
2088 | if (hc_cause & port_mask) | ||
2089 | ack_irqs |= (DMA_IRQ | DEV_IRQ) << p; | ||
2090 | } | ||
1723 | hc_mmio = mv_hc_base_from_port(mmio, port); | 2091 | hc_mmio = mv_hc_base_from_port(mmio, port); |
1724 | hc_irq_cause = readl(hc_mmio + HC_IRQ_CAUSE_OFS); | 2092 | writelfl(~ack_irqs, hc_mmio + HC_IRQ_CAUSE_OFS); |
1725 | writelfl(~hc_irq_cause, hc_mmio + HC_IRQ_CAUSE_OFS); | ||
1726 | handled = 1; | 2093 | handled = 1; |
1727 | } | 2094 | } |
1728 | /* | 2095 | /* |
1729 | * Process completed CRPB response(s) before other events. | 2096 | * Handle interrupts signalled for this port: |
1730 | */ | ||
1731 | pp = ap->private_data; | ||
1732 | if (hc_irq_cause & (DMA_IRQ << hardport)) { | ||
1733 | if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) | ||
1734 | mv_process_crpb_entries(ap, pp); | ||
1735 | } | ||
1736 | /* | ||
1737 | * Handle chip-reported errors, or continue on to handle PIO. | ||
1738 | */ | 2097 | */ |
1739 | if (unlikely(port_cause & ERR_IRQ)) { | 2098 | port_cause = (main_irq_cause >> shift) & (DONE_IRQ | ERR_IRQ); |
1740 | mv_err_intr(ap, mv_get_active_qc(ap)); | 2099 | if (port_cause) |
1741 | } else if (hc_irq_cause & (DEV_IRQ << hardport)) { | 2100 | mv_port_intr(ap, port_cause); |
1742 | if (!(pp->pp_flags & MV_PP_FLAG_EDMA_EN)) { | ||
1743 | struct ata_queued_cmd *qc = mv_get_active_qc(ap); | ||
1744 | if (qc) { | ||
1745 | ata_sff_host_intr(ap, qc); | ||
1746 | continue; | ||
1747 | } | ||
1748 | } | ||
1749 | mv_unexpected_intr(ap); | ||
1750 | } | ||
1751 | } | 2101 | } |
1752 | return handled; | 2102 | return handled; |
1753 | } | 2103 | } |
@@ -1894,7 +2244,7 @@ static void mv5_reset_bus(struct ata_host *host, void __iomem *mmio) | |||
1894 | 2244 | ||
1895 | static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio) | 2245 | static void mv5_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio) |
1896 | { | 2246 | { |
1897 | writel(0x0fcfffff, mmio + MV_FLASH_CTL); | 2247 | writel(0x0fcfffff, mmio + MV_FLASH_CTL_OFS); |
1898 | } | 2248 | } |
1899 | 2249 | ||
1900 | static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx, | 2250 | static void mv5_read_preamp(struct mv_host_priv *hpriv, int idx, |
@@ -1913,7 +2263,7 @@ static void mv5_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio) | |||
1913 | { | 2263 | { |
1914 | u32 tmp; | 2264 | u32 tmp; |
1915 | 2265 | ||
1916 | writel(0, mmio + MV_GPIO_PORT_CTL); | 2266 | writel(0, mmio + MV_GPIO_PORT_CTL_OFS); |
1917 | 2267 | ||
1918 | /* FIXME: handle MV_HP_ERRATA_50XXB2 errata */ | 2268 | /* FIXME: handle MV_HP_ERRATA_50XXB2 errata */ |
1919 | 2269 | ||
@@ -1931,14 +2281,14 @@ static void mv5_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
1931 | int fix_apm_sq = (hpriv->hp_flags & MV_HP_ERRATA_50XXB0); | 2281 | int fix_apm_sq = (hpriv->hp_flags & MV_HP_ERRATA_50XXB0); |
1932 | 2282 | ||
1933 | if (fix_apm_sq) { | 2283 | if (fix_apm_sq) { |
1934 | tmp = readl(phy_mmio + MV5_LT_MODE); | 2284 | tmp = readl(phy_mmio + MV5_LTMODE_OFS); |
1935 | tmp |= (1 << 19); | 2285 | tmp |= (1 << 19); |
1936 | writel(tmp, phy_mmio + MV5_LT_MODE); | 2286 | writel(tmp, phy_mmio + MV5_LTMODE_OFS); |
1937 | 2287 | ||
1938 | tmp = readl(phy_mmio + MV5_PHY_CTL); | 2288 | tmp = readl(phy_mmio + MV5_PHY_CTL_OFS); |
1939 | tmp &= ~0x3; | 2289 | tmp &= ~0x3; |
1940 | tmp |= 0x1; | 2290 | tmp |= 0x1; |
1941 | writel(tmp, phy_mmio + MV5_PHY_CTL); | 2291 | writel(tmp, phy_mmio + MV5_PHY_CTL_OFS); |
1942 | } | 2292 | } |
1943 | 2293 | ||
1944 | tmp = readl(phy_mmio + MV5_PHY_MODE); | 2294 | tmp = readl(phy_mmio + MV5_PHY_MODE); |
@@ -1956,11 +2306,6 @@ static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
1956 | { | 2306 | { |
1957 | void __iomem *port_mmio = mv_port_base(mmio, port); | 2307 | void __iomem *port_mmio = mv_port_base(mmio, port); |
1958 | 2308 | ||
1959 | /* | ||
1960 | * The datasheet warns against setting ATA_RST when EDMA is active | ||
1961 | * (but doesn't say what the problem might be). So we first try | ||
1962 | * to disable the EDMA engine before doing the ATA_RST operation. | ||
1963 | */ | ||
1964 | mv_reset_channel(hpriv, mmio, port); | 2309 | mv_reset_channel(hpriv, mmio, port); |
1965 | 2310 | ||
1966 | ZERO(0x028); /* command */ | 2311 | ZERO(0x028); /* command */ |
@@ -1975,7 +2320,7 @@ static void mv5_reset_hc_port(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
1975 | ZERO(0x024); /* respq outp */ | 2320 | ZERO(0x024); /* respq outp */ |
1976 | ZERO(0x020); /* respq inp */ | 2321 | ZERO(0x020); /* respq inp */ |
1977 | ZERO(0x02c); /* test control */ | 2322 | ZERO(0x02c); /* test control */ |
1978 | writel(0xbc, port_mmio + EDMA_IORDY_TMOUT); | 2323 | writel(0xbc, port_mmio + EDMA_IORDY_TMOUT_OFS); |
1979 | } | 2324 | } |
1980 | #undef ZERO | 2325 | #undef ZERO |
1981 | 2326 | ||
@@ -2021,13 +2366,13 @@ static void mv_reset_pci_bus(struct ata_host *host, void __iomem *mmio) | |||
2021 | struct mv_host_priv *hpriv = host->private_data; | 2366 | struct mv_host_priv *hpriv = host->private_data; |
2022 | u32 tmp; | 2367 | u32 tmp; |
2023 | 2368 | ||
2024 | tmp = readl(mmio + MV_PCI_MODE); | 2369 | tmp = readl(mmio + MV_PCI_MODE_OFS); |
2025 | tmp &= 0xff00ffff; | 2370 | tmp &= 0xff00ffff; |
2026 | writel(tmp, mmio + MV_PCI_MODE); | 2371 | writel(tmp, mmio + MV_PCI_MODE_OFS); |
2027 | 2372 | ||
2028 | ZERO(MV_PCI_DISC_TIMER); | 2373 | ZERO(MV_PCI_DISC_TIMER); |
2029 | ZERO(MV_PCI_MSI_TRIGGER); | 2374 | ZERO(MV_PCI_MSI_TRIGGER); |
2030 | writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT); | 2375 | writel(0x000100ff, mmio + MV_PCI_XBAR_TMOUT_OFS); |
2031 | ZERO(PCI_HC_MAIN_IRQ_MASK_OFS); | 2376 | ZERO(PCI_HC_MAIN_IRQ_MASK_OFS); |
2032 | ZERO(MV_PCI_SERR_MASK); | 2377 | ZERO(MV_PCI_SERR_MASK); |
2033 | ZERO(hpriv->irq_cause_ofs); | 2378 | ZERO(hpriv->irq_cause_ofs); |
@@ -2045,10 +2390,10 @@ static void mv6_reset_flash(struct mv_host_priv *hpriv, void __iomem *mmio) | |||
2045 | 2390 | ||
2046 | mv5_reset_flash(hpriv, mmio); | 2391 | mv5_reset_flash(hpriv, mmio); |
2047 | 2392 | ||
2048 | tmp = readl(mmio + MV_GPIO_PORT_CTL); | 2393 | tmp = readl(mmio + MV_GPIO_PORT_CTL_OFS); |
2049 | tmp &= 0x3; | 2394 | tmp &= 0x3; |
2050 | tmp |= (1 << 5) | (1 << 6); | 2395 | tmp |= (1 << 5) | (1 << 6); |
2051 | writel(tmp, mmio + MV_GPIO_PORT_CTL); | 2396 | writel(tmp, mmio + MV_GPIO_PORT_CTL_OFS); |
2052 | } | 2397 | } |
2053 | 2398 | ||
2054 | /** | 2399 | /** |
@@ -2121,7 +2466,7 @@ static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx, | |||
2121 | void __iomem *port_mmio; | 2466 | void __iomem *port_mmio; |
2122 | u32 tmp; | 2467 | u32 tmp; |
2123 | 2468 | ||
2124 | tmp = readl(mmio + MV_RESET_CFG); | 2469 | tmp = readl(mmio + MV_RESET_CFG_OFS); |
2125 | if ((tmp & (1 << 0)) == 0) { | 2470 | if ((tmp & (1 << 0)) == 0) { |
2126 | hpriv->signal[idx].amps = 0x7 << 8; | 2471 | hpriv->signal[idx].amps = 0x7 << 8; |
2127 | hpriv->signal[idx].pre = 0x1 << 5; | 2472 | hpriv->signal[idx].pre = 0x1 << 5; |
@@ -2137,7 +2482,7 @@ static void mv6_read_preamp(struct mv_host_priv *hpriv, int idx, | |||
2137 | 2482 | ||
2138 | static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio) | 2483 | static void mv6_enable_leds(struct mv_host_priv *hpriv, void __iomem *mmio) |
2139 | { | 2484 | { |
2140 | writel(0x00000060, mmio + MV_GPIO_PORT_CTL); | 2485 | writel(0x00000060, mmio + MV_GPIO_PORT_CTL_OFS); |
2141 | } | 2486 | } |
2142 | 2487 | ||
2143 | static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | 2488 | static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, |
@@ -2235,11 +2580,6 @@ static void mv_soc_reset_hc_port(struct mv_host_priv *hpriv, | |||
2235 | { | 2580 | { |
2236 | void __iomem *port_mmio = mv_port_base(mmio, port); | 2581 | void __iomem *port_mmio = mv_port_base(mmio, port); |
2237 | 2582 | ||
2238 | /* | ||
2239 | * The datasheet warns against setting ATA_RST when EDMA is active | ||
2240 | * (but doesn't say what the problem might be). So we first try | ||
2241 | * to disable the EDMA engine before doing the ATA_RST operation. | ||
2242 | */ | ||
2243 | mv_reset_channel(hpriv, mmio, port); | 2583 | mv_reset_channel(hpriv, mmio, port); |
2244 | 2584 | ||
2245 | ZERO(0x028); /* command */ | 2585 | ZERO(0x028); /* command */ |
@@ -2254,7 +2594,7 @@ static void mv_soc_reset_hc_port(struct mv_host_priv *hpriv, | |||
2254 | ZERO(0x024); /* respq outp */ | 2594 | ZERO(0x024); /* respq outp */ |
2255 | ZERO(0x020); /* respq inp */ | 2595 | ZERO(0x020); /* respq inp */ |
2256 | ZERO(0x02c); /* test control */ | 2596 | ZERO(0x02c); /* test control */ |
2257 | writel(0xbc, port_mmio + EDMA_IORDY_TMOUT); | 2597 | writel(0xbc, port_mmio + EDMA_IORDY_TMOUT_OFS); |
2258 | } | 2598 | } |
2259 | 2599 | ||
2260 | #undef ZERO | 2600 | #undef ZERO |
@@ -2297,38 +2637,39 @@ static void mv_soc_reset_bus(struct ata_host *host, void __iomem *mmio) | |||
2297 | return; | 2637 | return; |
2298 | } | 2638 | } |
2299 | 2639 | ||
2300 | static void mv_setup_ifctl(void __iomem *port_mmio, int want_gen2i) | 2640 | static void mv_setup_ifcfg(void __iomem *port_mmio, int want_gen2i) |
2301 | { | 2641 | { |
2302 | u32 ifctl = readl(port_mmio + SATA_INTERFACE_CFG); | 2642 | u32 ifcfg = readl(port_mmio + SATA_INTERFACE_CFG_OFS); |
2303 | 2643 | ||
2304 | ifctl = (ifctl & 0xf7f) | 0x9b1000; /* from chip spec */ | 2644 | ifcfg = (ifcfg & 0xf7f) | 0x9b1000; /* from chip spec */ |
2305 | if (want_gen2i) | 2645 | if (want_gen2i) |
2306 | ifctl |= (1 << 7); /* enable gen2i speed */ | 2646 | ifcfg |= (1 << 7); /* enable gen2i speed */ |
2307 | writelfl(ifctl, port_mmio + SATA_INTERFACE_CFG); | 2647 | writelfl(ifcfg, port_mmio + SATA_INTERFACE_CFG_OFS); |
2308 | } | 2648 | } |
2309 | 2649 | ||
2310 | /* | ||
2311 | * Caller must ensure that EDMA is not active, | ||
2312 | * by first doing mv_stop_edma() where needed. | ||
2313 | */ | ||
2314 | static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio, | 2650 | static void mv_reset_channel(struct mv_host_priv *hpriv, void __iomem *mmio, |
2315 | unsigned int port_no) | 2651 | unsigned int port_no) |
2316 | { | 2652 | { |
2317 | void __iomem *port_mmio = mv_port_base(mmio, port_no); | 2653 | void __iomem *port_mmio = mv_port_base(mmio, port_no); |
2318 | 2654 | ||
2655 | /* | ||
2656 | * The datasheet warns against setting EDMA_RESET when EDMA is active | ||
2657 | * (but doesn't say what the problem might be). So we first try | ||
2658 | * to disable the EDMA engine before doing the EDMA_RESET operation. | ||
2659 | */ | ||
2319 | mv_stop_edma_engine(port_mmio); | 2660 | mv_stop_edma_engine(port_mmio); |
2320 | writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS); | 2661 | writelfl(EDMA_RESET, port_mmio + EDMA_CMD_OFS); |
2321 | 2662 | ||
2322 | if (!IS_GEN_I(hpriv)) { | 2663 | if (!IS_GEN_I(hpriv)) { |
2323 | /* Enable 3.0gb/s link speed */ | 2664 | /* Enable 3.0gb/s link speed: this survives EDMA_RESET */ |
2324 | mv_setup_ifctl(port_mmio, 1); | 2665 | mv_setup_ifcfg(port_mmio, 1); |
2325 | } | 2666 | } |
2326 | /* | 2667 | /* |
2327 | * Strobing ATA_RST here causes a hard reset of the SATA transport, | 2668 | * Strobing EDMA_RESET here causes a hard reset of the SATA transport, |
2328 | * link, and physical layers. It resets all SATA interface registers | 2669 | * link, and physical layers. It resets all SATA interface registers |
2329 | * (except for SATA_INTERFACE_CFG), and issues a COMRESET to the dev. | 2670 | * (except for SATA_INTERFACE_CFG), and issues a COMRESET to the dev. |
2330 | */ | 2671 | */ |
2331 | writelfl(ATA_RST, port_mmio + EDMA_CMD_OFS); | 2672 | writelfl(EDMA_RESET, port_mmio + EDMA_CMD_OFS); |
2332 | udelay(25); /* allow reset propagation */ | 2673 | udelay(25); /* allow reset propagation */ |
2333 | writelfl(0, port_mmio + EDMA_CMD_OFS); | 2674 | writelfl(0, port_mmio + EDMA_CMD_OFS); |
2334 | 2675 | ||
@@ -2392,7 +2733,7 @@ static int mv_hardreset(struct ata_link *link, unsigned int *class, | |||
2392 | sata_scr_read(link, SCR_STATUS, &sstatus); | 2733 | sata_scr_read(link, SCR_STATUS, &sstatus); |
2393 | if (!IS_GEN_I(hpriv) && ++attempts >= 5 && sstatus == 0x121) { | 2734 | if (!IS_GEN_I(hpriv) && ++attempts >= 5 && sstatus == 0x121) { |
2394 | /* Force 1.5gb/s link speed and try again */ | 2735 | /* Force 1.5gb/s link speed and try again */ |
2395 | mv_setup_ifctl(mv_ap_base(ap), 0); | 2736 | mv_setup_ifcfg(mv_ap_base(ap), 0); |
2396 | if (time_after(jiffies + HZ, deadline)) | 2737 | if (time_after(jiffies + HZ, deadline)) |
2397 | extra = HZ; /* only extend it once, max */ | 2738 | extra = HZ; /* only extend it once, max */ |
2398 | } | 2739 | } |
@@ -2493,6 +2834,34 @@ static void mv_port_init(struct ata_ioports *port, void __iomem *port_mmio) | |||
2493 | readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS)); | 2834 | readl(port_mmio + EDMA_ERR_IRQ_MASK_OFS)); |
2494 | } | 2835 | } |
2495 | 2836 | ||
2837 | static unsigned int mv_in_pcix_mode(struct ata_host *host) | ||
2838 | { | ||
2839 | struct mv_host_priv *hpriv = host->private_data; | ||
2840 | void __iomem *mmio = hpriv->base; | ||
2841 | u32 reg; | ||
2842 | |||
2843 | if (!HAS_PCI(host) || !IS_PCIE(hpriv)) | ||
2844 | return 0; /* not PCI-X capable */ | ||
2845 | reg = readl(mmio + MV_PCI_MODE_OFS); | ||
2846 | if ((reg & MV_PCI_MODE_MASK) == 0) | ||
2847 | return 0; /* conventional PCI mode */ | ||
2848 | return 1; /* chip is in PCI-X mode */ | ||
2849 | } | ||
2850 | |||
2851 | static int mv_pci_cut_through_okay(struct ata_host *host) | ||
2852 | { | ||
2853 | struct mv_host_priv *hpriv = host->private_data; | ||
2854 | void __iomem *mmio = hpriv->base; | ||
2855 | u32 reg; | ||
2856 | |||
2857 | if (!mv_in_pcix_mode(host)) { | ||
2858 | reg = readl(mmio + PCI_COMMAND_OFS); | ||
2859 | if (reg & PCI_COMMAND_MRDTRIG) | ||
2860 | return 0; /* not okay */ | ||
2861 | } | ||
2862 | return 1; /* okay */ | ||
2863 | } | ||
2864 | |||
2496 | static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | 2865 | static int mv_chip_id(struct ata_host *host, unsigned int board_idx) |
2497 | { | 2866 | { |
2498 | struct pci_dev *pdev = to_pci_dev(host->dev); | 2867 | struct pci_dev *pdev = to_pci_dev(host->dev); |
@@ -2560,7 +2929,7 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | |||
2560 | break; | 2929 | break; |
2561 | 2930 | ||
2562 | case chip_7042: | 2931 | case chip_7042: |
2563 | hp_flags |= MV_HP_PCIE; | 2932 | hp_flags |= MV_HP_PCIE | MV_HP_CUT_THROUGH; |
2564 | if (pdev->vendor == PCI_VENDOR_ID_TTI && | 2933 | if (pdev->vendor == PCI_VENDOR_ID_TTI && |
2565 | (pdev->device == 0x2300 || pdev->device == 0x2310)) | 2934 | (pdev->device == 0x2300 || pdev->device == 0x2310)) |
2566 | { | 2935 | { |
@@ -2590,9 +2959,12 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | |||
2590 | " and avoid the final two gigabytes on" | 2959 | " and avoid the final two gigabytes on" |
2591 | " all RocketRAID BIOS initialized drives.\n"); | 2960 | " all RocketRAID BIOS initialized drives.\n"); |
2592 | } | 2961 | } |
2962 | /* drop through */ | ||
2593 | case chip_6042: | 2963 | case chip_6042: |
2594 | hpriv->ops = &mv6xxx_ops; | 2964 | hpriv->ops = &mv6xxx_ops; |
2595 | hp_flags |= MV_HP_GEN_IIE; | 2965 | hp_flags |= MV_HP_GEN_IIE; |
2966 | if (board_idx == chip_6042 && mv_pci_cut_through_okay(host)) | ||
2967 | hp_flags |= MV_HP_CUT_THROUGH; | ||
2596 | 2968 | ||
2597 | switch (pdev->revision) { | 2969 | switch (pdev->revision) { |
2598 | case 0x0: | 2970 | case 0x0: |
diff --git a/drivers/atm/iphase.h b/drivers/atm/iphase.h index 133eefcc0475..b2cd20f549cb 100644 --- a/drivers/atm/iphase.h +++ b/drivers/atm/iphase.h | |||
@@ -1025,7 +1025,8 @@ typedef struct iadev_t { | |||
1025 | spinlock_t rx_lock, misc_lock; | 1025 | spinlock_t rx_lock, misc_lock; |
1026 | struct atm_vcc **rx_open; /* list of all open VCs */ | 1026 | struct atm_vcc **rx_open; /* list of all open VCs */ |
1027 | u16 num_rx_desc, rx_buf_sz, rxing; | 1027 | u16 num_rx_desc, rx_buf_sz, rxing; |
1028 | u32 rx_pkt_ram, rx_tmp_cnt, rx_tmp_jif; | 1028 | u32 rx_pkt_ram, rx_tmp_cnt; |
1029 | unsigned long rx_tmp_jif; | ||
1029 | void __iomem *RX_DESC_BASE_ADDR; | 1030 | void __iomem *RX_DESC_BASE_ADDR; |
1030 | u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt; | 1031 | u32 drop_rxpkt, drop_rxcell, rx_cell_cnt, rx_pkt_cnt; |
1031 | struct atm_dev *next_board; /* other iphase devices */ | 1032 | struct atm_dev *next_board; /* other iphase devices */ |
diff --git a/drivers/base/class.c b/drivers/base/class.c index 0ef00e8d4153..e085af0ff94f 100644 --- a/drivers/base/class.c +++ b/drivers/base/class.c | |||
@@ -140,7 +140,6 @@ int class_register(struct class *cls) | |||
140 | 140 | ||
141 | pr_debug("device class '%s': registering\n", cls->name); | 141 | pr_debug("device class '%s': registering\n", cls->name); |
142 | 142 | ||
143 | INIT_LIST_HEAD(&cls->children); | ||
144 | INIT_LIST_HEAD(&cls->devices); | 143 | INIT_LIST_HEAD(&cls->devices); |
145 | INIT_LIST_HEAD(&cls->interfaces); | 144 | INIT_LIST_HEAD(&cls->interfaces); |
146 | kset_init(&cls->class_dirs); | 145 | kset_init(&cls->class_dirs); |
diff --git a/drivers/base/core.c b/drivers/base/core.c index be288b5e4180..3eeac5a78581 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -1218,13 +1218,11 @@ int device_rename(struct device *dev, char *new_name) | |||
1218 | } | 1218 | } |
1219 | #else | 1219 | #else |
1220 | if (dev->class) { | 1220 | if (dev->class) { |
1221 | sysfs_remove_link(&dev->class->subsys.kobj, old_device_name); | ||
1222 | error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, | 1221 | error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj, |
1223 | dev->bus_id); | 1222 | dev->bus_id); |
1224 | if (error) { | 1223 | if (error) |
1225 | dev_err(dev, "%s: sysfs_create_symlink failed (%d)\n", | 1224 | goto out; |
1226 | __func__, error); | 1225 | sysfs_remove_link(&dev->class->subsys.kobj, old_device_name); |
1227 | } | ||
1228 | } | 1226 | } |
1229 | #endif | 1227 | #endif |
1230 | 1228 | ||
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 8ce6de5a7e28..937e8258981d 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c | |||
@@ -53,11 +53,13 @@ int register_memory_notifier(struct notifier_block *nb) | |||
53 | { | 53 | { |
54 | return blocking_notifier_chain_register(&memory_chain, nb); | 54 | return blocking_notifier_chain_register(&memory_chain, nb); |
55 | } | 55 | } |
56 | EXPORT_SYMBOL(register_memory_notifier); | ||
56 | 57 | ||
57 | void unregister_memory_notifier(struct notifier_block *nb) | 58 | void unregister_memory_notifier(struct notifier_block *nb) |
58 | { | 59 | { |
59 | blocking_notifier_chain_unregister(&memory_chain, nb); | 60 | blocking_notifier_chain_unregister(&memory_chain, nb); |
60 | } | 61 | } |
62 | EXPORT_SYMBOL(unregister_memory_notifier); | ||
61 | 63 | ||
62 | /* | 64 | /* |
63 | * register_memory - Setup a sysfs device for a memory block | 65 | * register_memory - Setup a sysfs device for a memory block |
diff --git a/drivers/base/sys.c b/drivers/base/sys.c index 4fbb56bcb1ee..358bb0be3c08 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c | |||
@@ -175,8 +175,7 @@ int sysdev_driver_register(struct sysdev_class *cls, struct sysdev_driver *drv) | |||
175 | } | 175 | } |
176 | 176 | ||
177 | /* Check whether this driver has already been added to a class. */ | 177 | /* Check whether this driver has already been added to a class. */ |
178 | if ((drv->entry.next != drv->entry.prev) || | 178 | if (drv->entry.next && !list_empty(&drv->entry)) { |
179 | (drv->entry.next != NULL)) { | ||
180 | printk(KERN_WARNING "sysdev: class %s: driver (%p) has already" | 179 | printk(KERN_WARNING "sysdev: class %s: driver (%p) has already" |
181 | " been registered to a class, something is wrong, but " | 180 | " been registered to a class, something is wrong, but " |
182 | "will forge on!\n", cls->name, drv); | 181 | "will forge on!\n", cls->name, drv); |
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c index 8fc429cf82b6..41f818be2f7e 100644 --- a/drivers/block/aoe/aoecmd.c +++ b/drivers/block/aoe/aoecmd.c | |||
@@ -755,11 +755,13 @@ diskstats(struct gendisk *disk, struct bio *bio, ulong duration, sector_t sector | |||
755 | { | 755 | { |
756 | unsigned long n_sect = bio->bi_size >> 9; | 756 | unsigned long n_sect = bio->bi_size >> 9; |
757 | const int rw = bio_data_dir(bio); | 757 | const int rw = bio_data_dir(bio); |
758 | struct hd_struct *part; | ||
758 | 759 | ||
759 | all_stat_inc(disk, ios[rw], sector); | 760 | part = get_part(disk, sector); |
760 | all_stat_add(disk, ticks[rw], duration, sector); | 761 | all_stat_inc(disk, part, ios[rw], sector); |
761 | all_stat_add(disk, sectors[rw], n_sect, sector); | 762 | all_stat_add(disk, part, ticks[rw], duration, sector); |
762 | all_stat_add(disk, io_ticks, duration, sector); | 763 | all_stat_add(disk, part, sectors[rw], n_sect, sector); |
764 | all_stat_add(disk, part, io_ticks, duration, sector); | ||
763 | } | 765 | } |
764 | 766 | ||
765 | void | 767 | void |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 5dce3877eee5..595a925c62a9 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -196,6 +196,7 @@ config ESPSERIAL | |||
196 | config MOXA_INTELLIO | 196 | config MOXA_INTELLIO |
197 | tristate "Moxa Intellio support" | 197 | tristate "Moxa Intellio support" |
198 | depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI) | 198 | depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI) |
199 | select FW_LOADER | ||
199 | help | 200 | help |
200 | Say Y here if you have a Moxa Intellio multiport serial card. | 201 | Say Y here if you have a Moxa Intellio multiport serial card. |
201 | 202 | ||
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 5a5455585c1d..192688344ed2 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c | |||
@@ -2352,10 +2352,16 @@ static int __devinit ipmi_of_probe(struct of_device *dev, | |||
2352 | 2352 | ||
2353 | info->si_type = (enum si_type) match->data; | 2353 | info->si_type = (enum si_type) match->data; |
2354 | info->addr_source = "device-tree"; | 2354 | info->addr_source = "device-tree"; |
2355 | info->io_setup = mem_setup; | ||
2356 | info->irq_setup = std_irq_setup; | 2355 | info->irq_setup = std_irq_setup; |
2357 | 2356 | ||
2358 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; | 2357 | if (resource.flags & IORESOURCE_IO) { |
2358 | info->io_setup = port_setup; | ||
2359 | info->io.addr_type = IPMI_IO_ADDR_SPACE; | ||
2360 | } else { | ||
2361 | info->io_setup = mem_setup; | ||
2362 | info->io.addr_type = IPMI_MEM_ADDR_SPACE; | ||
2363 | } | ||
2364 | |||
2359 | info->io.addr_data = resource.start; | 2365 | info->io.addr_data = resource.start; |
2360 | 2366 | ||
2361 | info->io.regsize = regsize ? *regsize : DEFAULT_REGSIZE; | 2367 | info->io.regsize = regsize ? *regsize : DEFAULT_REGSIZE; |
diff --git a/drivers/char/serial167.c b/drivers/char/serial167.c index fd2db07a50fc..3b23270eaa65 100644 --- a/drivers/char/serial167.c +++ b/drivers/char/serial167.c | |||
@@ -1073,7 +1073,7 @@ static int cy_put_char(struct tty_struct *tty, unsigned char ch) | |||
1073 | return 0; | 1073 | return 0; |
1074 | 1074 | ||
1075 | if (!info->xmit_buf) | 1075 | if (!info->xmit_buf) |
1076 | return; | 1076 | return 0; |
1077 | 1077 | ||
1078 | local_irq_save(flags); | 1078 | local_irq_save(flags); |
1079 | if (info->xmit_cnt >= PAGE_SIZE - 1) { | 1079 | if (info->xmit_cnt >= PAGE_SIZE - 1) { |
diff --git a/drivers/char/sx.c b/drivers/char/sx.c index f39f6fd89350..b1a7a8cb65ea 100644 --- a/drivers/char/sx.c +++ b/drivers/char/sx.c | |||
@@ -970,7 +970,8 @@ static int sx_set_real_termios(void *ptr) | |||
970 | sx_write_channel_byte(port, hi_mask, 0x1f); | 970 | sx_write_channel_byte(port, hi_mask, 0x1f); |
971 | break; | 971 | break; |
972 | default: | 972 | default: |
973 | printk(KERN_INFO "sx: Invalid wordsize: %u\n", CFLAG & CSIZE); | 973 | printk(KERN_INFO "sx: Invalid wordsize: %u\n", |
974 | (unsigned int)CFLAG & CSIZE); | ||
974 | break; | 975 | break; |
975 | } | 976 | } |
976 | 977 | ||
@@ -997,7 +998,8 @@ static int sx_set_real_termios(void *ptr) | |||
997 | set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags); | 998 | set_bit(TTY_HW_COOK_IN, &port->gs.tty->flags); |
998 | } | 999 | } |
999 | sx_dprintk(SX_DEBUG_TERMIOS, "iflags: %x(%d) ", | 1000 | sx_dprintk(SX_DEBUG_TERMIOS, "iflags: %x(%d) ", |
1000 | port->gs.tty->termios->c_iflag, I_OTHER(port->gs.tty)); | 1001 | (unsigned int)port->gs.tty->termios->c_iflag, |
1002 | I_OTHER(port->gs.tty)); | ||
1001 | 1003 | ||
1002 | /* Tell line discipline whether we will do output cooking. | 1004 | /* Tell line discipline whether we will do output cooking. |
1003 | * If OPOST is set and no other output flags are set then we can do output | 1005 | * If OPOST is set and no other output flags are set then we can do output |
@@ -1010,7 +1012,8 @@ static int sx_set_real_termios(void *ptr) | |||
1010 | clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags); | 1012 | clear_bit(TTY_HW_COOK_OUT, &port->gs.tty->flags); |
1011 | } | 1013 | } |
1012 | sx_dprintk(SX_DEBUG_TERMIOS, "oflags: %x(%d)\n", | 1014 | sx_dprintk(SX_DEBUG_TERMIOS, "oflags: %x(%d)\n", |
1013 | port->gs.tty->termios->c_oflag, O_OTHER(port->gs.tty)); | 1015 | (unsigned int)port->gs.tty->termios->c_oflag, |
1016 | O_OTHER(port->gs.tty)); | ||
1014 | /* port->c_dcd = sx_get_CD (port); */ | 1017 | /* port->c_dcd = sx_get_CD (port); */ |
1015 | func_exit(); | 1018 | func_exit(); |
1016 | return 0; | 1019 | return 0; |
diff --git a/drivers/char/synclink_gt.c b/drivers/char/synclink_gt.c index 2001b0e52dc6..55c1653be00c 100644 --- a/drivers/char/synclink_gt.c +++ b/drivers/char/synclink_gt.c | |||
@@ -916,7 +916,7 @@ static int put_char(struct tty_struct *tty, unsigned char ch) | |||
916 | { | 916 | { |
917 | struct slgt_info *info = tty->driver_data; | 917 | struct slgt_info *info = tty->driver_data; |
918 | unsigned long flags; | 918 | unsigned long flags; |
919 | int ret; | 919 | int ret = 0; |
920 | 920 | ||
921 | if (sanity_check(info, tty->name, "put_char")) | 921 | if (sanity_check(info, tty->name, "put_char")) |
922 | return 0; | 922 | return 0; |
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 49c1a2267a55..e94bee032314 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1215,10 +1215,11 @@ int tty_check_change(struct tty_struct *tty) | |||
1215 | 1215 | ||
1216 | if (!tty->pgrp) { | 1216 | if (!tty->pgrp) { |
1217 | printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n"); | 1217 | printk(KERN_WARNING "tty_check_change: tty->pgrp == NULL!\n"); |
1218 | goto out; | 1218 | goto out_unlock; |
1219 | } | 1219 | } |
1220 | if (task_pgrp(current) == tty->pgrp) | 1220 | if (task_pgrp(current) == tty->pgrp) |
1221 | goto out; | 1221 | goto out_unlock; |
1222 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); | ||
1222 | if (is_ignored(SIGTTOU)) | 1223 | if (is_ignored(SIGTTOU)) |
1223 | goto out; | 1224 | goto out; |
1224 | if (is_current_pgrp_orphaned()) { | 1225 | if (is_current_pgrp_orphaned()) { |
@@ -1229,6 +1230,8 @@ int tty_check_change(struct tty_struct *tty) | |||
1229 | set_thread_flag(TIF_SIGPENDING); | 1230 | set_thread_flag(TIF_SIGPENDING); |
1230 | ret = -ERESTARTSYS; | 1231 | ret = -ERESTARTSYS; |
1231 | out: | 1232 | out: |
1233 | return ret; | ||
1234 | out_unlock: | ||
1232 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); | 1235 | spin_unlock_irqrestore(&tty->ctrl_lock, flags); |
1233 | return ret; | 1236 | return ret; |
1234 | } | 1237 | } |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index e458b08139af..fa1ffbf2c621 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -2742,6 +2742,10 @@ static int con_open(struct tty_struct *tty, struct file *filp) | |||
2742 | tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; | 2742 | tty->winsize.ws_row = vc_cons[currcons].d->vc_rows; |
2743 | tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; | 2743 | tty->winsize.ws_col = vc_cons[currcons].d->vc_cols; |
2744 | } | 2744 | } |
2745 | if (vc->vc_utf) | ||
2746 | tty->termios->c_iflag |= IUTF8; | ||
2747 | else | ||
2748 | tty->termios->c_iflag &= ~IUTF8; | ||
2745 | release_console_sem(); | 2749 | release_console_sem(); |
2746 | vcs_make_sysfs(tty); | 2750 | vcs_make_sysfs(tty); |
2747 | return ret; | 2751 | return ret; |
@@ -2918,6 +2922,8 @@ int __init vty_init(void) | |||
2918 | console_driver->minor_start = 1; | 2922 | console_driver->minor_start = 1; |
2919 | console_driver->type = TTY_DRIVER_TYPE_CONSOLE; | 2923 | console_driver->type = TTY_DRIVER_TYPE_CONSOLE; |
2920 | console_driver->init_termios = tty_std_termios; | 2924 | console_driver->init_termios = tty_std_termios; |
2925 | if (default_utf8) | ||
2926 | console_driver->init_termios.c_iflag |= IUTF8; | ||
2921 | console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS; | 2927 | console_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS; |
2922 | tty_set_operations(console_driver, &con_ops); | 2928 | tty_set_operations(console_driver, &con_ops); |
2923 | if (tty_register_driver(console_driver)) | 2929 | if (tty_register_driver(console_driver)) |
diff --git a/drivers/edac/edac_core.h b/drivers/edac/edac_core.h index a9aa845dbe74..b27b13c5eb5a 100644 --- a/drivers/edac/edac_core.h +++ b/drivers/edac/edac_core.h | |||
@@ -97,7 +97,7 @@ extern int edac_debug_level; | |||
97 | #define PCI_VEND_DEV(vend, dev) PCI_VENDOR_ID_ ## vend, \ | 97 | #define PCI_VEND_DEV(vend, dev) PCI_VENDOR_ID_ ## vend, \ |
98 | PCI_DEVICE_ID_ ## vend ## _ ## dev | 98 | PCI_DEVICE_ID_ ## vend ## _ ## dev |
99 | 99 | ||
100 | #define dev_name(dev) (dev)->dev_name | 100 | #define edac_dev_name(dev) (dev)->dev_name |
101 | 101 | ||
102 | /* memory devices */ | 102 | /* memory devices */ |
103 | enum dev_type { | 103 | enum dev_type { |
diff --git a/drivers/edac/edac_device.c b/drivers/edac/edac_device.c index 63372fa7ecfe..5fcd3d89c75d 100644 --- a/drivers/edac/edac_device.c +++ b/drivers/edac/edac_device.c | |||
@@ -333,7 +333,7 @@ static int add_edac_dev_to_global_list(struct edac_device_ctl_info *edac_dev) | |||
333 | fail0: | 333 | fail0: |
334 | edac_printk(KERN_WARNING, EDAC_MC, | 334 | edac_printk(KERN_WARNING, EDAC_MC, |
335 | "%s (%s) %s %s already assigned %d\n", | 335 | "%s (%s) %s %s already assigned %d\n", |
336 | rover->dev->bus_id, dev_name(rover), | 336 | rover->dev->bus_id, edac_dev_name(rover), |
337 | rover->mod_name, rover->ctl_name, rover->dev_idx); | 337 | rover->mod_name, rover->ctl_name, rover->dev_idx); |
338 | return 1; | 338 | return 1; |
339 | 339 | ||
@@ -538,7 +538,7 @@ int edac_device_add_device(struct edac_device_ctl_info *edac_dev) | |||
538 | "'%s': DEV '%s' (%s)\n", | 538 | "'%s': DEV '%s' (%s)\n", |
539 | edac_dev->mod_name, | 539 | edac_dev->mod_name, |
540 | edac_dev->ctl_name, | 540 | edac_dev->ctl_name, |
541 | dev_name(edac_dev), | 541 | edac_dev_name(edac_dev), |
542 | edac_op_state_to_string(edac_dev->op_state)); | 542 | edac_op_state_to_string(edac_dev->op_state)); |
543 | 543 | ||
544 | mutex_unlock(&device_ctls_mutex); | 544 | mutex_unlock(&device_ctls_mutex); |
@@ -599,7 +599,7 @@ struct edac_device_ctl_info *edac_device_del_device(struct device *dev) | |||
599 | edac_printk(KERN_INFO, EDAC_MC, | 599 | edac_printk(KERN_INFO, EDAC_MC, |
600 | "Removed device %d for %s %s: DEV %s\n", | 600 | "Removed device %d for %s %s: DEV %s\n", |
601 | edac_dev->dev_idx, | 601 | edac_dev->dev_idx, |
602 | edac_dev->mod_name, edac_dev->ctl_name, dev_name(edac_dev)); | 602 | edac_dev->mod_name, edac_dev->ctl_name, edac_dev_name(edac_dev)); |
603 | 603 | ||
604 | return edac_dev; | 604 | return edac_dev; |
605 | } | 605 | } |
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index a4cf1645f588..d110392d48f4 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
@@ -402,7 +402,7 @@ static int add_mc_to_global_list(struct mem_ctl_info *mci) | |||
402 | fail0: | 402 | fail0: |
403 | edac_printk(KERN_WARNING, EDAC_MC, | 403 | edac_printk(KERN_WARNING, EDAC_MC, |
404 | "%s (%s) %s %s already assigned %d\n", p->dev->bus_id, | 404 | "%s (%s) %s %s already assigned %d\n", p->dev->bus_id, |
405 | dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx); | 405 | edac_dev_name(mci), p->mod_name, p->ctl_name, p->mc_idx); |
406 | return 1; | 406 | return 1; |
407 | 407 | ||
408 | fail1: | 408 | fail1: |
@@ -517,7 +517,7 @@ int edac_mc_add_mc(struct mem_ctl_info *mci) | |||
517 | 517 | ||
518 | /* Report action taken */ | 518 | /* Report action taken */ |
519 | edac_mc_printk(mci, KERN_INFO, "Giving out device to '%s' '%s':" | 519 | edac_mc_printk(mci, KERN_INFO, "Giving out device to '%s' '%s':" |
520 | " DEV %s\n", mci->mod_name, mci->ctl_name, dev_name(mci)); | 520 | " DEV %s\n", mci->mod_name, mci->ctl_name, edac_dev_name(mci)); |
521 | 521 | ||
522 | mutex_unlock(&mem_ctls_mutex); | 522 | mutex_unlock(&mem_ctls_mutex); |
523 | return 0; | 523 | return 0; |
@@ -565,7 +565,7 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev) | |||
565 | 565 | ||
566 | edac_printk(KERN_INFO, EDAC_MC, | 566 | edac_printk(KERN_INFO, EDAC_MC, |
567 | "Removed device %d for %s %s: DEV %s\n", mci->mc_idx, | 567 | "Removed device %d for %s %s: DEV %s\n", mci->mc_idx, |
568 | mci->mod_name, mci->ctl_name, dev_name(mci)); | 568 | mci->mod_name, mci->ctl_name, edac_dev_name(mci)); |
569 | 569 | ||
570 | return mci; | 570 | return mci; |
571 | } | 571 | } |
diff --git a/drivers/edac/edac_pci.c b/drivers/edac/edac_pci.c index 9b24340b52e1..22ec9d5d4312 100644 --- a/drivers/edac/edac_pci.c +++ b/drivers/edac/edac_pci.c | |||
@@ -150,7 +150,7 @@ static int add_edac_pci_to_global_list(struct edac_pci_ctl_info *pci) | |||
150 | fail0: | 150 | fail0: |
151 | edac_printk(KERN_WARNING, EDAC_PCI, | 151 | edac_printk(KERN_WARNING, EDAC_PCI, |
152 | "%s (%s) %s %s already assigned %d\n", | 152 | "%s (%s) %s %s already assigned %d\n", |
153 | rover->dev->bus_id, dev_name(rover), | 153 | rover->dev->bus_id, edac_dev_name(rover), |
154 | rover->mod_name, rover->ctl_name, rover->pci_idx); | 154 | rover->mod_name, rover->ctl_name, rover->pci_idx); |
155 | return 1; | 155 | return 1; |
156 | 156 | ||
@@ -360,7 +360,7 @@ int edac_pci_add_device(struct edac_pci_ctl_info *pci, int edac_idx) | |||
360 | " DEV '%s' (%s)\n", | 360 | " DEV '%s' (%s)\n", |
361 | pci->mod_name, | 361 | pci->mod_name, |
362 | pci->ctl_name, | 362 | pci->ctl_name, |
363 | dev_name(pci), edac_op_state_to_string(pci->op_state)); | 363 | edac_dev_name(pci), edac_op_state_to_string(pci->op_state)); |
364 | 364 | ||
365 | mutex_unlock(&edac_pci_ctls_mutex); | 365 | mutex_unlock(&edac_pci_ctls_mutex); |
366 | return 0; | 366 | return 0; |
@@ -415,7 +415,7 @@ struct edac_pci_ctl_info *edac_pci_del_device(struct device *dev) | |||
415 | 415 | ||
416 | edac_printk(KERN_INFO, EDAC_PCI, | 416 | edac_printk(KERN_INFO, EDAC_PCI, |
417 | "Removed device %d for %s %s: DEV %s\n", | 417 | "Removed device %d for %s %s: DEV %s\n", |
418 | pci->pci_idx, pci->mod_name, pci->ctl_name, dev_name(pci)); | 418 | pci->pci_idx, pci->mod_name, pci->ctl_name, edac_dev_name(pci)); |
419 | 419 | ||
420 | return pci; | 420 | return pci; |
421 | } | 421 | } |
diff --git a/drivers/i2c/busses/i2c-au1550.c b/drivers/i2c/busses/i2c-au1550.c index 491718fe46b7..cae9dc89d88c 100644 --- a/drivers/i2c/busses/i2c-au1550.c +++ b/drivers/i2c/busses/i2c-au1550.c | |||
@@ -335,7 +335,7 @@ i2c_au1550_probe(struct platform_device *pdev) | |||
335 | goto out_mem; | 335 | goto out_mem; |
336 | } | 336 | } |
337 | 337 | ||
338 | priv->psc_base = r->start; | 338 | priv->psc_base = CKSEG1ADDR(r->start); |
339 | priv->xfer_timeout = 200; | 339 | priv->xfer_timeout = 200; |
340 | priv->ack_timeout = 200; | 340 | priv->ack_timeout = 200; |
341 | 341 | ||
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 18beb0ad7bf3..a076129de7e8 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
@@ -99,7 +99,7 @@ static int i2c_wait(struct mpc_i2c *i2c, unsigned timeout, int writing) | |||
99 | u32 x; | 99 | u32 x; |
100 | int result = 0; | 100 | int result = 0; |
101 | 101 | ||
102 | if (i2c->irq == 0) | 102 | if (i2c->irq == NO_IRQ) |
103 | { | 103 | { |
104 | while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) { | 104 | while (!(readb(i2c->base + MPC_I2C_SR) & CSR_MIF)) { |
105 | schedule(); | 105 | schedule(); |
@@ -329,10 +329,9 @@ static int fsl_i2c_probe(struct platform_device *pdev) | |||
329 | return -ENOMEM; | 329 | return -ENOMEM; |
330 | 330 | ||
331 | i2c->irq = platform_get_irq(pdev, 0); | 331 | i2c->irq = platform_get_irq(pdev, 0); |
332 | if (i2c->irq < 0) { | 332 | if (i2c->irq < 0) |
333 | result = -ENXIO; | 333 | i2c->irq = NO_IRQ; /* Use polling */ |
334 | goto fail_get_irq; | 334 | |
335 | } | ||
336 | i2c->flags = pdata->device_flags; | 335 | i2c->flags = pdata->device_flags; |
337 | init_waitqueue_head(&i2c->queue); | 336 | init_waitqueue_head(&i2c->queue); |
338 | 337 | ||
@@ -344,7 +343,7 @@ static int fsl_i2c_probe(struct platform_device *pdev) | |||
344 | goto fail_map; | 343 | goto fail_map; |
345 | } | 344 | } |
346 | 345 | ||
347 | if (i2c->irq != 0) | 346 | if (i2c->irq != NO_IRQ) |
348 | if ((result = request_irq(i2c->irq, mpc_i2c_isr, | 347 | if ((result = request_irq(i2c->irq, mpc_i2c_isr, |
349 | IRQF_SHARED, "i2c-mpc", i2c)) < 0) { | 348 | IRQF_SHARED, "i2c-mpc", i2c)) < 0) { |
350 | printk(KERN_ERR | 349 | printk(KERN_ERR |
@@ -367,12 +366,11 @@ static int fsl_i2c_probe(struct platform_device *pdev) | |||
367 | return result; | 366 | return result; |
368 | 367 | ||
369 | fail_add: | 368 | fail_add: |
370 | if (i2c->irq != 0) | 369 | if (i2c->irq != NO_IRQ) |
371 | free_irq(i2c->irq, i2c); | 370 | free_irq(i2c->irq, i2c); |
372 | fail_irq: | 371 | fail_irq: |
373 | iounmap(i2c->base); | 372 | iounmap(i2c->base); |
374 | fail_map: | 373 | fail_map: |
375 | fail_get_irq: | ||
376 | kfree(i2c); | 374 | kfree(i2c); |
377 | return result; | 375 | return result; |
378 | }; | 376 | }; |
@@ -384,7 +382,7 @@ static int fsl_i2c_remove(struct platform_device *pdev) | |||
384 | i2c_del_adapter(&i2c->adap); | 382 | i2c_del_adapter(&i2c->adap); |
385 | platform_set_drvdata(pdev, NULL); | 383 | platform_set_drvdata(pdev, NULL); |
386 | 384 | ||
387 | if (i2c->irq != 0) | 385 | if (i2c->irq != NO_IRQ) |
388 | free_irq(i2c->irq, i2c); | 386 | free_irq(i2c->irq, i2c); |
389 | 387 | ||
390 | iounmap(i2c->base); | 388 | iounmap(i2c->base); |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index fdc9ad805e35..ac9165968587 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
@@ -104,10 +104,31 @@ MODULE_PARM_DESC(force_addr, | |||
104 | static int piix4_transaction(void); | 104 | static int piix4_transaction(void); |
105 | 105 | ||
106 | static unsigned short piix4_smba; | 106 | static unsigned short piix4_smba; |
107 | static int srvrworks_csb5_delay; | ||
107 | static struct pci_driver piix4_driver; | 108 | static struct pci_driver piix4_driver; |
108 | static struct i2c_adapter piix4_adapter; | 109 | static struct i2c_adapter piix4_adapter; |
109 | 110 | ||
110 | static struct dmi_system_id __devinitdata piix4_dmi_table[] = { | 111 | static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = { |
112 | { | ||
113 | .ident = "Sapphire AM2RD790", | ||
114 | .matches = { | ||
115 | DMI_MATCH(DMI_BOARD_VENDOR, "SAPPHIRE Inc."), | ||
116 | DMI_MATCH(DMI_BOARD_NAME, "PC-AM2RD790"), | ||
117 | }, | ||
118 | }, | ||
119 | { | ||
120 | .ident = "DFI Lanparty UT 790FX", | ||
121 | .matches = { | ||
122 | DMI_MATCH(DMI_BOARD_VENDOR, "DFI Inc."), | ||
123 | DMI_MATCH(DMI_BOARD_NAME, "LP UT 790FX"), | ||
124 | }, | ||
125 | }, | ||
126 | { } | ||
127 | }; | ||
128 | |||
129 | /* The IBM entry is in a separate table because we only check it | ||
130 | on Intel-based systems */ | ||
131 | static struct dmi_system_id __devinitdata piix4_dmi_ibm[] = { | ||
111 | { | 132 | { |
112 | .ident = "IBM", | 133 | .ident = "IBM", |
113 | .matches = { DMI_MATCH(DMI_SYS_VENDOR, "IBM"), }, | 134 | .matches = { DMI_MATCH(DMI_SYS_VENDOR, "IBM"), }, |
@@ -122,8 +143,20 @@ static int __devinit piix4_setup(struct pci_dev *PIIX4_dev, | |||
122 | 143 | ||
123 | dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev)); | 144 | dev_info(&PIIX4_dev->dev, "Found %s device\n", pci_name(PIIX4_dev)); |
124 | 145 | ||
146 | if ((PIIX4_dev->vendor == PCI_VENDOR_ID_SERVERWORKS) && | ||
147 | (PIIX4_dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB5)) | ||
148 | srvrworks_csb5_delay = 1; | ||
149 | |||
150 | /* On some motherboards, it was reported that accessing the SMBus | ||
151 | caused severe hardware problems */ | ||
152 | if (dmi_check_system(piix4_dmi_blacklist)) { | ||
153 | dev_err(&PIIX4_dev->dev, | ||
154 | "Accessing the SMBus on this system is unsafe!\n"); | ||
155 | return -EPERM; | ||
156 | } | ||
157 | |||
125 | /* Don't access SMBus on IBM systems which get corrupted eeproms */ | 158 | /* Don't access SMBus on IBM systems which get corrupted eeproms */ |
126 | if (dmi_check_system(piix4_dmi_table) && | 159 | if (dmi_check_system(piix4_dmi_ibm) && |
127 | PIIX4_dev->vendor == PCI_VENDOR_ID_INTEL) { | 160 | PIIX4_dev->vendor == PCI_VENDOR_ID_INTEL) { |
128 | dev_err(&PIIX4_dev->dev, "IBM system detected; this module " | 161 | dev_err(&PIIX4_dev->dev, "IBM system detected; this module " |
129 | "may corrupt your serial eeprom! Refusing to load " | 162 | "may corrupt your serial eeprom! Refusing to load " |
@@ -230,10 +263,14 @@ static int piix4_transaction(void) | |||
230 | outb_p(inb(SMBHSTCNT) | 0x040, SMBHSTCNT); | 263 | outb_p(inb(SMBHSTCNT) | 0x040, SMBHSTCNT); |
231 | 264 | ||
232 | /* We will always wait for a fraction of a second! (See PIIX4 docs errata) */ | 265 | /* We will always wait for a fraction of a second! (See PIIX4 docs errata) */ |
233 | do { | 266 | if (srvrworks_csb5_delay) /* Extra delay for SERVERWORKS_CSB5 */ |
267 | msleep(2); | ||
268 | else | ||
269 | msleep(1); | ||
270 | |||
271 | while ((timeout++ < MAX_TIMEOUT) && | ||
272 | ((temp = inb_p(SMBHSTSTS)) & 0x01)) | ||
234 | msleep(1); | 273 | msleep(1); |
235 | temp = inb_p(SMBHSTSTS); | ||
236 | } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT)); | ||
237 | 274 | ||
238 | /* If the SMBus is still busy, we give up */ | 275 | /* If the SMBus is still busy, we give up */ |
239 | if (timeout >= MAX_TIMEOUT) { | 276 | if (timeout >= MAX_TIMEOUT) { |
diff --git a/drivers/i2c/busses/i2c-sibyte.c b/drivers/i2c/busses/i2c-sibyte.c index 8fbbdb4c2f35..114634da6c6e 100644 --- a/drivers/i2c/busses/i2c-sibyte.c +++ b/drivers/i2c/busses/i2c-sibyte.c | |||
@@ -132,14 +132,14 @@ static const struct i2c_algorithm i2c_sibyte_algo = { | |||
132 | /* | 132 | /* |
133 | * registering functions to load algorithms at runtime | 133 | * registering functions to load algorithms at runtime |
134 | */ | 134 | */ |
135 | int __init i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) | 135 | static int __init i2c_sibyte_add_bus(struct i2c_adapter *i2c_adap, int speed) |
136 | { | 136 | { |
137 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; | 137 | struct i2c_algo_sibyte_data *adap = i2c_adap->algo_data; |
138 | 138 | ||
139 | /* register new adapter to i2c module... */ | 139 | /* Register new adapter to i2c module... */ |
140 | i2c_adap->algo = &i2c_sibyte_algo; | 140 | i2c_adap->algo = &i2c_sibyte_algo; |
141 | 141 | ||
142 | /* Set the frequency to 100 kHz */ | 142 | /* Set the requested frequency. */ |
143 | csr_out32(speed, SMB_CSR(adap,R_SMB_FREQ)); | 143 | csr_out32(speed, SMB_CSR(adap,R_SMB_FREQ)); |
144 | csr_out32(0, SMB_CSR(adap,R_SMB_CONTROL)); | 144 | csr_out32(0, SMB_CSR(adap,R_SMB_CONTROL)); |
145 | 145 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 26384daccb96..c99ebeadb558 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -327,6 +327,11 @@ void i2c_unregister_device(struct i2c_client *client) | |||
327 | EXPORT_SYMBOL_GPL(i2c_unregister_device); | 327 | EXPORT_SYMBOL_GPL(i2c_unregister_device); |
328 | 328 | ||
329 | 329 | ||
330 | static const struct i2c_device_id dummy_id[] = { | ||
331 | { "dummy", 0 }, | ||
332 | { }, | ||
333 | }; | ||
334 | |||
330 | static int dummy_probe(struct i2c_client *client, | 335 | static int dummy_probe(struct i2c_client *client, |
331 | const struct i2c_device_id *id) | 336 | const struct i2c_device_id *id) |
332 | { | 337 | { |
@@ -342,13 +347,13 @@ static struct i2c_driver dummy_driver = { | |||
342 | .driver.name = "dummy", | 347 | .driver.name = "dummy", |
343 | .probe = dummy_probe, | 348 | .probe = dummy_probe, |
344 | .remove = dummy_remove, | 349 | .remove = dummy_remove, |
350 | .id_table = dummy_id, | ||
345 | }; | 351 | }; |
346 | 352 | ||
347 | /** | 353 | /** |
348 | * i2c_new_dummy - return a new i2c device bound to a dummy driver | 354 | * i2c_new_dummy - return a new i2c device bound to a dummy driver |
349 | * @adapter: the adapter managing the device | 355 | * @adapter: the adapter managing the device |
350 | * @address: seven bit address to be used | 356 | * @address: seven bit address to be used |
351 | * @type: optional label used for i2c_client.name | ||
352 | * Context: can sleep | 357 | * Context: can sleep |
353 | * | 358 | * |
354 | * This returns an I2C client bound to the "dummy" driver, intended for use | 359 | * This returns an I2C client bound to the "dummy" driver, intended for use |
@@ -364,15 +369,12 @@ static struct i2c_driver dummy_driver = { | |||
364 | * i2c_unregister_device(); or NULL to indicate an error. | 369 | * i2c_unregister_device(); or NULL to indicate an error. |
365 | */ | 370 | */ |
366 | struct i2c_client * | 371 | struct i2c_client * |
367 | i2c_new_dummy(struct i2c_adapter *adapter, u16 address, const char *type) | 372 | i2c_new_dummy(struct i2c_adapter *adapter, u16 address) |
368 | { | 373 | { |
369 | struct i2c_board_info info = { | 374 | struct i2c_board_info info = { |
370 | .driver_name = "dummy", | 375 | I2C_BOARD_INFO("dummy", address), |
371 | .addr = address, | ||
372 | }; | 376 | }; |
373 | 377 | ||
374 | if (type) | ||
375 | strlcpy(info.type, type, sizeof info.type); | ||
376 | return i2c_new_device(adapter, &info); | 378 | return i2c_new_device(adapter, &info); |
377 | } | 379 | } |
378 | EXPORT_SYMBOL_GPL(i2c_new_dummy); | 380 | EXPORT_SYMBOL_GPL(i2c_new_dummy); |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index f702f9152ce6..b4f3aefa12b6 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -1,8 +1,6 @@ | |||
1 | # | 1 | # |
2 | # IDE ATA ATAPI Block device driver configuration | 2 | # IDE ATA ATAPI Block device driver configuration |
3 | # | 3 | # |
4 | # Andre Hedrick <andre@linux-ide.org> | ||
5 | # | ||
6 | 4 | ||
7 | # Select HAVE_IDE if IDE is supported | 5 | # Select HAVE_IDE if IDE is supported |
8 | config HAVE_IDE | 6 | config HAVE_IDE |
@@ -335,7 +333,7 @@ config BLK_DEV_CMD640 | |||
335 | This driver will work automatically in PCI based systems (most new | 333 | This driver will work automatically in PCI based systems (most new |
336 | systems have PCI slots). But if your system uses VESA local bus | 334 | systems have PCI slots). But if your system uses VESA local bus |
337 | (VLB) instead of PCI, you must also supply a kernel boot parameter | 335 | (VLB) instead of PCI, you must also supply a kernel boot parameter |
338 | to enable the CMD640 bugfix/support: "ide0=cmd640_vlb". (Try "man | 336 | to enable the CMD640 bugfix/support: "cmd640.probe_vlb". (Try "man |
339 | bootparam" or see the documentation of your boot loader about how to | 337 | bootparam" or see the documentation of your boot loader about how to |
340 | pass options to the kernel.) | 338 | pass options to the kernel.) |
341 | 339 | ||
@@ -457,27 +455,11 @@ config BLK_DEV_ALI15X3 | |||
457 | onboard chipsets. It also tests for Simplex mode and enables | 455 | onboard chipsets. It also tests for Simplex mode and enables |
458 | normal dual channel support. | 456 | normal dual channel support. |
459 | 457 | ||
460 | If you say Y here, you also need to say Y to "Use DMA by default | 458 | Please read the comments at the top of |
461 | when available", above. Please read the comments at the top of | ||
462 | <file:drivers/ide/pci/alim15x3.c>. | 459 | <file:drivers/ide/pci/alim15x3.c>. |
463 | 460 | ||
464 | If unsure, say N. | 461 | If unsure, say N. |
465 | 462 | ||
466 | config WDC_ALI15X3 | ||
467 | bool "ALI M15x3 WDC support (DANGEROUS)" | ||
468 | depends on BLK_DEV_ALI15X3 | ||
469 | ---help--- | ||
470 | This allows for UltraDMA support for WDC drives that ignore CRC | ||
471 | checking. You are a fool for enabling this option, but there have | ||
472 | been requests. DO NOT COMPLAIN IF YOUR DRIVE HAS FS CORRUPTION, IF | ||
473 | YOU ENABLE THIS! No one will listen, just laugh for ignoring this | ||
474 | SERIOUS WARNING. | ||
475 | |||
476 | Using this option can allow WDC drives to run at ATA-4/5 transfer | ||
477 | rates with only an ATA-2 support structure. | ||
478 | |||
479 | SAY N! | ||
480 | |||
481 | config BLK_DEV_AMD74XX | 463 | config BLK_DEV_AMD74XX |
482 | tristate "AMD and nVidia IDE support" | 464 | tristate "AMD and nVidia IDE support" |
483 | depends on !ARM | 465 | depends on !ARM |
@@ -520,9 +502,6 @@ config BLK_DEV_CY82C693 | |||
520 | This driver adds detection and support for the CY82C693 chipset | 502 | This driver adds detection and support for the CY82C693 chipset |
521 | used on Digital's PC-Alpha 164SX boards. | 503 | used on Digital's PC-Alpha 164SX boards. |
522 | 504 | ||
523 | If you say Y here, you need to say Y to "Use DMA by default | ||
524 | when available" as well. | ||
525 | |||
526 | config BLK_DEV_CS5520 | 505 | config BLK_DEV_CS5520 |
527 | tristate "Cyrix CS5510/20 MediaGX chipset support (VERY EXPERIMENTAL)" | 506 | tristate "Cyrix CS5510/20 MediaGX chipset support (VERY EXPERIMENTAL)" |
528 | depends on EXPERIMENTAL | 507 | depends on EXPERIMENTAL |
@@ -613,13 +592,12 @@ config BLK_DEV_SC1200 | |||
613 | National SCx200 series of embedded x86 "Geode" systems. | 592 | National SCx200 series of embedded x86 "Geode" systems. |
614 | 593 | ||
615 | config BLK_DEV_PIIX | 594 | config BLK_DEV_PIIX |
616 | tristate "Intel PIIXn chipsets support" | 595 | tristate "Intel PIIX/ICH chipsets support" |
617 | select BLK_DEV_IDEDMA_PCI | 596 | select BLK_DEV_IDEDMA_PCI |
618 | help | 597 | help |
619 | This driver adds explicit support for Intel PIIX and ICH chips | 598 | This driver adds explicit support for Intel PIIX and ICH chips. |
620 | and also for the Efar Victory66 (slc90e66) chip. This allows | 599 | This allows the kernel to change PIO, DMA and UDMA speeds and to |
621 | the kernel to change PIO, DMA and UDMA speeds and to configure | 600 | configure the chip to optimum performance. |
622 | the chip to optimum performance. | ||
623 | 601 | ||
624 | config BLK_DEV_IT8213 | 602 | config BLK_DEV_IT8213 |
625 | tristate "IT8213 IDE support" | 603 | tristate "IT8213 IDE support" |
@@ -657,11 +635,7 @@ config BLK_DEV_PDC202XX_OLD | |||
657 | happen if the BIOS revisions of all installed cards (three-max) do | 635 | happen if the BIOS revisions of all installed cards (three-max) do |
658 | not match, the driver attempts to do dynamic tuning of the chipset | 636 | not match, the driver attempts to do dynamic tuning of the chipset |
659 | at boot-time for max-speed. Ultra33 BIOS 1.25 or newer is required | 637 | at boot-time for max-speed. Ultra33 BIOS 1.25 or newer is required |
660 | for more than one card. This card may require that you say Y to | 638 | for more than one card. |
661 | "Special UDMA Feature". | ||
662 | |||
663 | If you say Y here, you need to say Y to "Use DMA by default when | ||
664 | available" as well. | ||
665 | 639 | ||
666 | Please read the comments at the top of | 640 | Please read the comments at the top of |
667 | <file:drivers/ide/pci/pdc202xx_old.c>. | 641 | <file:drivers/ide/pci/pdc202xx_old.c>. |
@@ -710,9 +684,6 @@ config BLK_DEV_SIS5513 | |||
710 | ATA100: SiS635, SiS645, SiS650, SiS730, SiS735, SiS740, | 684 | ATA100: SiS635, SiS645, SiS650, SiS730, SiS735, SiS740, |
711 | SiS745, SiS750 | 685 | SiS745, SiS750 |
712 | 686 | ||
713 | If you say Y here, you need to say Y to "Use DMA by default when | ||
714 | available" as well. | ||
715 | |||
716 | Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>. | 687 | Please read the comments at the top of <file:drivers/ide/pci/sis5513.c>. |
717 | 688 | ||
718 | config BLK_DEV_SL82C105 | 689 | config BLK_DEV_SL82C105 |
@@ -734,9 +705,6 @@ config BLK_DEV_SLC90E66 | |||
734 | and it will handle timing cycles. Since this is an improved | 705 | and it will handle timing cycles. Since this is an improved |
735 | look-a-like to the PIIX4 it should be a nice addition. | 706 | look-a-like to the PIIX4 it should be a nice addition. |
736 | 707 | ||
737 | If you say Y here, you need to say Y to "Use DMA by default when | ||
738 | available" as well. | ||
739 | |||
740 | Please read the comments at the top of | 708 | Please read the comments at the top of |
741 | <file:drivers/ide/pci/slc90e66.c>. | 709 | <file:drivers/ide/pci/slc90e66.c>. |
742 | 710 | ||
@@ -888,17 +856,17 @@ config BLK_DEV_IDEDOUBLER | |||
888 | bool "Amiga IDE Doubler support (EXPERIMENTAL)" | 856 | bool "Amiga IDE Doubler support (EXPERIMENTAL)" |
889 | depends on BLK_DEV_GAYLE && EXPERIMENTAL | 857 | depends on BLK_DEV_GAYLE && EXPERIMENTAL |
890 | ---help--- | 858 | ---help--- |
891 | This driver provides support for the so-called `IDE doublers' (made | 859 | This feature provides support for the so-called `IDE doublers' (made |
892 | by various manufacturers, e.g. Eyetech) that can be connected to | 860 | by various manufacturers, e.g. Eyetech) that can be connected to |
893 | the on-board IDE interface of some Amiga models. Using such an IDE | 861 | the on-board IDE interface of some Amiga models. Using such an IDE |
894 | doubler, you can connect up to four instead of two IDE devices to | 862 | doubler, you can connect up to four instead of two IDE devices to |
895 | the Amiga's on-board IDE interface. | 863 | the Amiga's on-board IDE interface. |
896 | 864 | ||
897 | Note that the normal Amiga Gayle IDE driver may not work correctly | 865 | Note that the normal Amiga Gayle IDE driver may not work correctly |
898 | if you have an IDE doubler and don't enable this driver! | 866 | if you have an IDE doubler and don't enable this feature! |
899 | 867 | ||
900 | Say Y if you have an IDE doubler. The driver is enabled at kernel | 868 | Say Y if you have an IDE doubler. The feature is enabled at kernel |
901 | runtime using the "ide=doubler" kernel boot parameter. | 869 | runtime using the "gayle.doubler" kernel boot parameter. |
902 | 870 | ||
903 | config BLK_DEV_BUDDHA | 871 | config BLK_DEV_BUDDHA |
904 | tristate "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)" | 872 | tristate "Buddha/Catweasel/X-Surf IDE interface support (EXPERIMENTAL)" |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 57d9a9a79a6f..0daf923541ff 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -95,7 +95,7 @@ void SELECT_DRIVE (ide_drive_t *drive) | |||
95 | hwif->OUTB(drive->select.all, hwif->io_ports.device_addr); | 95 | hwif->OUTB(drive->select.all, hwif->io_ports.device_addr); |
96 | } | 96 | } |
97 | 97 | ||
98 | void SELECT_MASK (ide_drive_t *drive, int mask) | 98 | static void SELECT_MASK(ide_drive_t *drive, int mask) |
99 | { | 99 | { |
100 | const struct ide_port_ops *port_ops = drive->hwif->port_ops; | 100 | const struct ide_port_ops *port_ops = drive->hwif->port_ops; |
101 | 101 | ||
diff --git a/drivers/ide/legacy/falconide.c b/drivers/ide/legacy/falconide.c index 83555ca513b5..9e449a0c623f 100644 --- a/drivers/ide/legacy/falconide.c +++ b/drivers/ide/legacy/falconide.c | |||
@@ -61,7 +61,7 @@ static void falconide_output_data(ide_drive_t *drive, struct request *rq, | |||
61 | unsigned long data_addr = drive->hwif->io_ports.data_addr; | 61 | unsigned long data_addr = drive->hwif->io_ports.data_addr; |
62 | 62 | ||
63 | if (drive->media == ide_disk && rq && rq->cmd_type == REQ_TYPE_FS) | 63 | if (drive->media == ide_disk && rq && rq->cmd_type == REQ_TYPE_FS) |
64 | return outsw(data_adr, buf, (len + 1) / 2); | 64 | return outsw(data_addr, buf, (len + 1) / 2); |
65 | 65 | ||
66 | outsw_swapw(data_addr, buf, (len + 1) / 2); | 66 | outsw_swapw(data_addr, buf, (len + 1) / 2); |
67 | } | 67 | } |
diff --git a/drivers/ide/mips/swarm.c b/drivers/ide/mips/swarm.c index 712d17bdd470..52fee3d2771a 100644 --- a/drivers/ide/mips/swarm.c +++ b/drivers/ide/mips/swarm.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Author: Manish Lachwani, mlachwani@mvista.com | 4 | * Author: Manish Lachwani, mlachwani@mvista.com |
5 | * Copyright (C) 2004 MIPS Technologies, Inc. All rights reserved. | 5 | * Copyright (C) 2004 MIPS Technologies, Inc. All rights reserved. |
6 | * Author: Maciej W. Rozycki <macro@mips.com> | 6 | * Author: Maciej W. Rozycki <macro@mips.com> |
7 | * Copyright (c) 2006 Maciej W. Rozycki | 7 | * Copyright (c) 2006, 2008 Maciej W. Rozycki |
8 | * | 8 | * |
9 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
10 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
@@ -70,8 +70,9 @@ static int __devinit swarm_ide_probe(struct device *dev) | |||
70 | ide_hwif_t *hwif; | 70 | ide_hwif_t *hwif; |
71 | u8 __iomem *base; | 71 | u8 __iomem *base; |
72 | phys_t offset, size; | 72 | phys_t offset, size; |
73 | hw_regs_t hw; | ||
73 | int i; | 74 | int i; |
74 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 75 | u8 idx[] = { 0xff, 0xff, 0xff, 0xff }; |
75 | 76 | ||
76 | if (!SIBYTE_HAVE_IDE) | 77 | if (!SIBYTE_HAVE_IDE) |
77 | return -ENODEV; | 78 | return -ENODEV; |
@@ -112,14 +113,15 @@ static int __devinit swarm_ide_probe(struct device *dev) | |||
112 | hwif->host_flags = IDE_HFLAG_MMIO; | 113 | hwif->host_flags = IDE_HFLAG_MMIO; |
113 | default_hwif_mmiops(hwif); | 114 | default_hwif_mmiops(hwif); |
114 | 115 | ||
115 | hwif->chipset = ide_generic; | ||
116 | |||
117 | for (i = 0; i <= 7; i++) | 116 | for (i = 0; i <= 7; i++) |
118 | hwif->io_ports_array[i] = | 117 | hw.io_ports_array[i] = |
119 | (unsigned long)(base + ((0x1f0 + i) << 5)); | 118 | (unsigned long)(base + ((0x1f0 + i) << 5)); |
120 | hwif->io_ports.ctl_addr = | 119 | hw.io_ports.ctl_addr = |
121 | (unsigned long)(base + (0x3f6 << 5)); | 120 | (unsigned long)(base + (0x3f6 << 5)); |
122 | hwif->irq = K_INT_GB_IDE; | 121 | hw.irq = K_INT_GB_IDE; |
122 | hw.chipset = ide_generic; | ||
123 | |||
124 | ide_init_port_hw(hwif, &hw); | ||
123 | 125 | ||
124 | idx[0] = hwif->index; | 126 | idx[0] = hwif->index; |
125 | 127 | ||
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index c1922f9cfe80..f2129d5e07f2 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -39,6 +39,16 @@ | |||
39 | #include <asm/io.h> | 39 | #include <asm/io.h> |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * Allow UDMA on M1543C-E chipset for WDC disks that ignore CRC checking | ||
43 | * (this is DANGEROUS and could result in data corruption). | ||
44 | */ | ||
45 | static int wdc_udma; | ||
46 | |||
47 | module_param(wdc_udma, bool, 0); | ||
48 | MODULE_PARM_DESC(wdc_udma, | ||
49 | "allow UDMA on M1543C-E chipset for WDC disks (DANGEROUS)"); | ||
50 | |||
51 | /* | ||
42 | * ALi devices are not plug in. Otherwise these static values would | 52 | * ALi devices are not plug in. Otherwise these static values would |
43 | * need to go. They ought to go away anyway | 53 | * need to go. They ought to go away anyway |
44 | */ | 54 | */ |
@@ -76,11 +86,6 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
76 | a_clc = 0; | 86 | a_clc = 0; |
77 | c_time = ide_pio_timings[pio].cycle_time; | 87 | c_time = ide_pio_timings[pio].cycle_time; |
78 | 88 | ||
79 | #if 0 | ||
80 | if ((r_clc = ((c_time - s_time - a_time) * bus_speed + 999) / 1000) >= 16) | ||
81 | r_clc = 0; | ||
82 | #endif | ||
83 | |||
84 | if (!(r_clc = (c_time * bus_speed + 999) / 1000 - a_clc - s_clc)) { | 89 | if (!(r_clc = (c_time * bus_speed + 999) / 1000 - a_clc - s_clc)) { |
85 | r_clc = 1; | 90 | r_clc = 1; |
86 | } else { | 91 | } else { |
@@ -110,16 +115,6 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
110 | pci_write_config_byte(dev, port, s_clc); | 115 | pci_write_config_byte(dev, port, s_clc); |
111 | pci_write_config_byte(dev, port+drive->select.b.unit+2, (a_clc << 4) | r_clc); | 116 | pci_write_config_byte(dev, port+drive->select.b.unit+2, (a_clc << 4) | r_clc); |
112 | local_irq_restore(flags); | 117 | local_irq_restore(flags); |
113 | |||
114 | /* | ||
115 | * setup active rec | ||
116 | * { 70, 165, 365 }, PIO Mode 0 | ||
117 | * { 50, 125, 208 }, PIO Mode 1 | ||
118 | * { 30, 100, 110 }, PIO Mode 2 | ||
119 | * { 30, 80, 70 }, PIO Mode 3 with IORDY | ||
120 | * { 25, 70, 25 }, PIO Mode 4 with IORDY ns | ||
121 | * { 20, 50, 30 } PIO Mode 5 with IORDY (nonstandard) | ||
122 | */ | ||
123 | } | 118 | } |
124 | 119 | ||
125 | /** | 120 | /** |
@@ -131,9 +126,7 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
131 | * The actual rules for the ALi are: | 126 | * The actual rules for the ALi are: |
132 | * No UDMA on revisions <= 0x20 | 127 | * No UDMA on revisions <= 0x20 |
133 | * Disk only for revisions < 0xC2 | 128 | * Disk only for revisions < 0xC2 |
134 | * Not WDC drives for revisions < 0xC2 | 129 | * Not WDC drives on M1543C-E (?) |
135 | * | ||
136 | * FIXME: WDC ifdef needs to die | ||
137 | */ | 130 | */ |
138 | 131 | ||
139 | static u8 ali_udma_filter(ide_drive_t *drive) | 132 | static u8 ali_udma_filter(ide_drive_t *drive) |
@@ -141,10 +134,9 @@ static u8 ali_udma_filter(ide_drive_t *drive) | |||
141 | if (m5229_revision > 0x20 && m5229_revision < 0xC2) { | 134 | if (m5229_revision > 0x20 && m5229_revision < 0xC2) { |
142 | if (drive->media != ide_disk) | 135 | if (drive->media != ide_disk) |
143 | return 0; | 136 | return 0; |
144 | #ifndef CONFIG_WDC_ALI15X3 | 137 | if (chip_is_1543c_e && strstr(drive->id->model, "WDC ") && |
145 | if (chip_is_1543c_e && strstr(drive->id->model, "WDC ")) | 138 | wdc_udma == 0) |
146 | return 0; | 139 | return 0; |
147 | #endif | ||
148 | } | 140 | } |
149 | 141 | ||
150 | return drive->hwif->ultra_mask; | 142 | return drive->hwif->ultra_mask; |
@@ -537,17 +529,9 @@ static const struct ide_port_info ali15x3_chipset __devinitdata = { | |||
537 | 529 | ||
538 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 530 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
539 | { | 531 | { |
540 | static struct pci_device_id ati_rs100[] = { | ||
541 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100) }, | ||
542 | { }, | ||
543 | }; | ||
544 | |||
545 | struct ide_port_info d = ali15x3_chipset; | 532 | struct ide_port_info d = ali15x3_chipset; |
546 | u8 rev = dev->revision, idx = id->driver_data; | 533 | u8 rev = dev->revision, idx = id->driver_data; |
547 | 534 | ||
548 | if (pci_dev_present(ati_rs100)) | ||
549 | printk(KERN_WARNING "alim15x3: ATI Radeon IGP Northbridge is not yet fully tested.\n"); | ||
550 | |||
551 | /* don't use LBA48 DMA on ALi devices before rev 0xC5 */ | 535 | /* don't use LBA48 DMA on ALi devices before rev 0xC5 */ |
552 | if (rev <= 0xC4) | 536 | if (rev <= 0xC4) |
553 | d.host_flags |= IDE_HFLAG_NO_LBA48_DMA; | 537 | d.host_flags |= IDE_HFLAG_NO_LBA48_DMA; |
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index 17669a434438..992b1cf8db69 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -119,6 +119,7 @@ static const struct ide_dma_ops cs5520_dma_ops = { | |||
119 | .dma_timeout = ide_dma_timeout, | 119 | .dma_timeout = ide_dma_timeout, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | /* FIXME: VDMA is disabled because it caused system hangs */ | ||
122 | #define DECLARE_CS_DEV(name_str) \ | 123 | #define DECLARE_CS_DEV(name_str) \ |
123 | { \ | 124 | { \ |
124 | .name = name_str, \ | 125 | .name = name_str, \ |
@@ -126,7 +127,6 @@ static const struct ide_dma_ops cs5520_dma_ops = { | |||
126 | .dma_ops = &cs5520_dma_ops, \ | 127 | .dma_ops = &cs5520_dma_ops, \ |
127 | .host_flags = IDE_HFLAG_ISA_PORTS | \ | 128 | .host_flags = IDE_HFLAG_ISA_PORTS | \ |
128 | IDE_HFLAG_CS5520 | \ | 129 | IDE_HFLAG_CS5520 | \ |
129 | IDE_HFLAG_VDMA | \ | ||
130 | IDE_HFLAG_NO_ATAPI_DMA | \ | 130 | IDE_HFLAG_NO_ATAPI_DMA | \ |
131 | IDE_HFLAG_ABUSE_SET_DMA_MODE, \ | 131 | IDE_HFLAG_ABUSE_SET_DMA_MODE, \ |
132 | .pio_mask = ATA_PIO4, \ | 132 | .pio_mask = ATA_PIO4, \ |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index ed2ee4ba4b7c..3f441fc57c17 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c | |||
@@ -359,9 +359,10 @@ static void insert_recv_cqe(struct t3_wq *wq, struct t3_cq *cq) | |||
359 | cq->sw_wptr++; | 359 | cq->sw_wptr++; |
360 | } | 360 | } |
361 | 361 | ||
362 | void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count) | 362 | int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count) |
363 | { | 363 | { |
364 | u32 ptr; | 364 | u32 ptr; |
365 | int flushed = 0; | ||
365 | 366 | ||
366 | PDBG("%s wq %p cq %p\n", __func__, wq, cq); | 367 | PDBG("%s wq %p cq %p\n", __func__, wq, cq); |
367 | 368 | ||
@@ -369,8 +370,11 @@ void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count) | |||
369 | PDBG("%s rq_rptr %u rq_wptr %u skip count %u\n", __func__, | 370 | PDBG("%s rq_rptr %u rq_wptr %u skip count %u\n", __func__, |
370 | wq->rq_rptr, wq->rq_wptr, count); | 371 | wq->rq_rptr, wq->rq_wptr, count); |
371 | ptr = wq->rq_rptr + count; | 372 | ptr = wq->rq_rptr + count; |
372 | while (ptr++ != wq->rq_wptr) | 373 | while (ptr++ != wq->rq_wptr) { |
373 | insert_recv_cqe(wq, cq); | 374 | insert_recv_cqe(wq, cq); |
375 | flushed++; | ||
376 | } | ||
377 | return flushed; | ||
374 | } | 378 | } |
375 | 379 | ||
376 | static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq, | 380 | static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq, |
@@ -394,18 +398,21 @@ static void insert_sq_cqe(struct t3_wq *wq, struct t3_cq *cq, | |||
394 | cq->sw_wptr++; | 398 | cq->sw_wptr++; |
395 | } | 399 | } |
396 | 400 | ||
397 | void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count) | 401 | int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count) |
398 | { | 402 | { |
399 | __u32 ptr; | 403 | __u32 ptr; |
404 | int flushed = 0; | ||
400 | struct t3_swsq *sqp = wq->sq + Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2); | 405 | struct t3_swsq *sqp = wq->sq + Q_PTR2IDX(wq->sq_rptr, wq->sq_size_log2); |
401 | 406 | ||
402 | ptr = wq->sq_rptr + count; | 407 | ptr = wq->sq_rptr + count; |
403 | sqp += count; | 408 | sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2); |
404 | while (ptr != wq->sq_wptr) { | 409 | while (ptr != wq->sq_wptr) { |
405 | insert_sq_cqe(wq, cq, sqp); | 410 | insert_sq_cqe(wq, cq, sqp); |
406 | sqp++; | ||
407 | ptr++; | 411 | ptr++; |
412 | sqp = wq->sq + Q_PTR2IDX(ptr, wq->sq_size_log2); | ||
413 | flushed++; | ||
408 | } | 414 | } |
415 | return flushed; | ||
409 | } | 416 | } |
410 | 417 | ||
411 | /* | 418 | /* |
@@ -581,7 +588,7 @@ static int cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p) | |||
581 | * caller aquires the ctrl_qp lock before the call | 588 | * caller aquires the ctrl_qp lock before the call |
582 | */ | 589 | */ |
583 | static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, | 590 | static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, |
584 | u32 len, void *data, int completion) | 591 | u32 len, void *data) |
585 | { | 592 | { |
586 | u32 i, nr_wqe, copy_len; | 593 | u32 i, nr_wqe, copy_len; |
587 | u8 *copy_data; | 594 | u8 *copy_data; |
@@ -617,7 +624,7 @@ static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, | |||
617 | flag = 0; | 624 | flag = 0; |
618 | if (i == (nr_wqe - 1)) { | 625 | if (i == (nr_wqe - 1)) { |
619 | /* last WQE */ | 626 | /* last WQE */ |
620 | flag = completion ? T3_COMPLETION_FLAG : 0; | 627 | flag = T3_COMPLETION_FLAG; |
621 | if (len % 32) | 628 | if (len % 32) |
622 | utx_len = len / 32 + 1; | 629 | utx_len = len / 32 + 1; |
623 | else | 630 | else |
@@ -676,21 +683,20 @@ static int cxio_hal_ctrl_qp_write_mem(struct cxio_rdev *rdev_p, u32 addr, | |||
676 | return 0; | 683 | return 0; |
677 | } | 684 | } |
678 | 685 | ||
679 | /* IN: stag key, pdid, perm, zbva, to, len, page_size, pbl, and pbl_size | 686 | /* IN: stag key, pdid, perm, zbva, to, len, page_size, pbl_size and pbl_addr |
680 | * OUT: stag index, actual pbl_size, pbl_addr allocated. | 687 | * OUT: stag index |
681 | * TBD: shared memory region support | 688 | * TBD: shared memory region support |
682 | */ | 689 | */ |
683 | static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, | 690 | static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, |
684 | u32 *stag, u8 stag_state, u32 pdid, | 691 | u32 *stag, u8 stag_state, u32 pdid, |
685 | enum tpt_mem_type type, enum tpt_mem_perm perm, | 692 | enum tpt_mem_type type, enum tpt_mem_perm perm, |
686 | u32 zbva, u64 to, u32 len, u8 page_size, __be64 *pbl, | 693 | u32 zbva, u64 to, u32 len, u8 page_size, |
687 | u32 *pbl_size, u32 *pbl_addr) | 694 | u32 pbl_size, u32 pbl_addr) |
688 | { | 695 | { |
689 | int err; | 696 | int err; |
690 | struct tpt_entry tpt; | 697 | struct tpt_entry tpt; |
691 | u32 stag_idx; | 698 | u32 stag_idx; |
692 | u32 wptr; | 699 | u32 wptr; |
693 | int rereg = (*stag != T3_STAG_UNSET); | ||
694 | 700 | ||
695 | stag_state = stag_state > 0; | 701 | stag_state = stag_state > 0; |
696 | stag_idx = (*stag) >> 8; | 702 | stag_idx = (*stag) >> 8; |
@@ -704,30 +710,8 @@ static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, | |||
704 | PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", | 710 | PDBG("%s stag_state 0x%0x type 0x%0x pdid 0x%0x, stag_idx 0x%x\n", |
705 | __func__, stag_state, type, pdid, stag_idx); | 711 | __func__, stag_state, type, pdid, stag_idx); |
706 | 712 | ||
707 | if (reset_tpt_entry) | ||
708 | cxio_hal_pblpool_free(rdev_p, *pbl_addr, *pbl_size << 3); | ||
709 | else if (!rereg) { | ||
710 | *pbl_addr = cxio_hal_pblpool_alloc(rdev_p, *pbl_size << 3); | ||
711 | if (!*pbl_addr) { | ||
712 | return -ENOMEM; | ||
713 | } | ||
714 | } | ||
715 | |||
716 | mutex_lock(&rdev_p->ctrl_qp.lock); | 713 | mutex_lock(&rdev_p->ctrl_qp.lock); |
717 | 714 | ||
718 | /* write PBL first if any - update pbl only if pbl list exist */ | ||
719 | if (pbl) { | ||
720 | |||
721 | PDBG("%s *pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d\n", | ||
722 | __func__, *pbl_addr, rdev_p->rnic_info.pbl_base, | ||
723 | *pbl_size); | ||
724 | err = cxio_hal_ctrl_qp_write_mem(rdev_p, | ||
725 | (*pbl_addr >> 5), | ||
726 | (*pbl_size << 3), pbl, 0); | ||
727 | if (err) | ||
728 | goto ret; | ||
729 | } | ||
730 | |||
731 | /* write TPT entry */ | 715 | /* write TPT entry */ |
732 | if (reset_tpt_entry) | 716 | if (reset_tpt_entry) |
733 | memset(&tpt, 0, sizeof(tpt)); | 717 | memset(&tpt, 0, sizeof(tpt)); |
@@ -742,23 +726,23 @@ static int __cxio_tpt_op(struct cxio_rdev *rdev_p, u32 reset_tpt_entry, | |||
742 | V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) | | 726 | V_TPT_ADDR_TYPE((zbva ? TPT_ZBTO : TPT_VATO)) | |
743 | V_TPT_PAGE_SIZE(page_size)); | 727 | V_TPT_PAGE_SIZE(page_size)); |
744 | tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 : | 728 | tpt.rsvd_pbl_addr = reset_tpt_entry ? 0 : |
745 | cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, *pbl_addr)>>3)); | 729 | cpu_to_be32(V_TPT_PBL_ADDR(PBL_OFF(rdev_p, pbl_addr)>>3)); |
746 | tpt.len = cpu_to_be32(len); | 730 | tpt.len = cpu_to_be32(len); |
747 | tpt.va_hi = cpu_to_be32((u32) (to >> 32)); | 731 | tpt.va_hi = cpu_to_be32((u32) (to >> 32)); |
748 | tpt.va_low_or_fbo = cpu_to_be32((u32) (to & 0xFFFFFFFFULL)); | 732 | tpt.va_low_or_fbo = cpu_to_be32((u32) (to & 0xFFFFFFFFULL)); |
749 | tpt.rsvd_bind_cnt_or_pstag = 0; | 733 | tpt.rsvd_bind_cnt_or_pstag = 0; |
750 | tpt.rsvd_pbl_size = reset_tpt_entry ? 0 : | 734 | tpt.rsvd_pbl_size = reset_tpt_entry ? 0 : |
751 | cpu_to_be32(V_TPT_PBL_SIZE((*pbl_size) >> 2)); | 735 | cpu_to_be32(V_TPT_PBL_SIZE(pbl_size >> 2)); |
752 | } | 736 | } |
753 | err = cxio_hal_ctrl_qp_write_mem(rdev_p, | 737 | err = cxio_hal_ctrl_qp_write_mem(rdev_p, |
754 | stag_idx + | 738 | stag_idx + |
755 | (rdev_p->rnic_info.tpt_base >> 5), | 739 | (rdev_p->rnic_info.tpt_base >> 5), |
756 | sizeof(tpt), &tpt, 1); | 740 | sizeof(tpt), &tpt); |
757 | 741 | ||
758 | /* release the stag index to free pool */ | 742 | /* release the stag index to free pool */ |
759 | if (reset_tpt_entry) | 743 | if (reset_tpt_entry) |
760 | cxio_hal_put_stag(rdev_p->rscp, stag_idx); | 744 | cxio_hal_put_stag(rdev_p->rscp, stag_idx); |
761 | ret: | 745 | |
762 | wptr = rdev_p->ctrl_qp.wptr; | 746 | wptr = rdev_p->ctrl_qp.wptr; |
763 | mutex_unlock(&rdev_p->ctrl_qp.lock); | 747 | mutex_unlock(&rdev_p->ctrl_qp.lock); |
764 | if (!err) | 748 | if (!err) |
@@ -769,44 +753,67 @@ ret: | |||
769 | return err; | 753 | return err; |
770 | } | 754 | } |
771 | 755 | ||
756 | int cxio_write_pbl(struct cxio_rdev *rdev_p, __be64 *pbl, | ||
757 | u32 pbl_addr, u32 pbl_size) | ||
758 | { | ||
759 | u32 wptr; | ||
760 | int err; | ||
761 | |||
762 | PDBG("%s *pdb_addr 0x%x, pbl_base 0x%x, pbl_size %d\n", | ||
763 | __func__, pbl_addr, rdev_p->rnic_info.pbl_base, | ||
764 | pbl_size); | ||
765 | |||
766 | mutex_lock(&rdev_p->ctrl_qp.lock); | ||
767 | err = cxio_hal_ctrl_qp_write_mem(rdev_p, pbl_addr >> 5, pbl_size << 3, | ||
768 | pbl); | ||
769 | wptr = rdev_p->ctrl_qp.wptr; | ||
770 | mutex_unlock(&rdev_p->ctrl_qp.lock); | ||
771 | if (err) | ||
772 | return err; | ||
773 | |||
774 | if (wait_event_interruptible(rdev_p->ctrl_qp.waitq, | ||
775 | SEQ32_GE(rdev_p->ctrl_qp.rptr, | ||
776 | wptr))) | ||
777 | return -ERESTARTSYS; | ||
778 | |||
779 | return 0; | ||
780 | } | ||
781 | |||
772 | int cxio_register_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, | 782 | int cxio_register_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, |
773 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | 783 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, |
774 | u8 page_size, __be64 *pbl, u32 *pbl_size, | 784 | u8 page_size, u32 pbl_size, u32 pbl_addr) |
775 | u32 *pbl_addr) | ||
776 | { | 785 | { |
777 | *stag = T3_STAG_UNSET; | 786 | *stag = T3_STAG_UNSET; |
778 | return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, | 787 | return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, |
779 | zbva, to, len, page_size, pbl, pbl_size, pbl_addr); | 788 | zbva, to, len, page_size, pbl_size, pbl_addr); |
780 | } | 789 | } |
781 | 790 | ||
782 | int cxio_reregister_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, | 791 | int cxio_reregister_phys_mem(struct cxio_rdev *rdev_p, u32 *stag, u32 pdid, |
783 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | 792 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, |
784 | u8 page_size, __be64 *pbl, u32 *pbl_size, | 793 | u8 page_size, u32 pbl_size, u32 pbl_addr) |
785 | u32 *pbl_addr) | ||
786 | { | 794 | { |
787 | return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, | 795 | return __cxio_tpt_op(rdev_p, 0, stag, 1, pdid, TPT_NON_SHARED_MR, perm, |
788 | zbva, to, len, page_size, pbl, pbl_size, pbl_addr); | 796 | zbva, to, len, page_size, pbl_size, pbl_addr); |
789 | } | 797 | } |
790 | 798 | ||
791 | int cxio_dereg_mem(struct cxio_rdev *rdev_p, u32 stag, u32 pbl_size, | 799 | int cxio_dereg_mem(struct cxio_rdev *rdev_p, u32 stag, u32 pbl_size, |
792 | u32 pbl_addr) | 800 | u32 pbl_addr) |
793 | { | 801 | { |
794 | return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL, | 802 | return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, |
795 | &pbl_size, &pbl_addr); | 803 | pbl_size, pbl_addr); |
796 | } | 804 | } |
797 | 805 | ||
798 | int cxio_allocate_window(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid) | 806 | int cxio_allocate_window(struct cxio_rdev *rdev_p, u32 * stag, u32 pdid) |
799 | { | 807 | { |
800 | u32 pbl_size = 0; | ||
801 | *stag = T3_STAG_UNSET; | 808 | *stag = T3_STAG_UNSET; |
802 | return __cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_MW, 0, 0, 0ULL, 0, 0, | 809 | return __cxio_tpt_op(rdev_p, 0, stag, 0, pdid, TPT_MW, 0, 0, 0ULL, 0, 0, |
803 | NULL, &pbl_size, NULL); | 810 | 0, 0); |
804 | } | 811 | } |
805 | 812 | ||
806 | int cxio_deallocate_window(struct cxio_rdev *rdev_p, u32 stag) | 813 | int cxio_deallocate_window(struct cxio_rdev *rdev_p, u32 stag) |
807 | { | 814 | { |
808 | return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, NULL, | 815 | return __cxio_tpt_op(rdev_p, 1, &stag, 0, 0, 0, 0, 0, 0ULL, 0, 0, |
809 | NULL, NULL); | 816 | 0, 0); |
810 | } | 817 | } |
811 | 818 | ||
812 | int cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) | 819 | int cxio_rdma_init(struct cxio_rdev *rdev_p, struct t3_rdma_init_attr *attr) |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h index 2bcff7f5046e..6e128f6bab05 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.h +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h | |||
@@ -154,14 +154,14 @@ int cxio_create_qp(struct cxio_rdev *rdev, u32 kernel_domain, struct t3_wq *wq, | |||
154 | int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq, | 154 | int cxio_destroy_qp(struct cxio_rdev *rdev, struct t3_wq *wq, |
155 | struct cxio_ucontext *uctx); | 155 | struct cxio_ucontext *uctx); |
156 | int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode); | 156 | int cxio_peek_cq(struct t3_wq *wr, struct t3_cq *cq, int opcode); |
157 | int cxio_write_pbl(struct cxio_rdev *rdev_p, __be64 *pbl, | ||
158 | u32 pbl_addr, u32 pbl_size); | ||
157 | int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, | 159 | int cxio_register_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, |
158 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | 160 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, |
159 | u8 page_size, __be64 *pbl, u32 *pbl_size, | 161 | u8 page_size, u32 pbl_size, u32 pbl_addr); |
160 | u32 *pbl_addr); | ||
161 | int cxio_reregister_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, | 162 | int cxio_reregister_phys_mem(struct cxio_rdev *rdev, u32 * stag, u32 pdid, |
162 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, | 163 | enum tpt_mem_perm perm, u32 zbva, u64 to, u32 len, |
163 | u8 page_size, __be64 *pbl, u32 *pbl_size, | 164 | u8 page_size, u32 pbl_size, u32 pbl_addr); |
164 | u32 *pbl_addr); | ||
165 | int cxio_dereg_mem(struct cxio_rdev *rdev, u32 stag, u32 pbl_size, | 165 | int cxio_dereg_mem(struct cxio_rdev *rdev, u32 stag, u32 pbl_size, |
166 | u32 pbl_addr); | 166 | u32 pbl_addr); |
167 | int cxio_allocate_window(struct cxio_rdev *rdev, u32 * stag, u32 pdid); | 167 | int cxio_allocate_window(struct cxio_rdev *rdev, u32 * stag, u32 pdid); |
@@ -173,8 +173,8 @@ u32 cxio_hal_get_pdid(struct cxio_hal_resource *rscp); | |||
173 | void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid); | 173 | void cxio_hal_put_pdid(struct cxio_hal_resource *rscp, u32 pdid); |
174 | int __init cxio_hal_init(void); | 174 | int __init cxio_hal_init(void); |
175 | void __exit cxio_hal_exit(void); | 175 | void __exit cxio_hal_exit(void); |
176 | void cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count); | 176 | int cxio_flush_rq(struct t3_wq *wq, struct t3_cq *cq, int count); |
177 | void cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count); | 177 | int cxio_flush_sq(struct t3_wq *wq, struct t3_cq *cq, int count); |
178 | void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count); | 178 | void cxio_count_rcqes(struct t3_cq *cq, struct t3_wq *wq, int *count); |
179 | void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count); | 179 | void cxio_count_scqes(struct t3_cq *cq, struct t3_wq *wq, int *count); |
180 | void cxio_flush_hw_cq(struct t3_cq *cq); | 180 | void cxio_flush_hw_cq(struct t3_cq *cq); |
diff --git a/drivers/infiniband/hw/cxgb3/cxio_resource.c b/drivers/infiniband/hw/cxgb3/cxio_resource.c index 45ed4f25ef78..bd233c087653 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_resource.c +++ b/drivers/infiniband/hw/cxgb3/cxio_resource.c | |||
@@ -250,7 +250,6 @@ void cxio_hal_destroy_resource(struct cxio_hal_resource *rscp) | |||
250 | */ | 250 | */ |
251 | 251 | ||
252 | #define MIN_PBL_SHIFT 8 /* 256B == min PBL size (32 entries) */ | 252 | #define MIN_PBL_SHIFT 8 /* 256B == min PBL size (32 entries) */ |
253 | #define PBL_CHUNK 2*1024*1024 | ||
254 | 253 | ||
255 | u32 cxio_hal_pblpool_alloc(struct cxio_rdev *rdev_p, int size) | 254 | u32 cxio_hal_pblpool_alloc(struct cxio_rdev *rdev_p, int size) |
256 | { | 255 | { |
@@ -267,14 +266,35 @@ void cxio_hal_pblpool_free(struct cxio_rdev *rdev_p, u32 addr, int size) | |||
267 | 266 | ||
268 | int cxio_hal_pblpool_create(struct cxio_rdev *rdev_p) | 267 | int cxio_hal_pblpool_create(struct cxio_rdev *rdev_p) |
269 | { | 268 | { |
270 | unsigned long i; | 269 | unsigned pbl_start, pbl_chunk; |
270 | |||
271 | rdev_p->pbl_pool = gen_pool_create(MIN_PBL_SHIFT, -1); | 271 | rdev_p->pbl_pool = gen_pool_create(MIN_PBL_SHIFT, -1); |
272 | if (rdev_p->pbl_pool) | 272 | if (!rdev_p->pbl_pool) |
273 | for (i = rdev_p->rnic_info.pbl_base; | 273 | return -ENOMEM; |
274 | i <= rdev_p->rnic_info.pbl_top - PBL_CHUNK + 1; | 274 | |
275 | i += PBL_CHUNK) | 275 | pbl_start = rdev_p->rnic_info.pbl_base; |
276 | gen_pool_add(rdev_p->pbl_pool, i, PBL_CHUNK, -1); | 276 | pbl_chunk = rdev_p->rnic_info.pbl_top - pbl_start + 1; |
277 | return rdev_p->pbl_pool ? 0 : -ENOMEM; | 277 | |
278 | while (pbl_start < rdev_p->rnic_info.pbl_top) { | ||
279 | pbl_chunk = min(rdev_p->rnic_info.pbl_top - pbl_start + 1, | ||
280 | pbl_chunk); | ||
281 | if (gen_pool_add(rdev_p->pbl_pool, pbl_start, pbl_chunk, -1)) { | ||
282 | PDBG("%s failed to add PBL chunk (%x/%x)\n", | ||
283 | __func__, pbl_start, pbl_chunk); | ||
284 | if (pbl_chunk <= 1024 << MIN_PBL_SHIFT) { | ||
285 | printk(KERN_WARNING MOD "%s: Failed to add all PBL chunks (%x/%x)\n", | ||
286 | __func__, pbl_start, rdev_p->rnic_info.pbl_top - pbl_start); | ||
287 | return 0; | ||
288 | } | ||
289 | pbl_chunk >>= 1; | ||
290 | } else { | ||
291 | PDBG("%s added PBL chunk (%x/%x)\n", | ||
292 | __func__, pbl_start, pbl_chunk); | ||
293 | pbl_start += pbl_chunk; | ||
294 | } | ||
295 | } | ||
296 | |||
297 | return 0; | ||
278 | } | 298 | } |
279 | 299 | ||
280 | void cxio_hal_pblpool_destroy(struct cxio_rdev *rdev_p) | 300 | void cxio_hal_pblpool_destroy(struct cxio_rdev *rdev_p) |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c index d44a6df9ad8c..c325c44807e8 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_cm.c +++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c | |||
@@ -67,10 +67,10 @@ int peer2peer = 0; | |||
67 | module_param(peer2peer, int, 0644); | 67 | module_param(peer2peer, int, 0644); |
68 | MODULE_PARM_DESC(peer2peer, "Support peer2peer ULPs (default=0)"); | 68 | MODULE_PARM_DESC(peer2peer, "Support peer2peer ULPs (default=0)"); |
69 | 69 | ||
70 | static int ep_timeout_secs = 10; | 70 | static int ep_timeout_secs = 60; |
71 | module_param(ep_timeout_secs, int, 0644); | 71 | module_param(ep_timeout_secs, int, 0644); |
72 | MODULE_PARM_DESC(ep_timeout_secs, "CM Endpoint operation timeout " | 72 | MODULE_PARM_DESC(ep_timeout_secs, "CM Endpoint operation timeout " |
73 | "in seconds (default=10)"); | 73 | "in seconds (default=60)"); |
74 | 74 | ||
75 | static int mpa_rev = 1; | 75 | static int mpa_rev = 1; |
76 | module_param(mpa_rev, int, 0644); | 76 | module_param(mpa_rev, int, 0644); |
@@ -1650,8 +1650,8 @@ static int close_con_rpl(struct t3cdev *tdev, struct sk_buff *skb, void *ctx) | |||
1650 | release = 1; | 1650 | release = 1; |
1651 | break; | 1651 | break; |
1652 | case ABORTING: | 1652 | case ABORTING: |
1653 | break; | ||
1654 | case DEAD: | 1653 | case DEAD: |
1654 | break; | ||
1655 | default: | 1655 | default: |
1656 | BUG_ON(1); | 1656 | BUG_ON(1); |
1657 | break; | 1657 | break; |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_mem.c b/drivers/infiniband/hw/cxgb3/iwch_mem.c index 58c3d61bcd14..ec49a5cbdebb 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_mem.c +++ b/drivers/infiniband/hw/cxgb3/iwch_mem.c | |||
@@ -35,17 +35,26 @@ | |||
35 | #include <rdma/ib_verbs.h> | 35 | #include <rdma/ib_verbs.h> |
36 | 36 | ||
37 | #include "cxio_hal.h" | 37 | #include "cxio_hal.h" |
38 | #include "cxio_resource.h" | ||
38 | #include "iwch.h" | 39 | #include "iwch.h" |
39 | #include "iwch_provider.h" | 40 | #include "iwch_provider.h" |
40 | 41 | ||
41 | int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, | 42 | static void iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag) |
42 | struct iwch_mr *mhp, | ||
43 | int shift, | ||
44 | __be64 *page_list) | ||
45 | { | 43 | { |
46 | u32 stag; | ||
47 | u32 mmid; | 44 | u32 mmid; |
48 | 45 | ||
46 | mhp->attr.state = 1; | ||
47 | mhp->attr.stag = stag; | ||
48 | mmid = stag >> 8; | ||
49 | mhp->ibmr.rkey = mhp->ibmr.lkey = stag; | ||
50 | insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid); | ||
51 | PDBG("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp); | ||
52 | } | ||
53 | |||
54 | int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, | ||
55 | struct iwch_mr *mhp, int shift) | ||
56 | { | ||
57 | u32 stag; | ||
49 | 58 | ||
50 | if (cxio_register_phys_mem(&rhp->rdev, | 59 | if (cxio_register_phys_mem(&rhp->rdev, |
51 | &stag, mhp->attr.pdid, | 60 | &stag, mhp->attr.pdid, |
@@ -53,28 +62,21 @@ int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, | |||
53 | mhp->attr.zbva, | 62 | mhp->attr.zbva, |
54 | mhp->attr.va_fbo, | 63 | mhp->attr.va_fbo, |
55 | mhp->attr.len, | 64 | mhp->attr.len, |
56 | shift-12, | 65 | shift - 12, |
57 | page_list, | 66 | mhp->attr.pbl_size, mhp->attr.pbl_addr)) |
58 | &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) | ||
59 | return -ENOMEM; | 67 | return -ENOMEM; |
60 | mhp->attr.state = 1; | 68 | |
61 | mhp->attr.stag = stag; | 69 | iwch_finish_mem_reg(mhp, stag); |
62 | mmid = stag >> 8; | 70 | |
63 | mhp->ibmr.rkey = mhp->ibmr.lkey = stag; | ||
64 | insert_handle(rhp, &rhp->mmidr, mhp, mmid); | ||
65 | PDBG("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp); | ||
66 | return 0; | 71 | return 0; |
67 | } | 72 | } |
68 | 73 | ||
69 | int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, | 74 | int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, |
70 | struct iwch_mr *mhp, | 75 | struct iwch_mr *mhp, |
71 | int shift, | 76 | int shift, |
72 | __be64 *page_list, | ||
73 | int npages) | 77 | int npages) |
74 | { | 78 | { |
75 | u32 stag; | 79 | u32 stag; |
76 | u32 mmid; | ||
77 | |||
78 | 80 | ||
79 | /* We could support this... */ | 81 | /* We could support this... */ |
80 | if (npages > mhp->attr.pbl_size) | 82 | if (npages > mhp->attr.pbl_size) |
@@ -87,19 +89,40 @@ int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, | |||
87 | mhp->attr.zbva, | 89 | mhp->attr.zbva, |
88 | mhp->attr.va_fbo, | 90 | mhp->attr.va_fbo, |
89 | mhp->attr.len, | 91 | mhp->attr.len, |
90 | shift-12, | 92 | shift - 12, |
91 | page_list, | 93 | mhp->attr.pbl_size, mhp->attr.pbl_addr)) |
92 | &mhp->attr.pbl_size, &mhp->attr.pbl_addr)) | ||
93 | return -ENOMEM; | 94 | return -ENOMEM; |
94 | mhp->attr.state = 1; | 95 | |
95 | mhp->attr.stag = stag; | 96 | iwch_finish_mem_reg(mhp, stag); |
96 | mmid = stag >> 8; | 97 | |
97 | mhp->ibmr.rkey = mhp->ibmr.lkey = stag; | 98 | return 0; |
98 | insert_handle(rhp, &rhp->mmidr, mhp, mmid); | 99 | } |
99 | PDBG("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp); | 100 | |
101 | int iwch_alloc_pbl(struct iwch_mr *mhp, int npages) | ||
102 | { | ||
103 | mhp->attr.pbl_addr = cxio_hal_pblpool_alloc(&mhp->rhp->rdev, | ||
104 | npages << 3); | ||
105 | |||
106 | if (!mhp->attr.pbl_addr) | ||
107 | return -ENOMEM; | ||
108 | |||
109 | mhp->attr.pbl_size = npages; | ||
110 | |||
100 | return 0; | 111 | return 0; |
101 | } | 112 | } |
102 | 113 | ||
114 | void iwch_free_pbl(struct iwch_mr *mhp) | ||
115 | { | ||
116 | cxio_hal_pblpool_free(&mhp->rhp->rdev, mhp->attr.pbl_addr, | ||
117 | mhp->attr.pbl_size << 3); | ||
118 | } | ||
119 | |||
120 | int iwch_write_pbl(struct iwch_mr *mhp, __be64 *pages, int npages, int offset) | ||
121 | { | ||
122 | return cxio_write_pbl(&mhp->rhp->rdev, pages, | ||
123 | mhp->attr.pbl_addr + (offset << 3), npages); | ||
124 | } | ||
125 | |||
103 | int build_phys_page_list(struct ib_phys_buf *buffer_list, | 126 | int build_phys_page_list(struct ib_phys_buf *buffer_list, |
104 | int num_phys_buf, | 127 | int num_phys_buf, |
105 | u64 *iova_start, | 128 | u64 *iova_start, |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index d07d3a377b5f..8934178a23ee 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -442,6 +442,7 @@ static int iwch_dereg_mr(struct ib_mr *ib_mr) | |||
442 | mmid = mhp->attr.stag >> 8; | 442 | mmid = mhp->attr.stag >> 8; |
443 | cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, | 443 | cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size, |
444 | mhp->attr.pbl_addr); | 444 | mhp->attr.pbl_addr); |
445 | iwch_free_pbl(mhp); | ||
445 | remove_handle(rhp, &rhp->mmidr, mmid); | 446 | remove_handle(rhp, &rhp->mmidr, mmid); |
446 | if (mhp->kva) | 447 | if (mhp->kva) |
447 | kfree((void *) (unsigned long) mhp->kva); | 448 | kfree((void *) (unsigned long) mhp->kva); |
@@ -475,6 +476,8 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, | |||
475 | if (!mhp) | 476 | if (!mhp) |
476 | return ERR_PTR(-ENOMEM); | 477 | return ERR_PTR(-ENOMEM); |
477 | 478 | ||
479 | mhp->rhp = rhp; | ||
480 | |||
478 | /* First check that we have enough alignment */ | 481 | /* First check that we have enough alignment */ |
479 | if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK)) { | 482 | if ((*iova_start & ~PAGE_MASK) != (buffer_list[0].addr & ~PAGE_MASK)) { |
480 | ret = -EINVAL; | 483 | ret = -EINVAL; |
@@ -492,7 +495,17 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, | |||
492 | if (ret) | 495 | if (ret) |
493 | goto err; | 496 | goto err; |
494 | 497 | ||
495 | mhp->rhp = rhp; | 498 | ret = iwch_alloc_pbl(mhp, npages); |
499 | if (ret) { | ||
500 | kfree(page_list); | ||
501 | goto err_pbl; | ||
502 | } | ||
503 | |||
504 | ret = iwch_write_pbl(mhp, page_list, npages, 0); | ||
505 | kfree(page_list); | ||
506 | if (ret) | ||
507 | goto err_pbl; | ||
508 | |||
496 | mhp->attr.pdid = php->pdid; | 509 | mhp->attr.pdid = php->pdid; |
497 | mhp->attr.zbva = 0; | 510 | mhp->attr.zbva = 0; |
498 | 511 | ||
@@ -502,12 +515,15 @@ static struct ib_mr *iwch_register_phys_mem(struct ib_pd *pd, | |||
502 | 515 | ||
503 | mhp->attr.len = (u32) total_size; | 516 | mhp->attr.len = (u32) total_size; |
504 | mhp->attr.pbl_size = npages; | 517 | mhp->attr.pbl_size = npages; |
505 | ret = iwch_register_mem(rhp, php, mhp, shift, page_list); | 518 | ret = iwch_register_mem(rhp, php, mhp, shift); |
506 | kfree(page_list); | 519 | if (ret) |
507 | if (ret) { | 520 | goto err_pbl; |
508 | goto err; | 521 | |
509 | } | ||
510 | return &mhp->ibmr; | 522 | return &mhp->ibmr; |
523 | |||
524 | err_pbl: | ||
525 | iwch_free_pbl(mhp); | ||
526 | |||
511 | err: | 527 | err: |
512 | kfree(mhp); | 528 | kfree(mhp); |
513 | return ERR_PTR(ret); | 529 | return ERR_PTR(ret); |
@@ -560,7 +576,7 @@ static int iwch_reregister_phys_mem(struct ib_mr *mr, | |||
560 | return ret; | 576 | return ret; |
561 | } | 577 | } |
562 | 578 | ||
563 | ret = iwch_reregister_mem(rhp, php, &mh, shift, page_list, npages); | 579 | ret = iwch_reregister_mem(rhp, php, &mh, shift, npages); |
564 | kfree(page_list); | 580 | kfree(page_list); |
565 | if (ret) { | 581 | if (ret) { |
566 | return ret; | 582 | return ret; |
@@ -602,6 +618,8 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
602 | if (!mhp) | 618 | if (!mhp) |
603 | return ERR_PTR(-ENOMEM); | 619 | return ERR_PTR(-ENOMEM); |
604 | 620 | ||
621 | mhp->rhp = rhp; | ||
622 | |||
605 | mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); | 623 | mhp->umem = ib_umem_get(pd->uobject->context, start, length, acc, 0); |
606 | if (IS_ERR(mhp->umem)) { | 624 | if (IS_ERR(mhp->umem)) { |
607 | err = PTR_ERR(mhp->umem); | 625 | err = PTR_ERR(mhp->umem); |
@@ -615,10 +633,14 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
615 | list_for_each_entry(chunk, &mhp->umem->chunk_list, list) | 633 | list_for_each_entry(chunk, &mhp->umem->chunk_list, list) |
616 | n += chunk->nents; | 634 | n += chunk->nents; |
617 | 635 | ||
618 | pages = kmalloc(n * sizeof(u64), GFP_KERNEL); | 636 | err = iwch_alloc_pbl(mhp, n); |
637 | if (err) | ||
638 | goto err; | ||
639 | |||
640 | pages = (__be64 *) __get_free_page(GFP_KERNEL); | ||
619 | if (!pages) { | 641 | if (!pages) { |
620 | err = -ENOMEM; | 642 | err = -ENOMEM; |
621 | goto err; | 643 | goto err_pbl; |
622 | } | 644 | } |
623 | 645 | ||
624 | i = n = 0; | 646 | i = n = 0; |
@@ -630,25 +652,38 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
630 | pages[i++] = cpu_to_be64(sg_dma_address( | 652 | pages[i++] = cpu_to_be64(sg_dma_address( |
631 | &chunk->page_list[j]) + | 653 | &chunk->page_list[j]) + |
632 | mhp->umem->page_size * k); | 654 | mhp->umem->page_size * k); |
655 | if (i == PAGE_SIZE / sizeof *pages) { | ||
656 | err = iwch_write_pbl(mhp, pages, i, n); | ||
657 | if (err) | ||
658 | goto pbl_done; | ||
659 | n += i; | ||
660 | i = 0; | ||
661 | } | ||
633 | } | 662 | } |
634 | } | 663 | } |
635 | 664 | ||
636 | mhp->rhp = rhp; | 665 | if (i) |
666 | err = iwch_write_pbl(mhp, pages, i, n); | ||
667 | |||
668 | pbl_done: | ||
669 | free_page((unsigned long) pages); | ||
670 | if (err) | ||
671 | goto err_pbl; | ||
672 | |||
637 | mhp->attr.pdid = php->pdid; | 673 | mhp->attr.pdid = php->pdid; |
638 | mhp->attr.zbva = 0; | 674 | mhp->attr.zbva = 0; |
639 | mhp->attr.perms = iwch_ib_to_tpt_access(acc); | 675 | mhp->attr.perms = iwch_ib_to_tpt_access(acc); |
640 | mhp->attr.va_fbo = virt; | 676 | mhp->attr.va_fbo = virt; |
641 | mhp->attr.page_size = shift - 12; | 677 | mhp->attr.page_size = shift - 12; |
642 | mhp->attr.len = (u32) length; | 678 | mhp->attr.len = (u32) length; |
643 | mhp->attr.pbl_size = i; | 679 | |
644 | err = iwch_register_mem(rhp, php, mhp, shift, pages); | 680 | err = iwch_register_mem(rhp, php, mhp, shift); |
645 | kfree(pages); | ||
646 | if (err) | 681 | if (err) |
647 | goto err; | 682 | goto err_pbl; |
648 | 683 | ||
649 | if (udata && !t3a_device(rhp)) { | 684 | if (udata && !t3a_device(rhp)) { |
650 | uresp.pbl_addr = (mhp->attr.pbl_addr - | 685 | uresp.pbl_addr = (mhp->attr.pbl_addr - |
651 | rhp->rdev.rnic_info.pbl_base) >> 3; | 686 | rhp->rdev.rnic_info.pbl_base) >> 3; |
652 | PDBG("%s user resp pbl_addr 0x%x\n", __func__, | 687 | PDBG("%s user resp pbl_addr 0x%x\n", __func__, |
653 | uresp.pbl_addr); | 688 | uresp.pbl_addr); |
654 | 689 | ||
@@ -661,6 +696,9 @@ static struct ib_mr *iwch_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, | |||
661 | 696 | ||
662 | return &mhp->ibmr; | 697 | return &mhp->ibmr; |
663 | 698 | ||
699 | err_pbl: | ||
700 | iwch_free_pbl(mhp); | ||
701 | |||
664 | err: | 702 | err: |
665 | ib_umem_release(mhp->umem); | 703 | ib_umem_release(mhp->umem); |
666 | kfree(mhp); | 704 | kfree(mhp); |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.h b/drivers/infiniband/hw/cxgb3/iwch_provider.h index db5100d27ca2..836163fc5429 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.h +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.h | |||
@@ -340,14 +340,14 @@ int iwch_quiesce_qps(struct iwch_cq *chp); | |||
340 | int iwch_resume_qps(struct iwch_cq *chp); | 340 | int iwch_resume_qps(struct iwch_cq *chp); |
341 | void stop_read_rep_timer(struct iwch_qp *qhp); | 341 | void stop_read_rep_timer(struct iwch_qp *qhp); |
342 | int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, | 342 | int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php, |
343 | struct iwch_mr *mhp, | 343 | struct iwch_mr *mhp, int shift); |
344 | int shift, | ||
345 | __be64 *page_list); | ||
346 | int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, | 344 | int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php, |
347 | struct iwch_mr *mhp, | 345 | struct iwch_mr *mhp, |
348 | int shift, | 346 | int shift, |
349 | __be64 *page_list, | ||
350 | int npages); | 347 | int npages); |
348 | int iwch_alloc_pbl(struct iwch_mr *mhp, int npages); | ||
349 | void iwch_free_pbl(struct iwch_mr *mhp); | ||
350 | int iwch_write_pbl(struct iwch_mr *mhp, __be64 *pages, int npages, int offset); | ||
351 | int build_phys_page_list(struct ib_phys_buf *buffer_list, | 351 | int build_phys_page_list(struct ib_phys_buf *buffer_list, |
352 | int num_phys_buf, | 352 | int num_phys_buf, |
353 | u64 *iova_start, | 353 | u64 *iova_start, |
diff --git a/drivers/infiniband/hw/cxgb3/iwch_qp.c b/drivers/infiniband/hw/cxgb3/iwch_qp.c index 9b4be889c58e..79dbe5beae52 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_qp.c +++ b/drivers/infiniband/hw/cxgb3/iwch_qp.c | |||
@@ -655,6 +655,7 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag) | |||
655 | { | 655 | { |
656 | struct iwch_cq *rchp, *schp; | 656 | struct iwch_cq *rchp, *schp; |
657 | int count; | 657 | int count; |
658 | int flushed; | ||
658 | 659 | ||
659 | rchp = get_chp(qhp->rhp, qhp->attr.rcq); | 660 | rchp = get_chp(qhp->rhp, qhp->attr.rcq); |
660 | schp = get_chp(qhp->rhp, qhp->attr.scq); | 661 | schp = get_chp(qhp->rhp, qhp->attr.scq); |
@@ -669,20 +670,22 @@ static void __flush_qp(struct iwch_qp *qhp, unsigned long *flag) | |||
669 | spin_lock(&qhp->lock); | 670 | spin_lock(&qhp->lock); |
670 | cxio_flush_hw_cq(&rchp->cq); | 671 | cxio_flush_hw_cq(&rchp->cq); |
671 | cxio_count_rcqes(&rchp->cq, &qhp->wq, &count); | 672 | cxio_count_rcqes(&rchp->cq, &qhp->wq, &count); |
672 | cxio_flush_rq(&qhp->wq, &rchp->cq, count); | 673 | flushed = cxio_flush_rq(&qhp->wq, &rchp->cq, count); |
673 | spin_unlock(&qhp->lock); | 674 | spin_unlock(&qhp->lock); |
674 | spin_unlock_irqrestore(&rchp->lock, *flag); | 675 | spin_unlock_irqrestore(&rchp->lock, *flag); |
675 | (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); | 676 | if (flushed) |
677 | (*rchp->ibcq.comp_handler)(&rchp->ibcq, rchp->ibcq.cq_context); | ||
676 | 678 | ||
677 | /* locking heirarchy: cq lock first, then qp lock. */ | 679 | /* locking heirarchy: cq lock first, then qp lock. */ |
678 | spin_lock_irqsave(&schp->lock, *flag); | 680 | spin_lock_irqsave(&schp->lock, *flag); |
679 | spin_lock(&qhp->lock); | 681 | spin_lock(&qhp->lock); |
680 | cxio_flush_hw_cq(&schp->cq); | 682 | cxio_flush_hw_cq(&schp->cq); |
681 | cxio_count_scqes(&schp->cq, &qhp->wq, &count); | 683 | cxio_count_scqes(&schp->cq, &qhp->wq, &count); |
682 | cxio_flush_sq(&qhp->wq, &schp->cq, count); | 684 | flushed = cxio_flush_sq(&qhp->wq, &schp->cq, count); |
683 | spin_unlock(&qhp->lock); | 685 | spin_unlock(&qhp->lock); |
684 | spin_unlock_irqrestore(&schp->lock, *flag); | 686 | spin_unlock_irqrestore(&schp->lock, *flag); |
685 | (*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context); | 687 | if (flushed) |
688 | (*schp->ibcq.comp_handler)(&schp->ibcq, schp->ibcq.cq_context); | ||
686 | 689 | ||
687 | /* deref */ | 690 | /* deref */ |
688 | if (atomic_dec_and_test(&qhp->refcnt)) | 691 | if (atomic_dec_and_test(&qhp->refcnt)) |
@@ -880,7 +883,6 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, | |||
880 | ep = qhp->ep; | 883 | ep = qhp->ep; |
881 | get_ep(&ep->com); | 884 | get_ep(&ep->com); |
882 | } | 885 | } |
883 | flush_qp(qhp, &flag); | ||
884 | break; | 886 | break; |
885 | case IWCH_QP_STATE_TERMINATE: | 887 | case IWCH_QP_STATE_TERMINATE: |
886 | qhp->attr.state = IWCH_QP_STATE_TERMINATE; | 888 | qhp->attr.state = IWCH_QP_STATE_TERMINATE; |
@@ -911,6 +913,7 @@ int iwch_modify_qp(struct iwch_dev *rhp, struct iwch_qp *qhp, | |||
911 | } | 913 | } |
912 | switch (attrs->next_state) { | 914 | switch (attrs->next_state) { |
913 | case IWCH_QP_STATE_IDLE: | 915 | case IWCH_QP_STATE_IDLE: |
916 | flush_qp(qhp, &flag); | ||
914 | qhp->attr.state = IWCH_QP_STATE_IDLE; | 917 | qhp->attr.state = IWCH_QP_STATE_IDLE; |
915 | qhp->attr.llp_stream_handle = NULL; | 918 | qhp->attr.llp_stream_handle = NULL; |
916 | put_ep(&qhp->ep->com); | 919 | put_ep(&qhp->ep->com); |
diff --git a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h index 00bab60f6de4..1e9e99a13933 100644 --- a/drivers/infiniband/hw/ehca/ehca_classes.h +++ b/drivers/infiniband/hw/ehca/ehca_classes.h | |||
@@ -192,6 +192,8 @@ struct ehca_qp { | |||
192 | int mtu_shift; | 192 | int mtu_shift; |
193 | u32 message_count; | 193 | u32 message_count; |
194 | u32 packet_count; | 194 | u32 packet_count; |
195 | atomic_t nr_events; /* events seen */ | ||
196 | wait_queue_head_t wait_completion; | ||
195 | }; | 197 | }; |
196 | 198 | ||
197 | #define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ) | 199 | #define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ) |
diff --git a/drivers/infiniband/hw/ehca/ehca_hca.c b/drivers/infiniband/hw/ehca/ehca_hca.c index 2515cbde7e65..bc3b37d2070f 100644 --- a/drivers/infiniband/hw/ehca/ehca_hca.c +++ b/drivers/infiniband/hw/ehca/ehca_hca.c | |||
@@ -101,7 +101,6 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | |||
101 | props->max_ee = limit_uint(rblock->max_rd_ee_context); | 101 | props->max_ee = limit_uint(rblock->max_rd_ee_context); |
102 | props->max_rdd = limit_uint(rblock->max_rd_domain); | 102 | props->max_rdd = limit_uint(rblock->max_rd_domain); |
103 | props->max_fmr = limit_uint(rblock->max_mr); | 103 | props->max_fmr = limit_uint(rblock->max_mr); |
104 | props->local_ca_ack_delay = limit_uint(rblock->local_ca_ack_delay); | ||
105 | props->max_qp_rd_atom = limit_uint(rblock->max_rr_qp); | 104 | props->max_qp_rd_atom = limit_uint(rblock->max_rr_qp); |
106 | props->max_ee_rd_atom = limit_uint(rblock->max_rr_ee_context); | 105 | props->max_ee_rd_atom = limit_uint(rblock->max_rr_ee_context); |
107 | props->max_res_rd_atom = limit_uint(rblock->max_rr_hca); | 106 | props->max_res_rd_atom = limit_uint(rblock->max_rr_hca); |
@@ -115,7 +114,7 @@ int ehca_query_device(struct ib_device *ibdev, struct ib_device_attr *props) | |||
115 | } | 114 | } |
116 | 115 | ||
117 | props->max_pkeys = 16; | 116 | props->max_pkeys = 16; |
118 | props->local_ca_ack_delay = limit_uint(rblock->local_ca_ack_delay); | 117 | props->local_ca_ack_delay = min_t(u8, rblock->local_ca_ack_delay, 255); |
119 | props->max_raw_ipv6_qp = limit_uint(rblock->max_raw_ipv6_qp); | 118 | props->max_raw_ipv6_qp = limit_uint(rblock->max_raw_ipv6_qp); |
120 | props->max_raw_ethy_qp = limit_uint(rblock->max_raw_ethy_qp); | 119 | props->max_raw_ethy_qp = limit_uint(rblock->max_raw_ethy_qp); |
121 | props->max_mcast_grp = limit_uint(rblock->max_mcast_grp); | 120 | props->max_mcast_grp = limit_uint(rblock->max_mcast_grp); |
@@ -136,7 +135,7 @@ query_device1: | |||
136 | return ret; | 135 | return ret; |
137 | } | 136 | } |
138 | 137 | ||
139 | static int map_mtu(struct ehca_shca *shca, u32 fw_mtu) | 138 | static enum ib_mtu map_mtu(struct ehca_shca *shca, u32 fw_mtu) |
140 | { | 139 | { |
141 | switch (fw_mtu) { | 140 | switch (fw_mtu) { |
142 | case 0x1: | 141 | case 0x1: |
@@ -156,7 +155,7 @@ static int map_mtu(struct ehca_shca *shca, u32 fw_mtu) | |||
156 | } | 155 | } |
157 | } | 156 | } |
158 | 157 | ||
159 | static int map_number_of_vls(struct ehca_shca *shca, u32 vl_cap) | 158 | static u8 map_number_of_vls(struct ehca_shca *shca, u32 vl_cap) |
160 | { | 159 | { |
161 | switch (vl_cap) { | 160 | switch (vl_cap) { |
162 | case 0x1: | 161 | case 0x1: |
diff --git a/drivers/infiniband/hw/ehca/ehca_irq.c b/drivers/infiniband/hw/ehca/ehca_irq.c index ca5eb0cb628c..ce1ab0571be3 100644 --- a/drivers/infiniband/hw/ehca/ehca_irq.c +++ b/drivers/infiniband/hw/ehca/ehca_irq.c | |||
@@ -204,6 +204,8 @@ static void qp_event_callback(struct ehca_shca *shca, u64 eqe, | |||
204 | 204 | ||
205 | read_lock(&ehca_qp_idr_lock); | 205 | read_lock(&ehca_qp_idr_lock); |
206 | qp = idr_find(&ehca_qp_idr, token); | 206 | qp = idr_find(&ehca_qp_idr, token); |
207 | if (qp) | ||
208 | atomic_inc(&qp->nr_events); | ||
207 | read_unlock(&ehca_qp_idr_lock); | 209 | read_unlock(&ehca_qp_idr_lock); |
208 | 210 | ||
209 | if (!qp) | 211 | if (!qp) |
@@ -223,6 +225,8 @@ static void qp_event_callback(struct ehca_shca *shca, u64 eqe, | |||
223 | if (fatal && qp->ext_type == EQPT_SRQBASE) | 225 | if (fatal && qp->ext_type == EQPT_SRQBASE) |
224 | dispatch_qp_event(shca, qp, IB_EVENT_QP_LAST_WQE_REACHED); | 226 | dispatch_qp_event(shca, qp, IB_EVENT_QP_LAST_WQE_REACHED); |
225 | 227 | ||
228 | if (atomic_dec_and_test(&qp->nr_events)) | ||
229 | wake_up(&qp->wait_completion); | ||
226 | return; | 230 | return; |
227 | } | 231 | } |
228 | 232 | ||
diff --git a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c index 18fba92fa7ae..3f59587338ea 100644 --- a/drivers/infiniband/hw/ehca/ehca_qp.c +++ b/drivers/infiniband/hw/ehca/ehca_qp.c | |||
@@ -566,6 +566,8 @@ static struct ehca_qp *internal_create_qp( | |||
566 | return ERR_PTR(-ENOMEM); | 566 | return ERR_PTR(-ENOMEM); |
567 | } | 567 | } |
568 | 568 | ||
569 | atomic_set(&my_qp->nr_events, 0); | ||
570 | init_waitqueue_head(&my_qp->wait_completion); | ||
569 | spin_lock_init(&my_qp->spinlock_s); | 571 | spin_lock_init(&my_qp->spinlock_s); |
570 | spin_lock_init(&my_qp->spinlock_r); | 572 | spin_lock_init(&my_qp->spinlock_r); |
571 | my_qp->qp_type = qp_type; | 573 | my_qp->qp_type = qp_type; |
@@ -1934,6 +1936,9 @@ static int internal_destroy_qp(struct ib_device *dev, struct ehca_qp *my_qp, | |||
1934 | idr_remove(&ehca_qp_idr, my_qp->token); | 1936 | idr_remove(&ehca_qp_idr, my_qp->token); |
1935 | write_unlock_irqrestore(&ehca_qp_idr_lock, flags); | 1937 | write_unlock_irqrestore(&ehca_qp_idr_lock, flags); |
1936 | 1938 | ||
1939 | /* now wait until all pending events have completed */ | ||
1940 | wait_event(my_qp->wait_completion, !atomic_read(&my_qp->nr_events)); | ||
1941 | |||
1937 | h_ret = hipz_h_destroy_qp(shca->ipz_hca_handle, my_qp); | 1942 | h_ret = hipz_h_destroy_qp(shca->ipz_hca_handle, my_qp); |
1938 | if (h_ret != H_SUCCESS) { | 1943 | if (h_ret != H_SUCCESS) { |
1939 | ehca_err(dev, "hipz_h_destroy_qp() failed h_ret=%li " | 1944 | ehca_err(dev, "hipz_h_destroy_qp() failed h_ret=%li " |
diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c index acf30c06a0c0..daad09a45910 100644 --- a/drivers/infiniband/hw/ipath/ipath_driver.c +++ b/drivers/infiniband/hw/ipath/ipath_driver.c | |||
@@ -1197,7 +1197,7 @@ void ipath_kreceive(struct ipath_portdata *pd) | |||
1197 | } | 1197 | } |
1198 | 1198 | ||
1199 | reloop: | 1199 | reloop: |
1200 | for (last = 0, i = 1; !last; i++) { | 1200 | for (last = 0, i = 1; !last; i += !last) { |
1201 | hdr = dd->ipath_f_get_msgheader(dd, rhf_addr); | 1201 | hdr = dd->ipath_f_get_msgheader(dd, rhf_addr); |
1202 | eflags = ipath_hdrget_err_flags(rhf_addr); | 1202 | eflags = ipath_hdrget_err_flags(rhf_addr); |
1203 | etype = ipath_hdrget_rcv_type(rhf_addr); | 1203 | etype = ipath_hdrget_rcv_type(rhf_addr); |
@@ -1428,6 +1428,40 @@ static void ipath_update_pio_bufs(struct ipath_devdata *dd) | |||
1428 | spin_unlock_irqrestore(&ipath_pioavail_lock, flags); | 1428 | spin_unlock_irqrestore(&ipath_pioavail_lock, flags); |
1429 | } | 1429 | } |
1430 | 1430 | ||
1431 | /* | ||
1432 | * used to force update of pioavailshadow if we can't get a pio buffer. | ||
1433 | * Needed primarily due to exitting freeze mode after recovering | ||
1434 | * from errors. Done lazily, because it's safer (known to not | ||
1435 | * be writing pio buffers). | ||
1436 | */ | ||
1437 | static void ipath_reset_availshadow(struct ipath_devdata *dd) | ||
1438 | { | ||
1439 | int i, im; | ||
1440 | unsigned long flags; | ||
1441 | |||
1442 | spin_lock_irqsave(&ipath_pioavail_lock, flags); | ||
1443 | for (i = 0; i < dd->ipath_pioavregs; i++) { | ||
1444 | u64 val, oldval; | ||
1445 | /* deal with 6110 chip bug on high register #s */ | ||
1446 | im = (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS)) ? | ||
1447 | i ^ 1 : i; | ||
1448 | val = le64_to_cpu(dd->ipath_pioavailregs_dma[im]); | ||
1449 | /* | ||
1450 | * busy out the buffers not in the kernel avail list, | ||
1451 | * without changing the generation bits. | ||
1452 | */ | ||
1453 | oldval = dd->ipath_pioavailshadow[i]; | ||
1454 | dd->ipath_pioavailshadow[i] = val | | ||
1455 | ((~dd->ipath_pioavailkernel[i] << | ||
1456 | INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT) & | ||
1457 | 0xaaaaaaaaaaaaaaaaULL); /* All BUSY bits in qword */ | ||
1458 | if (oldval != dd->ipath_pioavailshadow[i]) | ||
1459 | ipath_dbg("shadow[%d] was %Lx, now %lx\n", | ||
1460 | i, oldval, dd->ipath_pioavailshadow[i]); | ||
1461 | } | ||
1462 | spin_unlock_irqrestore(&ipath_pioavail_lock, flags); | ||
1463 | } | ||
1464 | |||
1431 | /** | 1465 | /** |
1432 | * ipath_setrcvhdrsize - set the receive header size | 1466 | * ipath_setrcvhdrsize - set the receive header size |
1433 | * @dd: the infinipath device | 1467 | * @dd: the infinipath device |
@@ -1482,9 +1516,12 @@ static noinline void no_pio_bufs(struct ipath_devdata *dd) | |||
1482 | */ | 1516 | */ |
1483 | ipath_stats.sps_nopiobufs++; | 1517 | ipath_stats.sps_nopiobufs++; |
1484 | if (!(++dd->ipath_consec_nopiobuf % 100000)) { | 1518 | if (!(++dd->ipath_consec_nopiobuf % 100000)) { |
1485 | ipath_dbg("%u pio sends with no bufavail; dmacopy: " | 1519 | ipath_force_pio_avail_update(dd); /* at start */ |
1486 | "%llx %llx %llx %llx; shadow: %lx %lx %lx %lx\n", | 1520 | ipath_dbg("%u tries no piobufavail ts%lx; dmacopy: " |
1521 | "%llx %llx %llx %llx\n" | ||
1522 | "ipath shadow: %lx %lx %lx %lx\n", | ||
1487 | dd->ipath_consec_nopiobuf, | 1523 | dd->ipath_consec_nopiobuf, |
1524 | (unsigned long)get_cycles(), | ||
1488 | (unsigned long long) le64_to_cpu(dma[0]), | 1525 | (unsigned long long) le64_to_cpu(dma[0]), |
1489 | (unsigned long long) le64_to_cpu(dma[1]), | 1526 | (unsigned long long) le64_to_cpu(dma[1]), |
1490 | (unsigned long long) le64_to_cpu(dma[2]), | 1527 | (unsigned long long) le64_to_cpu(dma[2]), |
@@ -1496,14 +1533,17 @@ static noinline void no_pio_bufs(struct ipath_devdata *dd) | |||
1496 | */ | 1533 | */ |
1497 | if ((dd->ipath_piobcnt2k + dd->ipath_piobcnt4k) > | 1534 | if ((dd->ipath_piobcnt2k + dd->ipath_piobcnt4k) > |
1498 | (sizeof(shadow[0]) * 4 * 4)) | 1535 | (sizeof(shadow[0]) * 4 * 4)) |
1499 | ipath_dbg("2nd group: dmacopy: %llx %llx " | 1536 | ipath_dbg("2nd group: dmacopy: " |
1500 | "%llx %llx; shadow: %lx %lx %lx %lx\n", | 1537 | "%llx %llx %llx %llx\n" |
1538 | "ipath shadow: %lx %lx %lx %lx\n", | ||
1501 | (unsigned long long)le64_to_cpu(dma[4]), | 1539 | (unsigned long long)le64_to_cpu(dma[4]), |
1502 | (unsigned long long)le64_to_cpu(dma[5]), | 1540 | (unsigned long long)le64_to_cpu(dma[5]), |
1503 | (unsigned long long)le64_to_cpu(dma[6]), | 1541 | (unsigned long long)le64_to_cpu(dma[6]), |
1504 | (unsigned long long)le64_to_cpu(dma[7]), | 1542 | (unsigned long long)le64_to_cpu(dma[7]), |
1505 | shadow[4], shadow[5], shadow[6], | 1543 | shadow[4], shadow[5], shadow[6], shadow[7]); |
1506 | shadow[7]); | 1544 | |
1545 | /* at end, so update likely happened */ | ||
1546 | ipath_reset_availshadow(dd); | ||
1507 | } | 1547 | } |
1508 | } | 1548 | } |
1509 | 1549 | ||
@@ -1652,19 +1692,46 @@ void ipath_chg_pioavailkernel(struct ipath_devdata *dd, unsigned start, | |||
1652 | unsigned len, int avail) | 1692 | unsigned len, int avail) |
1653 | { | 1693 | { |
1654 | unsigned long flags; | 1694 | unsigned long flags; |
1655 | unsigned end; | 1695 | unsigned end, cnt = 0, next; |
1656 | 1696 | ||
1657 | /* There are two bits per send buffer (busy and generation) */ | 1697 | /* There are two bits per send buffer (busy and generation) */ |
1658 | start *= 2; | 1698 | start *= 2; |
1659 | len *= 2; | 1699 | end = start + len * 2; |
1660 | end = start + len; | ||
1661 | 1700 | ||
1662 | /* Set or clear the generation bits. */ | ||
1663 | spin_lock_irqsave(&ipath_pioavail_lock, flags); | 1701 | spin_lock_irqsave(&ipath_pioavail_lock, flags); |
1702 | /* Set or clear the busy bit in the shadow. */ | ||
1664 | while (start < end) { | 1703 | while (start < end) { |
1665 | if (avail) { | 1704 | if (avail) { |
1666 | __clear_bit(start + INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT, | 1705 | unsigned long dma; |
1667 | dd->ipath_pioavailshadow); | 1706 | int i, im; |
1707 | /* | ||
1708 | * the BUSY bit will never be set, because we disarm | ||
1709 | * the user buffers before we hand them back to the | ||
1710 | * kernel. We do have to make sure the generation | ||
1711 | * bit is set correctly in shadow, since it could | ||
1712 | * have changed many times while allocated to user. | ||
1713 | * We can't use the bitmap functions on the full | ||
1714 | * dma array because it is always little-endian, so | ||
1715 | * we have to flip to host-order first. | ||
1716 | * BITS_PER_LONG is slightly wrong, since it's | ||
1717 | * always 64 bits per register in chip... | ||
1718 | * We only work on 64 bit kernels, so that's OK. | ||
1719 | */ | ||
1720 | /* deal with 6110 chip bug on high register #s */ | ||
1721 | i = start / BITS_PER_LONG; | ||
1722 | im = (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS)) ? | ||
1723 | i ^ 1 : i; | ||
1724 | __clear_bit(INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT | ||
1725 | + start, dd->ipath_pioavailshadow); | ||
1726 | dma = (unsigned long) le64_to_cpu( | ||
1727 | dd->ipath_pioavailregs_dma[im]); | ||
1728 | if (test_bit((INFINIPATH_SENDPIOAVAIL_CHECK_SHIFT | ||
1729 | + start) % BITS_PER_LONG, &dma)) | ||
1730 | __set_bit(INFINIPATH_SENDPIOAVAIL_CHECK_SHIFT | ||
1731 | + start, dd->ipath_pioavailshadow); | ||
1732 | else | ||
1733 | __clear_bit(INFINIPATH_SENDPIOAVAIL_CHECK_SHIFT | ||
1734 | + start, dd->ipath_pioavailshadow); | ||
1668 | __set_bit(start, dd->ipath_pioavailkernel); | 1735 | __set_bit(start, dd->ipath_pioavailkernel); |
1669 | } else { | 1736 | } else { |
1670 | __set_bit(start + INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT, | 1737 | __set_bit(start + INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT, |
@@ -1673,7 +1740,44 @@ void ipath_chg_pioavailkernel(struct ipath_devdata *dd, unsigned start, | |||
1673 | } | 1740 | } |
1674 | start += 2; | 1741 | start += 2; |
1675 | } | 1742 | } |
1743 | |||
1744 | if (dd->ipath_pioupd_thresh) { | ||
1745 | end = 2 * (dd->ipath_piobcnt2k + dd->ipath_piobcnt4k); | ||
1746 | next = find_first_bit(dd->ipath_pioavailkernel, end); | ||
1747 | while (next < end) { | ||
1748 | cnt++; | ||
1749 | next = find_next_bit(dd->ipath_pioavailkernel, end, | ||
1750 | next + 1); | ||
1751 | } | ||
1752 | } | ||
1676 | spin_unlock_irqrestore(&ipath_pioavail_lock, flags); | 1753 | spin_unlock_irqrestore(&ipath_pioavail_lock, flags); |
1754 | |||
1755 | /* | ||
1756 | * When moving buffers from kernel to user, if number assigned to | ||
1757 | * the user is less than the pio update threshold, and threshold | ||
1758 | * is supported (cnt was computed > 0), drop the update threshold | ||
1759 | * so we update at least once per allocated number of buffers. | ||
1760 | * In any case, if the kernel buffers are less than the threshold, | ||
1761 | * drop the threshold. We don't bother increasing it, having once | ||
1762 | * decreased it, since it would typically just cycle back and forth. | ||
1763 | * If we don't decrease below buffers in use, we can wait a long | ||
1764 | * time for an update, until some other context uses PIO buffers. | ||
1765 | */ | ||
1766 | if (!avail && len < cnt) | ||
1767 | cnt = len; | ||
1768 | if (cnt < dd->ipath_pioupd_thresh) { | ||
1769 | dd->ipath_pioupd_thresh = cnt; | ||
1770 | ipath_dbg("Decreased pio update threshold to %u\n", | ||
1771 | dd->ipath_pioupd_thresh); | ||
1772 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | ||
1773 | dd->ipath_sendctrl &= ~(INFINIPATH_S_UPDTHRESH_MASK | ||
1774 | << INFINIPATH_S_UPDTHRESH_SHIFT); | ||
1775 | dd->ipath_sendctrl |= dd->ipath_pioupd_thresh | ||
1776 | << INFINIPATH_S_UPDTHRESH_SHIFT; | ||
1777 | ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, | ||
1778 | dd->ipath_sendctrl); | ||
1779 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); | ||
1780 | } | ||
1677 | } | 1781 | } |
1678 | 1782 | ||
1679 | /** | 1783 | /** |
@@ -1790,12 +1894,12 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl) | |||
1790 | */ | 1894 | */ |
1791 | if (dd->ipath_flags & IPATH_HAS_SEND_DMA) { | 1895 | if (dd->ipath_flags & IPATH_HAS_SEND_DMA) { |
1792 | int skip_cancel; | 1896 | int skip_cancel; |
1793 | u64 *statp = &dd->ipath_sdma_status; | 1897 | unsigned long *statp = &dd->ipath_sdma_status; |
1794 | 1898 | ||
1795 | spin_lock_irqsave(&dd->ipath_sdma_lock, flags); | 1899 | spin_lock_irqsave(&dd->ipath_sdma_lock, flags); |
1796 | skip_cancel = | 1900 | skip_cancel = |
1797 | !test_bit(IPATH_SDMA_DISABLED, statp) && | 1901 | test_and_set_bit(IPATH_SDMA_ABORTING, statp) |
1798 | test_and_set_bit(IPATH_SDMA_ABORTING, statp); | 1902 | && !test_bit(IPATH_SDMA_DISABLED, statp); |
1799 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); | 1903 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); |
1800 | if (skip_cancel) | 1904 | if (skip_cancel) |
1801 | goto bail; | 1905 | goto bail; |
@@ -1826,6 +1930,9 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl) | |||
1826 | ipath_disarm_piobufs(dd, 0, | 1930 | ipath_disarm_piobufs(dd, 0, |
1827 | dd->ipath_piobcnt2k + dd->ipath_piobcnt4k); | 1931 | dd->ipath_piobcnt2k + dd->ipath_piobcnt4k); |
1828 | 1932 | ||
1933 | if (dd->ipath_flags & IPATH_HAS_SEND_DMA) | ||
1934 | set_bit(IPATH_SDMA_DISARMED, &dd->ipath_sdma_status); | ||
1935 | |||
1829 | if (restore_sendctrl) { | 1936 | if (restore_sendctrl) { |
1830 | /* else done by caller later if needed */ | 1937 | /* else done by caller later if needed */ |
1831 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | 1938 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); |
@@ -1845,7 +1952,6 @@ void ipath_cancel_sends(struct ipath_devdata *dd, int restore_sendctrl) | |||
1845 | /* only wait so long for intr */ | 1952 | /* only wait so long for intr */ |
1846 | dd->ipath_sdma_abort_intr_timeout = jiffies + HZ; | 1953 | dd->ipath_sdma_abort_intr_timeout = jiffies + HZ; |
1847 | dd->ipath_sdma_reset_wait = 200; | 1954 | dd->ipath_sdma_reset_wait = 200; |
1848 | __set_bit(IPATH_SDMA_DISARMED, &dd->ipath_sdma_status); | ||
1849 | if (!test_bit(IPATH_SDMA_SHUTDOWN, &dd->ipath_sdma_status)) | 1955 | if (!test_bit(IPATH_SDMA_SHUTDOWN, &dd->ipath_sdma_status)) |
1850 | tasklet_hi_schedule(&dd->ipath_sdma_abort_task); | 1956 | tasklet_hi_schedule(&dd->ipath_sdma_abort_task); |
1851 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); | 1957 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); |
@@ -2510,7 +2616,7 @@ int ipath_reset_device(int unit) | |||
2510 | ipath_dbg("unit %u port %d is in use " | 2616 | ipath_dbg("unit %u port %d is in use " |
2511 | "(PID %u cmd %s), can't reset\n", | 2617 | "(PID %u cmd %s), can't reset\n", |
2512 | unit, i, | 2618 | unit, i, |
2513 | dd->ipath_pd[i]->port_pid, | 2619 | pid_nr(dd->ipath_pd[i]->port_pid), |
2514 | dd->ipath_pd[i]->port_comm); | 2620 | dd->ipath_pd[i]->port_comm); |
2515 | ret = -EBUSY; | 2621 | ret = -EBUSY; |
2516 | goto bail; | 2622 | goto bail; |
@@ -2548,19 +2654,21 @@ bail: | |||
2548 | static int ipath_signal_procs(struct ipath_devdata *dd, int sig) | 2654 | static int ipath_signal_procs(struct ipath_devdata *dd, int sig) |
2549 | { | 2655 | { |
2550 | int i, sub, any = 0; | 2656 | int i, sub, any = 0; |
2551 | pid_t pid; | 2657 | struct pid *pid; |
2552 | 2658 | ||
2553 | if (!dd->ipath_pd) | 2659 | if (!dd->ipath_pd) |
2554 | return 0; | 2660 | return 0; |
2555 | for (i = 1; i < dd->ipath_cfgports; i++) { | 2661 | for (i = 1; i < dd->ipath_cfgports; i++) { |
2556 | if (!dd->ipath_pd[i] || !dd->ipath_pd[i]->port_cnt || | 2662 | if (!dd->ipath_pd[i] || !dd->ipath_pd[i]->port_cnt) |
2557 | !dd->ipath_pd[i]->port_pid) | ||
2558 | continue; | 2663 | continue; |
2559 | pid = dd->ipath_pd[i]->port_pid; | 2664 | pid = dd->ipath_pd[i]->port_pid; |
2665 | if (!pid) | ||
2666 | continue; | ||
2667 | |||
2560 | dev_info(&dd->pcidev->dev, "context %d in use " | 2668 | dev_info(&dd->pcidev->dev, "context %d in use " |
2561 | "(PID %u), sending signal %d\n", | 2669 | "(PID %u), sending signal %d\n", |
2562 | i, pid, sig); | 2670 | i, pid_nr(pid), sig); |
2563 | kill_proc(pid, sig, 1); | 2671 | kill_pid(pid, sig, 1); |
2564 | any++; | 2672 | any++; |
2565 | for (sub = 0; sub < INFINIPATH_MAX_SUBPORT; sub++) { | 2673 | for (sub = 0; sub < INFINIPATH_MAX_SUBPORT; sub++) { |
2566 | pid = dd->ipath_pd[i]->port_subpid[sub]; | 2674 | pid = dd->ipath_pd[i]->port_subpid[sub]; |
@@ -2568,8 +2676,8 @@ static int ipath_signal_procs(struct ipath_devdata *dd, int sig) | |||
2568 | continue; | 2676 | continue; |
2569 | dev_info(&dd->pcidev->dev, "sub-context " | 2677 | dev_info(&dd->pcidev->dev, "sub-context " |
2570 | "%d:%d in use (PID %u), sending " | 2678 | "%d:%d in use (PID %u), sending " |
2571 | "signal %d\n", i, sub, pid, sig); | 2679 | "signal %d\n", i, sub, pid_nr(pid), sig); |
2572 | kill_proc(pid, sig, 1); | 2680 | kill_pid(pid, sig, 1); |
2573 | any++; | 2681 | any++; |
2574 | } | 2682 | } |
2575 | } | 2683 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c index 8b1752202e78..b472b15637f0 100644 --- a/drivers/infiniband/hw/ipath/ipath_file_ops.c +++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c | |||
@@ -173,47 +173,25 @@ static int ipath_get_base_info(struct file *fp, | |||
173 | (void *) dd->ipath_statusp - | 173 | (void *) dd->ipath_statusp - |
174 | (void *) dd->ipath_pioavailregs_dma; | 174 | (void *) dd->ipath_pioavailregs_dma; |
175 | if (!shared) { | 175 | if (!shared) { |
176 | kinfo->spi_piocnt = dd->ipath_pbufsport; | 176 | kinfo->spi_piocnt = pd->port_piocnt; |
177 | kinfo->spi_piobufbase = (u64) pd->port_piobufs; | 177 | kinfo->spi_piobufbase = (u64) pd->port_piobufs; |
178 | kinfo->__spi_uregbase = (u64) dd->ipath_uregbase + | 178 | kinfo->__spi_uregbase = (u64) dd->ipath_uregbase + |
179 | dd->ipath_ureg_align * pd->port_port; | 179 | dd->ipath_ureg_align * pd->port_port; |
180 | } else if (master) { | 180 | } else if (master) { |
181 | kinfo->spi_piocnt = (dd->ipath_pbufsport / subport_cnt) + | 181 | kinfo->spi_piocnt = (pd->port_piocnt / subport_cnt) + |
182 | (dd->ipath_pbufsport % subport_cnt); | 182 | (pd->port_piocnt % subport_cnt); |
183 | /* Master's PIO buffers are after all the slave's */ | 183 | /* Master's PIO buffers are after all the slave's */ |
184 | kinfo->spi_piobufbase = (u64) pd->port_piobufs + | 184 | kinfo->spi_piobufbase = (u64) pd->port_piobufs + |
185 | dd->ipath_palign * | 185 | dd->ipath_palign * |
186 | (dd->ipath_pbufsport - kinfo->spi_piocnt); | 186 | (pd->port_piocnt - kinfo->spi_piocnt); |
187 | } else { | 187 | } else { |
188 | unsigned slave = subport_fp(fp) - 1; | 188 | unsigned slave = subport_fp(fp) - 1; |
189 | 189 | ||
190 | kinfo->spi_piocnt = dd->ipath_pbufsport / subport_cnt; | 190 | kinfo->spi_piocnt = pd->port_piocnt / subport_cnt; |
191 | kinfo->spi_piobufbase = (u64) pd->port_piobufs + | 191 | kinfo->spi_piobufbase = (u64) pd->port_piobufs + |
192 | dd->ipath_palign * kinfo->spi_piocnt * slave; | 192 | dd->ipath_palign * kinfo->spi_piocnt * slave; |
193 | } | 193 | } |
194 | 194 | ||
195 | /* | ||
196 | * Set the PIO avail update threshold to no larger | ||
197 | * than the number of buffers per process. Note that | ||
198 | * we decrease it here, but won't ever increase it. | ||
199 | */ | ||
200 | if (dd->ipath_pioupd_thresh && | ||
201 | kinfo->spi_piocnt < dd->ipath_pioupd_thresh) { | ||
202 | unsigned long flags; | ||
203 | |||
204 | dd->ipath_pioupd_thresh = kinfo->spi_piocnt; | ||
205 | ipath_dbg("Decreased pio update threshold to %u\n", | ||
206 | dd->ipath_pioupd_thresh); | ||
207 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | ||
208 | dd->ipath_sendctrl &= ~(INFINIPATH_S_UPDTHRESH_MASK | ||
209 | << INFINIPATH_S_UPDTHRESH_SHIFT); | ||
210 | dd->ipath_sendctrl |= dd->ipath_pioupd_thresh | ||
211 | << INFINIPATH_S_UPDTHRESH_SHIFT; | ||
212 | ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, | ||
213 | dd->ipath_sendctrl); | ||
214 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); | ||
215 | } | ||
216 | |||
217 | if (shared) { | 195 | if (shared) { |
218 | kinfo->spi_port_uregbase = (u64) dd->ipath_uregbase + | 196 | kinfo->spi_port_uregbase = (u64) dd->ipath_uregbase + |
219 | dd->ipath_ureg_align * pd->port_port; | 197 | dd->ipath_ureg_align * pd->port_port; |
@@ -577,7 +555,7 @@ static int ipath_tid_free(struct ipath_portdata *pd, unsigned subport, | |||
577 | p = dd->ipath_pageshadow[porttid + tid]; | 555 | p = dd->ipath_pageshadow[porttid + tid]; |
578 | dd->ipath_pageshadow[porttid + tid] = NULL; | 556 | dd->ipath_pageshadow[porttid + tid] = NULL; |
579 | ipath_cdbg(VERBOSE, "PID %u freeing TID %u\n", | 557 | ipath_cdbg(VERBOSE, "PID %u freeing TID %u\n", |
580 | pd->port_pid, tid); | 558 | pid_nr(pd->port_pid), tid); |
581 | dd->ipath_f_put_tid(dd, &tidbase[tid], | 559 | dd->ipath_f_put_tid(dd, &tidbase[tid], |
582 | RCVHQ_RCV_TYPE_EXPECTED, | 560 | RCVHQ_RCV_TYPE_EXPECTED, |
583 | dd->ipath_tidinvalid); | 561 | dd->ipath_tidinvalid); |
@@ -1309,19 +1287,19 @@ static int ipath_mmap(struct file *fp, struct vm_area_struct *vma) | |||
1309 | ureg = dd->ipath_uregbase + dd->ipath_ureg_align * pd->port_port; | 1287 | ureg = dd->ipath_uregbase + dd->ipath_ureg_align * pd->port_port; |
1310 | if (!pd->port_subport_cnt) { | 1288 | if (!pd->port_subport_cnt) { |
1311 | /* port is not shared */ | 1289 | /* port is not shared */ |
1312 | piocnt = dd->ipath_pbufsport; | 1290 | piocnt = pd->port_piocnt; |
1313 | piobufs = pd->port_piobufs; | 1291 | piobufs = pd->port_piobufs; |
1314 | } else if (!subport_fp(fp)) { | 1292 | } else if (!subport_fp(fp)) { |
1315 | /* caller is the master */ | 1293 | /* caller is the master */ |
1316 | piocnt = (dd->ipath_pbufsport / pd->port_subport_cnt) + | 1294 | piocnt = (pd->port_piocnt / pd->port_subport_cnt) + |
1317 | (dd->ipath_pbufsport % pd->port_subport_cnt); | 1295 | (pd->port_piocnt % pd->port_subport_cnt); |
1318 | piobufs = pd->port_piobufs + | 1296 | piobufs = pd->port_piobufs + |
1319 | dd->ipath_palign * (dd->ipath_pbufsport - piocnt); | 1297 | dd->ipath_palign * (pd->port_piocnt - piocnt); |
1320 | } else { | 1298 | } else { |
1321 | unsigned slave = subport_fp(fp) - 1; | 1299 | unsigned slave = subport_fp(fp) - 1; |
1322 | 1300 | ||
1323 | /* caller is a slave */ | 1301 | /* caller is a slave */ |
1324 | piocnt = dd->ipath_pbufsport / pd->port_subport_cnt; | 1302 | piocnt = pd->port_piocnt / pd->port_subport_cnt; |
1325 | piobufs = pd->port_piobufs + dd->ipath_palign * piocnt * slave; | 1303 | piobufs = pd->port_piobufs + dd->ipath_palign * piocnt * slave; |
1326 | } | 1304 | } |
1327 | 1305 | ||
@@ -1631,11 +1609,8 @@ static int try_alloc_port(struct ipath_devdata *dd, int port, | |||
1631 | port); | 1609 | port); |
1632 | pd->port_cnt = 1; | 1610 | pd->port_cnt = 1; |
1633 | port_fp(fp) = pd; | 1611 | port_fp(fp) = pd; |
1634 | pd->port_pid = current->pid; | 1612 | pd->port_pid = get_pid(task_pid(current)); |
1635 | strncpy(pd->port_comm, current->comm, sizeof(pd->port_comm)); | 1613 | strncpy(pd->port_comm, current->comm, sizeof(pd->port_comm)); |
1636 | ipath_chg_pioavailkernel(dd, | ||
1637 | dd->ipath_pbufsport * (pd->port_port - 1), | ||
1638 | dd->ipath_pbufsport, 0); | ||
1639 | ipath_stats.sps_ports++; | 1614 | ipath_stats.sps_ports++; |
1640 | ret = 0; | 1615 | ret = 0; |
1641 | } else | 1616 | } else |
@@ -1818,14 +1793,15 @@ static int find_shared_port(struct file *fp, | |||
1818 | } | 1793 | } |
1819 | port_fp(fp) = pd; | 1794 | port_fp(fp) = pd; |
1820 | subport_fp(fp) = pd->port_cnt++; | 1795 | subport_fp(fp) = pd->port_cnt++; |
1821 | pd->port_subpid[subport_fp(fp)] = current->pid; | 1796 | pd->port_subpid[subport_fp(fp)] = |
1797 | get_pid(task_pid(current)); | ||
1822 | tidcursor_fp(fp) = 0; | 1798 | tidcursor_fp(fp) = 0; |
1823 | pd->active_slaves |= 1 << subport_fp(fp); | 1799 | pd->active_slaves |= 1 << subport_fp(fp); |
1824 | ipath_cdbg(PROC, | 1800 | ipath_cdbg(PROC, |
1825 | "%s[%u] %u sharing %s[%u] unit:port %u:%u\n", | 1801 | "%s[%u] %u sharing %s[%u] unit:port %u:%u\n", |
1826 | current->comm, current->pid, | 1802 | current->comm, current->pid, |
1827 | subport_fp(fp), | 1803 | subport_fp(fp), |
1828 | pd->port_comm, pd->port_pid, | 1804 | pd->port_comm, pid_nr(pd->port_pid), |
1829 | dd->ipath_unit, pd->port_port); | 1805 | dd->ipath_unit, pd->port_port); |
1830 | ret = 1; | 1806 | ret = 1; |
1831 | goto done; | 1807 | goto done; |
@@ -1938,11 +1914,25 @@ static int ipath_do_user_init(struct file *fp, | |||
1938 | 1914 | ||
1939 | /* for now we do nothing with rcvhdrcnt: uinfo->spu_rcvhdrcnt */ | 1915 | /* for now we do nothing with rcvhdrcnt: uinfo->spu_rcvhdrcnt */ |
1940 | 1916 | ||
1917 | /* some ports may get extra buffers, calculate that here */ | ||
1918 | if (pd->port_port <= dd->ipath_ports_extrabuf) | ||
1919 | pd->port_piocnt = dd->ipath_pbufsport + 1; | ||
1920 | else | ||
1921 | pd->port_piocnt = dd->ipath_pbufsport; | ||
1922 | |||
1941 | /* for right now, kernel piobufs are at end, so port 1 is at 0 */ | 1923 | /* for right now, kernel piobufs are at end, so port 1 is at 0 */ |
1924 | if (pd->port_port <= dd->ipath_ports_extrabuf) | ||
1925 | pd->port_pio_base = (dd->ipath_pbufsport + 1) | ||
1926 | * (pd->port_port - 1); | ||
1927 | else | ||
1928 | pd->port_pio_base = dd->ipath_ports_extrabuf + | ||
1929 | dd->ipath_pbufsport * (pd->port_port - 1); | ||
1942 | pd->port_piobufs = dd->ipath_piobufbase + | 1930 | pd->port_piobufs = dd->ipath_piobufbase + |
1943 | dd->ipath_pbufsport * (pd->port_port - 1) * dd->ipath_palign; | 1931 | pd->port_pio_base * dd->ipath_palign; |
1944 | ipath_cdbg(VERBOSE, "Set base of piobufs for port %u to 0x%x\n", | 1932 | ipath_cdbg(VERBOSE, "piobuf base for port %u is 0x%x, piocnt %u," |
1945 | pd->port_port, pd->port_piobufs); | 1933 | " first pio %u\n", pd->port_port, pd->port_piobufs, |
1934 | pd->port_piocnt, pd->port_pio_base); | ||
1935 | ipath_chg_pioavailkernel(dd, pd->port_pio_base, pd->port_piocnt, 0); | ||
1946 | 1936 | ||
1947 | /* | 1937 | /* |
1948 | * Now allocate the rcvhdr Q and eager TIDs; skip the TID | 1938 | * Now allocate the rcvhdr Q and eager TIDs; skip the TID |
@@ -2077,7 +2067,8 @@ static int ipath_close(struct inode *in, struct file *fp) | |||
2077 | * the slave(s) don't wait for receive data forever. | 2067 | * the slave(s) don't wait for receive data forever. |
2078 | */ | 2068 | */ |
2079 | pd->active_slaves &= ~(1 << fd->subport); | 2069 | pd->active_slaves &= ~(1 << fd->subport); |
2080 | pd->port_subpid[fd->subport] = 0; | 2070 | put_pid(pd->port_subpid[fd->subport]); |
2071 | pd->port_subpid[fd->subport] = NULL; | ||
2081 | mutex_unlock(&ipath_mutex); | 2072 | mutex_unlock(&ipath_mutex); |
2082 | goto bail; | 2073 | goto bail; |
2083 | } | 2074 | } |
@@ -2085,7 +2076,7 @@ static int ipath_close(struct inode *in, struct file *fp) | |||
2085 | 2076 | ||
2086 | if (pd->port_hdrqfull) { | 2077 | if (pd->port_hdrqfull) { |
2087 | ipath_cdbg(PROC, "%s[%u] had %u rcvhdrqfull errors " | 2078 | ipath_cdbg(PROC, "%s[%u] had %u rcvhdrqfull errors " |
2088 | "during run\n", pd->port_comm, pd->port_pid, | 2079 | "during run\n", pd->port_comm, pid_nr(pd->port_pid), |
2089 | pd->port_hdrqfull); | 2080 | pd->port_hdrqfull); |
2090 | pd->port_hdrqfull = 0; | 2081 | pd->port_hdrqfull = 0; |
2091 | } | 2082 | } |
@@ -2107,7 +2098,6 @@ static int ipath_close(struct inode *in, struct file *fp) | |||
2107 | } | 2098 | } |
2108 | 2099 | ||
2109 | if (dd->ipath_kregbase) { | 2100 | if (dd->ipath_kregbase) { |
2110 | int i; | ||
2111 | /* atomically clear receive enable port and intr avail. */ | 2101 | /* atomically clear receive enable port and intr avail. */ |
2112 | clear_bit(dd->ipath_r_portenable_shift + port, | 2102 | clear_bit(dd->ipath_r_portenable_shift + port, |
2113 | &dd->ipath_rcvctrl); | 2103 | &dd->ipath_rcvctrl); |
@@ -2136,9 +2126,9 @@ static int ipath_close(struct inode *in, struct file *fp) | |||
2136 | ipath_write_kreg_port(dd, dd->ipath_kregs->kr_rcvhdraddr, | 2126 | ipath_write_kreg_port(dd, dd->ipath_kregs->kr_rcvhdraddr, |
2137 | pd->port_port, dd->ipath_dummy_hdrq_phys); | 2127 | pd->port_port, dd->ipath_dummy_hdrq_phys); |
2138 | 2128 | ||
2139 | i = dd->ipath_pbufsport * (port - 1); | 2129 | ipath_disarm_piobufs(dd, pd->port_pio_base, pd->port_piocnt); |
2140 | ipath_disarm_piobufs(dd, i, dd->ipath_pbufsport); | 2130 | ipath_chg_pioavailkernel(dd, pd->port_pio_base, |
2141 | ipath_chg_pioavailkernel(dd, i, dd->ipath_pbufsport, 1); | 2131 | pd->port_piocnt, 1); |
2142 | 2132 | ||
2143 | dd->ipath_f_clear_tids(dd, pd->port_port); | 2133 | dd->ipath_f_clear_tids(dd, pd->port_port); |
2144 | 2134 | ||
@@ -2146,11 +2136,12 @@ static int ipath_close(struct inode *in, struct file *fp) | |||
2146 | unlock_expected_tids(pd); | 2136 | unlock_expected_tids(pd); |
2147 | ipath_stats.sps_ports--; | 2137 | ipath_stats.sps_ports--; |
2148 | ipath_cdbg(PROC, "%s[%u] closed port %u:%u\n", | 2138 | ipath_cdbg(PROC, "%s[%u] closed port %u:%u\n", |
2149 | pd->port_comm, pd->port_pid, | 2139 | pd->port_comm, pid_nr(pd->port_pid), |
2150 | dd->ipath_unit, port); | 2140 | dd->ipath_unit, port); |
2151 | } | 2141 | } |
2152 | 2142 | ||
2153 | pd->port_pid = 0; | 2143 | put_pid(pd->port_pid); |
2144 | pd->port_pid = NULL; | ||
2154 | dd->ipath_pd[pd->port_port] = NULL; /* before releasing mutex */ | 2145 | dd->ipath_pd[pd->port_port] = NULL; /* before releasing mutex */ |
2155 | mutex_unlock(&ipath_mutex); | 2146 | mutex_unlock(&ipath_mutex); |
2156 | ipath_free_pddata(dd, pd); /* after releasing the mutex */ | 2147 | ipath_free_pddata(dd, pd); /* after releasing the mutex */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba7220.c b/drivers/infiniband/hw/ipath/ipath_iba7220.c index e3ec0d1bdf50..8eee7830f042 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba7220.c +++ b/drivers/infiniband/hw/ipath/ipath_iba7220.c | |||
@@ -595,7 +595,7 @@ static void ipath_7220_txe_recover(struct ipath_devdata *dd) | |||
595 | 595 | ||
596 | dev_info(&dd->pcidev->dev, | 596 | dev_info(&dd->pcidev->dev, |
597 | "Recovering from TXE PIO parity error\n"); | 597 | "Recovering from TXE PIO parity error\n"); |
598 | ipath_disarm_senderrbufs(dd, 1); | 598 | ipath_disarm_senderrbufs(dd); |
599 | } | 599 | } |
600 | 600 | ||
601 | 601 | ||
@@ -675,10 +675,8 @@ static void ipath_7220_handle_hwerrors(struct ipath_devdata *dd, char *msg, | |||
675 | ctrl = ipath_read_kreg32(dd, dd->ipath_kregs->kr_control); | 675 | ctrl = ipath_read_kreg32(dd, dd->ipath_kregs->kr_control); |
676 | if ((ctrl & INFINIPATH_C_FREEZEMODE) && !ipath_diag_inuse) { | 676 | if ((ctrl & INFINIPATH_C_FREEZEMODE) && !ipath_diag_inuse) { |
677 | /* | 677 | /* |
678 | * Parity errors in send memory are recoverable, | 678 | * Parity errors in send memory are recoverable by h/w |
679 | * just cancel the send (if indicated in * sendbuffererror), | 679 | * just do housekeeping, exit freeze mode and continue. |
680 | * count the occurrence, unfreeze (if no other handled | ||
681 | * hardware error bits are set), and continue. | ||
682 | */ | 680 | */ |
683 | if (hwerrs & ((INFINIPATH_HWE_TXEMEMPARITYERR_PIOBUF | | 681 | if (hwerrs & ((INFINIPATH_HWE_TXEMEMPARITYERR_PIOBUF | |
684 | INFINIPATH_HWE_TXEMEMPARITYERR_PIOPBC) | 682 | INFINIPATH_HWE_TXEMEMPARITYERR_PIOPBC) |
@@ -687,13 +685,6 @@ static void ipath_7220_handle_hwerrors(struct ipath_devdata *dd, char *msg, | |||
687 | hwerrs &= ~((INFINIPATH_HWE_TXEMEMPARITYERR_PIOBUF | | 685 | hwerrs &= ~((INFINIPATH_HWE_TXEMEMPARITYERR_PIOBUF | |
688 | INFINIPATH_HWE_TXEMEMPARITYERR_PIOPBC) | 686 | INFINIPATH_HWE_TXEMEMPARITYERR_PIOPBC) |
689 | << INFINIPATH_HWE_TXEMEMPARITYERR_SHIFT); | 687 | << INFINIPATH_HWE_TXEMEMPARITYERR_SHIFT); |
690 | if (!hwerrs) { | ||
691 | /* else leave in freeze mode */ | ||
692 | ipath_write_kreg(dd, | ||
693 | dd->ipath_kregs->kr_control, | ||
694 | dd->ipath_control); | ||
695 | goto bail; | ||
696 | } | ||
697 | } | 688 | } |
698 | if (hwerrs) { | 689 | if (hwerrs) { |
699 | /* | 690 | /* |
@@ -723,8 +714,8 @@ static void ipath_7220_handle_hwerrors(struct ipath_devdata *dd, char *msg, | |||
723 | *dd->ipath_statusp |= IPATH_STATUS_HWERROR; | 714 | *dd->ipath_statusp |= IPATH_STATUS_HWERROR; |
724 | dd->ipath_flags &= ~IPATH_INITTED; | 715 | dd->ipath_flags &= ~IPATH_INITTED; |
725 | } else { | 716 | } else { |
726 | ipath_dbg("Clearing freezemode on ignored hardware " | 717 | ipath_dbg("Clearing freezemode on ignored or " |
727 | "error\n"); | 718 | "recovered hardware error\n"); |
728 | ipath_clear_freeze(dd); | 719 | ipath_clear_freeze(dd); |
729 | } | 720 | } |
730 | } | 721 | } |
@@ -870,8 +861,9 @@ static int ipath_7220_boardname(struct ipath_devdata *dd, char *name, | |||
870 | "revision %u.%u!\n", | 861 | "revision %u.%u!\n", |
871 | dd->ipath_majrev, dd->ipath_minrev); | 862 | dd->ipath_majrev, dd->ipath_minrev); |
872 | ret = 1; | 863 | ret = 1; |
873 | } else if (dd->ipath_minrev == 1) { | 864 | } else if (dd->ipath_minrev == 1 && |
874 | /* Rev1 chips are prototype. Complain, but allow use */ | 865 | !(dd->ipath_flags & IPATH_INITTED)) { |
866 | /* Rev1 chips are prototype. Complain at init, but allow use */ | ||
875 | ipath_dev_err(dd, "Unsupported hardware " | 867 | ipath_dev_err(dd, "Unsupported hardware " |
876 | "revision %u.%u, Contact support@qlogic.com\n", | 868 | "revision %u.%u, Contact support@qlogic.com\n", |
877 | dd->ipath_majrev, dd->ipath_minrev); | 869 | dd->ipath_majrev, dd->ipath_minrev); |
@@ -1966,7 +1958,7 @@ static void ipath_7220_config_ports(struct ipath_devdata *dd, ushort cfgports) | |||
1966 | dd->ipath_rcvctrl); | 1958 | dd->ipath_rcvctrl); |
1967 | dd->ipath_p0_rcvegrcnt = 2048; /* always */ | 1959 | dd->ipath_p0_rcvegrcnt = 2048; /* always */ |
1968 | if (dd->ipath_flags & IPATH_HAS_SEND_DMA) | 1960 | if (dd->ipath_flags & IPATH_HAS_SEND_DMA) |
1969 | dd->ipath_pioreserved = 1; /* reserve a buffer */ | 1961 | dd->ipath_pioreserved = 3; /* kpiobufs used for PIO */ |
1970 | } | 1962 | } |
1971 | 1963 | ||
1972 | 1964 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_init_chip.c b/drivers/infiniband/hw/ipath/ipath_init_chip.c index 27dd89476660..3e5baa43fc82 100644 --- a/drivers/infiniband/hw/ipath/ipath_init_chip.c +++ b/drivers/infiniband/hw/ipath/ipath_init_chip.c | |||
@@ -41,7 +41,7 @@ | |||
41 | /* | 41 | /* |
42 | * min buffers we want to have per port, after driver | 42 | * min buffers we want to have per port, after driver |
43 | */ | 43 | */ |
44 | #define IPATH_MIN_USER_PORT_BUFCNT 8 | 44 | #define IPATH_MIN_USER_PORT_BUFCNT 7 |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * Number of ports we are configured to use (to allow for more pio | 47 | * Number of ports we are configured to use (to allow for more pio |
@@ -54,13 +54,9 @@ MODULE_PARM_DESC(cfgports, "Set max number of ports to use"); | |||
54 | 54 | ||
55 | /* | 55 | /* |
56 | * Number of buffers reserved for driver (verbs and layered drivers.) | 56 | * Number of buffers reserved for driver (verbs and layered drivers.) |
57 | * Reserved at end of buffer list. Initialized based on | 57 | * Initialized based on number of PIO buffers if not set via module interface. |
58 | * number of PIO buffers if not set via module interface. | ||
59 | * The problem with this is that it's global, but we'll use different | 58 | * The problem with this is that it's global, but we'll use different |
60 | * numbers for different chip types. So the default value is not | 59 | * numbers for different chip types. |
61 | * very useful. I've redefined it for the 1.3 release so that it's | ||
62 | * zero unless set by the user to something else, in which case we | ||
63 | * try to respect it. | ||
64 | */ | 60 | */ |
65 | static ushort ipath_kpiobufs; | 61 | static ushort ipath_kpiobufs; |
66 | 62 | ||
@@ -546,9 +542,12 @@ static void enable_chip(struct ipath_devdata *dd, int reinit) | |||
546 | pioavail = dd->ipath_pioavailregs_dma[i ^ 1]; | 542 | pioavail = dd->ipath_pioavailregs_dma[i ^ 1]; |
547 | else | 543 | else |
548 | pioavail = dd->ipath_pioavailregs_dma[i]; | 544 | pioavail = dd->ipath_pioavailregs_dma[i]; |
549 | dd->ipath_pioavailshadow[i] = le64_to_cpu(pioavail) | | 545 | /* |
550 | (~dd->ipath_pioavailkernel[i] << | 546 | * don't need to worry about ipath_pioavailkernel here |
551 | INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT); | 547 | * because we will call ipath_chg_pioavailkernel() later |
548 | * in initialization, to busy out buffers as needed | ||
549 | */ | ||
550 | dd->ipath_pioavailshadow[i] = le64_to_cpu(pioavail); | ||
552 | } | 551 | } |
553 | /* can get counters, stats, etc. */ | 552 | /* can get counters, stats, etc. */ |
554 | dd->ipath_flags |= IPATH_PRESENT; | 553 | dd->ipath_flags |= IPATH_PRESENT; |
@@ -708,12 +707,11 @@ static void verify_interrupt(unsigned long opaque) | |||
708 | int ipath_init_chip(struct ipath_devdata *dd, int reinit) | 707 | int ipath_init_chip(struct ipath_devdata *dd, int reinit) |
709 | { | 708 | { |
710 | int ret = 0; | 709 | int ret = 0; |
711 | u32 val32, kpiobufs; | 710 | u32 kpiobufs, defkbufs; |
712 | u32 piobufs, uports; | 711 | u32 piobufs, uports; |
713 | u64 val; | 712 | u64 val; |
714 | struct ipath_portdata *pd; | 713 | struct ipath_portdata *pd; |
715 | gfp_t gfp_flags = GFP_USER | __GFP_COMP; | 714 | gfp_t gfp_flags = GFP_USER | __GFP_COMP; |
716 | unsigned long flags; | ||
717 | 715 | ||
718 | ret = init_housekeeping(dd, reinit); | 716 | ret = init_housekeeping(dd, reinit); |
719 | if (ret) | 717 | if (ret) |
@@ -753,56 +751,46 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
753 | dd->ipath_pioavregs = ALIGN(piobufs, sizeof(u64) * BITS_PER_BYTE / 2) | 751 | dd->ipath_pioavregs = ALIGN(piobufs, sizeof(u64) * BITS_PER_BYTE / 2) |
754 | / (sizeof(u64) * BITS_PER_BYTE / 2); | 752 | / (sizeof(u64) * BITS_PER_BYTE / 2); |
755 | uports = dd->ipath_cfgports ? dd->ipath_cfgports - 1 : 0; | 753 | uports = dd->ipath_cfgports ? dd->ipath_cfgports - 1 : 0; |
756 | if (ipath_kpiobufs == 0) { | 754 | if (piobufs > 144) |
757 | /* not set by user (this is default) */ | 755 | defkbufs = 32 + dd->ipath_pioreserved; |
758 | if (piobufs > 144) | ||
759 | kpiobufs = 32; | ||
760 | else | ||
761 | kpiobufs = 16; | ||
762 | } | ||
763 | else | 756 | else |
764 | kpiobufs = ipath_kpiobufs; | 757 | defkbufs = 16 + dd->ipath_pioreserved; |
765 | 758 | ||
766 | if (kpiobufs + (uports * IPATH_MIN_USER_PORT_BUFCNT) > piobufs) { | 759 | if (ipath_kpiobufs && (ipath_kpiobufs + |
760 | (uports * IPATH_MIN_USER_PORT_BUFCNT)) > piobufs) { | ||
767 | int i = (int) piobufs - | 761 | int i = (int) piobufs - |
768 | (int) (uports * IPATH_MIN_USER_PORT_BUFCNT); | 762 | (int) (uports * IPATH_MIN_USER_PORT_BUFCNT); |
769 | if (i < 1) | 763 | if (i < 1) |
770 | i = 1; | 764 | i = 1; |
771 | dev_info(&dd->pcidev->dev, "Allocating %d PIO bufs of " | 765 | dev_info(&dd->pcidev->dev, "Allocating %d PIO bufs of " |
772 | "%d for kernel leaves too few for %d user ports " | 766 | "%d for kernel leaves too few for %d user ports " |
773 | "(%d each); using %u\n", kpiobufs, | 767 | "(%d each); using %u\n", ipath_kpiobufs, |
774 | piobufs, uports, IPATH_MIN_USER_PORT_BUFCNT, i); | 768 | piobufs, uports, IPATH_MIN_USER_PORT_BUFCNT, i); |
775 | /* | 769 | /* |
776 | * shouldn't change ipath_kpiobufs, because could be | 770 | * shouldn't change ipath_kpiobufs, because could be |
777 | * different for different devices... | 771 | * different for different devices... |
778 | */ | 772 | */ |
779 | kpiobufs = i; | 773 | kpiobufs = i; |
780 | } | 774 | } else if (ipath_kpiobufs) |
775 | kpiobufs = ipath_kpiobufs; | ||
776 | else | ||
777 | kpiobufs = defkbufs; | ||
781 | dd->ipath_lastport_piobuf = piobufs - kpiobufs; | 778 | dd->ipath_lastport_piobuf = piobufs - kpiobufs; |
782 | dd->ipath_pbufsport = | 779 | dd->ipath_pbufsport = |
783 | uports ? dd->ipath_lastport_piobuf / uports : 0; | 780 | uports ? dd->ipath_lastport_piobuf / uports : 0; |
784 | val32 = dd->ipath_lastport_piobuf - (dd->ipath_pbufsport * uports); | 781 | /* if not an even divisor, some user ports get extra buffers */ |
785 | if (val32 > 0) { | 782 | dd->ipath_ports_extrabuf = dd->ipath_lastport_piobuf - |
786 | ipath_dbg("allocating %u pbufs/port leaves %u unused, " | 783 | (dd->ipath_pbufsport * uports); |
787 | "add to kernel\n", dd->ipath_pbufsport, val32); | 784 | if (dd->ipath_ports_extrabuf) |
788 | dd->ipath_lastport_piobuf -= val32; | 785 | ipath_dbg("%u pbufs/port leaves some unused, add 1 buffer to " |
789 | kpiobufs += val32; | 786 | "ports <= %u\n", dd->ipath_pbufsport, |
790 | ipath_dbg("%u pbufs/port leaves %u unused, add to kernel\n", | 787 | dd->ipath_ports_extrabuf); |
791 | dd->ipath_pbufsport, val32); | ||
792 | } | ||
793 | dd->ipath_lastpioindex = 0; | 788 | dd->ipath_lastpioindex = 0; |
794 | dd->ipath_lastpioindexl = dd->ipath_piobcnt2k; | 789 | dd->ipath_lastpioindexl = dd->ipath_piobcnt2k; |
795 | ipath_chg_pioavailkernel(dd, 0, piobufs, 1); | 790 | /* ipath_pioavailshadow initialized earlier */ |
796 | ipath_cdbg(VERBOSE, "%d PIO bufs for kernel out of %d total %u " | 791 | ipath_cdbg(VERBOSE, "%d PIO bufs for kernel out of %d total %u " |
797 | "each for %u user ports\n", kpiobufs, | 792 | "each for %u user ports\n", kpiobufs, |
798 | piobufs, dd->ipath_pbufsport, uports); | 793 | piobufs, dd->ipath_pbufsport, uports); |
799 | if (dd->ipath_pioupd_thresh) { | ||
800 | if (dd->ipath_pbufsport < dd->ipath_pioupd_thresh) | ||
801 | dd->ipath_pioupd_thresh = dd->ipath_pbufsport; | ||
802 | if (kpiobufs < dd->ipath_pioupd_thresh) | ||
803 | dd->ipath_pioupd_thresh = kpiobufs; | ||
804 | } | ||
805 | |||
806 | ret = dd->ipath_f_early_init(dd); | 794 | ret = dd->ipath_f_early_init(dd); |
807 | if (ret) { | 795 | if (ret) { |
808 | ipath_dev_err(dd, "Early initialization failure\n"); | 796 | ipath_dev_err(dd, "Early initialization failure\n"); |
@@ -810,13 +798,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
810 | } | 798 | } |
811 | 799 | ||
812 | /* | 800 | /* |
813 | * Cancel any possible active sends from early driver load. | ||
814 | * Follows early_init because some chips have to initialize | ||
815 | * PIO buffers in early_init to avoid false parity errors. | ||
816 | */ | ||
817 | ipath_cancel_sends(dd, 0); | ||
818 | |||
819 | /* | ||
820 | * Early_init sets rcvhdrentsize and rcvhdrsize, so this must be | 801 | * Early_init sets rcvhdrentsize and rcvhdrsize, so this must be |
821 | * done after early_init. | 802 | * done after early_init. |
822 | */ | 803 | */ |
@@ -836,6 +817,7 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
836 | 817 | ||
837 | ipath_write_kreg(dd, dd->ipath_kregs->kr_sendpioavailaddr, | 818 | ipath_write_kreg(dd, dd->ipath_kregs->kr_sendpioavailaddr, |
838 | dd->ipath_pioavailregs_phys); | 819 | dd->ipath_pioavailregs_phys); |
820 | |||
839 | /* | 821 | /* |
840 | * this is to detect s/w errors, which the h/w works around by | 822 | * this is to detect s/w errors, which the h/w works around by |
841 | * ignoring the low 6 bits of address, if it wasn't aligned. | 823 | * ignoring the low 6 bits of address, if it wasn't aligned. |
@@ -862,12 +844,6 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
862 | ~0ULL&~INFINIPATH_HWE_MEMBISTFAILED); | 844 | ~0ULL&~INFINIPATH_HWE_MEMBISTFAILED); |
863 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, 0ULL); | 845 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, 0ULL); |
864 | 846 | ||
865 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | ||
866 | dd->ipath_sendctrl = INFINIPATH_S_PIOENABLE; | ||
867 | ipath_write_kreg(dd, dd->ipath_kregs->kr_sendctrl, dd->ipath_sendctrl); | ||
868 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); | ||
869 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); | ||
870 | |||
871 | /* | 847 | /* |
872 | * before error clears, since we expect serdes pll errors during | 848 | * before error clears, since we expect serdes pll errors during |
873 | * this, the first time after reset | 849 | * this, the first time after reset |
@@ -940,6 +916,19 @@ int ipath_init_chip(struct ipath_devdata *dd, int reinit) | |||
940 | else | 916 | else |
941 | enable_chip(dd, reinit); | 917 | enable_chip(dd, reinit); |
942 | 918 | ||
919 | /* after enable_chip, so pioavailshadow setup */ | ||
920 | ipath_chg_pioavailkernel(dd, 0, piobufs, 1); | ||
921 | |||
922 | /* | ||
923 | * Cancel any possible active sends from early driver load. | ||
924 | * Follows early_init because some chips have to initialize | ||
925 | * PIO buffers in early_init to avoid false parity errors. | ||
926 | * After enable and ipath_chg_pioavailkernel so we can safely | ||
927 | * enable pioavail updates and PIOENABLE; packets are now | ||
928 | * ready to go out. | ||
929 | */ | ||
930 | ipath_cancel_sends(dd, 1); | ||
931 | |||
943 | if (!reinit) { | 932 | if (!reinit) { |
944 | /* | 933 | /* |
945 | * Used when we close a port, for DMA already in flight | 934 | * Used when we close a port, for DMA already in flight |
diff --git a/drivers/infiniband/hw/ipath/ipath_intr.c b/drivers/infiniband/hw/ipath/ipath_intr.c index 1b58f4737c71..26900b3b7a4e 100644 --- a/drivers/infiniband/hw/ipath/ipath_intr.c +++ b/drivers/infiniband/hw/ipath/ipath_intr.c | |||
@@ -38,42 +38,12 @@ | |||
38 | #include "ipath_verbs.h" | 38 | #include "ipath_verbs.h" |
39 | #include "ipath_common.h" | 39 | #include "ipath_common.h" |
40 | 40 | ||
41 | /* | ||
42 | * clear (write) a pio buffer, to clear a parity error. This routine | ||
43 | * should only be called when in freeze mode, and the buffer should be | ||
44 | * canceled afterwards. | ||
45 | */ | ||
46 | static void ipath_clrpiobuf(struct ipath_devdata *dd, u32 pnum) | ||
47 | { | ||
48 | u32 __iomem *pbuf; | ||
49 | u32 dwcnt; /* dword count to write */ | ||
50 | if (pnum < dd->ipath_piobcnt2k) { | ||
51 | pbuf = (u32 __iomem *) (dd->ipath_pio2kbase + pnum * | ||
52 | dd->ipath_palign); | ||
53 | dwcnt = dd->ipath_piosize2k >> 2; | ||
54 | } | ||
55 | else { | ||
56 | pbuf = (u32 __iomem *) (dd->ipath_pio4kbase + | ||
57 | (pnum - dd->ipath_piobcnt2k) * dd->ipath_4kalign); | ||
58 | dwcnt = dd->ipath_piosize4k >> 2; | ||
59 | } | ||
60 | dev_info(&dd->pcidev->dev, | ||
61 | "Rewrite PIO buffer %u, to recover from parity error\n", | ||
62 | pnum); | ||
63 | |||
64 | /* no flush required, since already in freeze */ | ||
65 | writel(dwcnt + 1, pbuf); | ||
66 | while (--dwcnt) | ||
67 | writel(0, pbuf++); | ||
68 | } | ||
69 | 41 | ||
70 | /* | 42 | /* |
71 | * Called when we might have an error that is specific to a particular | 43 | * Called when we might have an error that is specific to a particular |
72 | * PIO buffer, and may need to cancel that buffer, so it can be re-used. | 44 | * PIO buffer, and may need to cancel that buffer, so it can be re-used. |
73 | * If rewrite is true, and bits are set in the sendbufferror registers, | ||
74 | * we'll write to the buffer, for error recovery on parity errors. | ||
75 | */ | 45 | */ |
76 | void ipath_disarm_senderrbufs(struct ipath_devdata *dd, int rewrite) | 46 | void ipath_disarm_senderrbufs(struct ipath_devdata *dd) |
77 | { | 47 | { |
78 | u32 piobcnt; | 48 | u32 piobcnt; |
79 | unsigned long sbuf[4]; | 49 | unsigned long sbuf[4]; |
@@ -109,11 +79,8 @@ void ipath_disarm_senderrbufs(struct ipath_devdata *dd, int rewrite) | |||
109 | } | 79 | } |
110 | 80 | ||
111 | for (i = 0; i < piobcnt; i++) | 81 | for (i = 0; i < piobcnt; i++) |
112 | if (test_bit(i, sbuf)) { | 82 | if (test_bit(i, sbuf)) |
113 | if (rewrite) | ||
114 | ipath_clrpiobuf(dd, i); | ||
115 | ipath_disarm_piobufs(dd, i, 1); | 83 | ipath_disarm_piobufs(dd, i, 1); |
116 | } | ||
117 | /* ignore armlaunch errs for a bit */ | 84 | /* ignore armlaunch errs for a bit */ |
118 | dd->ipath_lastcancel = jiffies+3; | 85 | dd->ipath_lastcancel = jiffies+3; |
119 | } | 86 | } |
@@ -164,7 +131,7 @@ static u64 handle_e_sum_errs(struct ipath_devdata *dd, ipath_err_t errs) | |||
164 | { | 131 | { |
165 | u64 ignore_this_time = 0; | 132 | u64 ignore_this_time = 0; |
166 | 133 | ||
167 | ipath_disarm_senderrbufs(dd, 0); | 134 | ipath_disarm_senderrbufs(dd); |
168 | if ((errs & E_SUM_LINK_PKTERRS) && | 135 | if ((errs & E_SUM_LINK_PKTERRS) && |
169 | !(dd->ipath_flags & IPATH_LINKACTIVE)) { | 136 | !(dd->ipath_flags & IPATH_LINKACTIVE)) { |
170 | /* | 137 | /* |
@@ -909,8 +876,8 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs) | |||
909 | * processes (causing armlaunch), send errors due to going into freeze mode, | 876 | * processes (causing armlaunch), send errors due to going into freeze mode, |
910 | * etc., and try to avoid causing extra interrupts while doing so. | 877 | * etc., and try to avoid causing extra interrupts while doing so. |
911 | * Forcibly update the in-memory pioavail register copies after cleanup | 878 | * Forcibly update the in-memory pioavail register copies after cleanup |
912 | * because the chip won't do it for anything changing while in freeze mode | 879 | * because the chip won't do it while in freeze mode (the register values |
913 | * (we don't want to wait for the next pio buffer state change). | 880 | * themselves are kept correct). |
914 | * Make sure that we don't lose any important interrupts by using the chip | 881 | * Make sure that we don't lose any important interrupts by using the chip |
915 | * feature that says that writing 0 to a bit in *clear that is set in | 882 | * feature that says that writing 0 to a bit in *clear that is set in |
916 | * *status will cause an interrupt to be generated again (if allowed by | 883 | * *status will cause an interrupt to be generated again (if allowed by |
@@ -918,44 +885,23 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs) | |||
918 | */ | 885 | */ |
919 | void ipath_clear_freeze(struct ipath_devdata *dd) | 886 | void ipath_clear_freeze(struct ipath_devdata *dd) |
920 | { | 887 | { |
921 | int i, im; | ||
922 | u64 val; | ||
923 | |||
924 | /* disable error interrupts, to avoid confusion */ | 888 | /* disable error interrupts, to avoid confusion */ |
925 | ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, 0ULL); | 889 | ipath_write_kreg(dd, dd->ipath_kregs->kr_errormask, 0ULL); |
926 | 890 | ||
927 | /* also disable interrupts; errormask is sometimes overwriten */ | 891 | /* also disable interrupts; errormask is sometimes overwriten */ |
928 | ipath_write_kreg(dd, dd->ipath_kregs->kr_intmask, 0ULL); | 892 | ipath_write_kreg(dd, dd->ipath_kregs->kr_intmask, 0ULL); |
929 | 893 | ||
930 | /* | 894 | ipath_cancel_sends(dd, 1); |
931 | * clear all sends, because they have may been | 895 | |
932 | * completed by usercode while in freeze mode, and | 896 | /* clear the freeze, and be sure chip saw it */ |
933 | * therefore would not be sent, and eventually | ||
934 | * might cause the process to run out of bufs | ||
935 | */ | ||
936 | ipath_cancel_sends(dd, 0); | ||
937 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, | 897 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, |
938 | dd->ipath_control); | 898 | dd->ipath_control); |
899 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); | ||
939 | 900 | ||
940 | /* ensure pio avail updates continue */ | 901 | /* force in-memory update now we are out of freeze */ |
941 | ipath_force_pio_avail_update(dd); | 902 | ipath_force_pio_avail_update(dd); |
942 | 903 | ||
943 | /* | 904 | /* |
944 | * We just enabled pioavailupdate, so dma copy is almost certainly | ||
945 | * not yet right, so read the registers directly. Similar to init | ||
946 | */ | ||
947 | for (i = 0; i < dd->ipath_pioavregs; i++) { | ||
948 | /* deal with 6110 chip bug */ | ||
949 | im = (i > 3 && (dd->ipath_flags & IPATH_SWAP_PIOBUFS)) ? | ||
950 | i ^ 1 : i; | ||
951 | val = ipath_read_kreg64(dd, (0x1000 / sizeof(u64)) + im); | ||
952 | dd->ipath_pioavailregs_dma[i] = cpu_to_le64(val); | ||
953 | dd->ipath_pioavailshadow[i] = val | | ||
954 | (~dd->ipath_pioavailkernel[i] << | ||
955 | INFINIPATH_SENDPIOAVAIL_BUSY_SHIFT); | ||
956 | } | ||
957 | |||
958 | /* | ||
959 | * force new interrupt if any hwerr, error or interrupt bits are | 905 | * force new interrupt if any hwerr, error or interrupt bits are |
960 | * still set, and clear "safe" send packet errors related to freeze | 906 | * still set, and clear "safe" send packet errors related to freeze |
961 | * and cancelling sends. Re-enable error interrupts before possible | 907 | * and cancelling sends. Re-enable error interrupts before possible |
@@ -1312,10 +1258,8 @@ irqreturn_t ipath_intr(int irq, void *data) | |||
1312 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); | 1258 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); |
1313 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); | 1259 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); |
1314 | 1260 | ||
1315 | if (!(dd->ipath_flags & IPATH_HAS_SEND_DMA)) | 1261 | /* always process; sdma verbs uses PIO for acks and VL15 */ |
1316 | handle_layer_pioavail(dd); | 1262 | handle_layer_pioavail(dd); |
1317 | else | ||
1318 | ipath_dbg("unexpected BUFAVAIL intr\n"); | ||
1319 | } | 1263 | } |
1320 | 1264 | ||
1321 | ret = IRQ_HANDLED; | 1265 | ret = IRQ_HANDLED; |
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index 202337ae90dc..59a8b254b97f 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
@@ -117,6 +117,10 @@ struct ipath_portdata { | |||
117 | u16 port_subport_cnt; | 117 | u16 port_subport_cnt; |
118 | /* non-zero if port is being shared. */ | 118 | /* non-zero if port is being shared. */ |
119 | u16 port_subport_id; | 119 | u16 port_subport_id; |
120 | /* number of pio bufs for this port (all procs, if shared) */ | ||
121 | u32 port_piocnt; | ||
122 | /* first pio buffer for this port */ | ||
123 | u32 port_pio_base; | ||
120 | /* chip offset of PIO buffers for this port */ | 124 | /* chip offset of PIO buffers for this port */ |
121 | u32 port_piobufs; | 125 | u32 port_piobufs; |
122 | /* how many alloc_pages() chunks in port_rcvegrbuf_pages */ | 126 | /* how many alloc_pages() chunks in port_rcvegrbuf_pages */ |
@@ -155,8 +159,8 @@ struct ipath_portdata { | |||
155 | /* saved total number of polled urgent packets for poll edge trigger */ | 159 | /* saved total number of polled urgent packets for poll edge trigger */ |
156 | u32 port_urgent_poll; | 160 | u32 port_urgent_poll; |
157 | /* pid of process using this port */ | 161 | /* pid of process using this port */ |
158 | pid_t port_pid; | 162 | struct pid *port_pid; |
159 | pid_t port_subpid[INFINIPATH_MAX_SUBPORT]; | 163 | struct pid *port_subpid[INFINIPATH_MAX_SUBPORT]; |
160 | /* same size as task_struct .comm[] */ | 164 | /* same size as task_struct .comm[] */ |
161 | char port_comm[16]; | 165 | char port_comm[16]; |
162 | /* pkeys set by this use of this port */ | 166 | /* pkeys set by this use of this port */ |
@@ -384,6 +388,8 @@ struct ipath_devdata { | |||
384 | u32 ipath_lastrpkts; | 388 | u32 ipath_lastrpkts; |
385 | /* pio bufs allocated per port */ | 389 | /* pio bufs allocated per port */ |
386 | u32 ipath_pbufsport; | 390 | u32 ipath_pbufsport; |
391 | /* if remainder on bufs/port, ports < extrabuf get 1 extra */ | ||
392 | u32 ipath_ports_extrabuf; | ||
387 | u32 ipath_pioupd_thresh; /* update threshold, some chips */ | 393 | u32 ipath_pioupd_thresh; /* update threshold, some chips */ |
388 | /* | 394 | /* |
389 | * number of ports configured as max; zero is set to number chip | 395 | * number of ports configured as max; zero is set to number chip |
@@ -477,7 +483,7 @@ struct ipath_devdata { | |||
477 | 483 | ||
478 | /* SendDMA related entries */ | 484 | /* SendDMA related entries */ |
479 | spinlock_t ipath_sdma_lock; | 485 | spinlock_t ipath_sdma_lock; |
480 | u64 ipath_sdma_status; | 486 | unsigned long ipath_sdma_status; |
481 | unsigned long ipath_sdma_abort_jiffies; | 487 | unsigned long ipath_sdma_abort_jiffies; |
482 | unsigned long ipath_sdma_abort_intr_timeout; | 488 | unsigned long ipath_sdma_abort_intr_timeout; |
483 | unsigned long ipath_sdma_buf_jiffies; | 489 | unsigned long ipath_sdma_buf_jiffies; |
@@ -816,8 +822,8 @@ struct ipath_devdata { | |||
816 | #define IPATH_SDMA_DISARMED 1 | 822 | #define IPATH_SDMA_DISARMED 1 |
817 | #define IPATH_SDMA_DISABLED 2 | 823 | #define IPATH_SDMA_DISABLED 2 |
818 | #define IPATH_SDMA_LAYERBUF 3 | 824 | #define IPATH_SDMA_LAYERBUF 3 |
819 | #define IPATH_SDMA_RUNNING 62 | 825 | #define IPATH_SDMA_RUNNING 30 |
820 | #define IPATH_SDMA_SHUTDOWN 63 | 826 | #define IPATH_SDMA_SHUTDOWN 31 |
821 | 827 | ||
822 | /* bit combinations that correspond to abort states */ | 828 | /* bit combinations that correspond to abort states */ |
823 | #define IPATH_SDMA_ABORT_NONE 0 | 829 | #define IPATH_SDMA_ABORT_NONE 0 |
@@ -1011,7 +1017,7 @@ void ipath_get_eeprom_info(struct ipath_devdata *); | |||
1011 | int ipath_update_eeprom_log(struct ipath_devdata *dd); | 1017 | int ipath_update_eeprom_log(struct ipath_devdata *dd); |
1012 | void ipath_inc_eeprom_err(struct ipath_devdata *dd, u32 eidx, u32 incr); | 1018 | void ipath_inc_eeprom_err(struct ipath_devdata *dd, u32 eidx, u32 incr); |
1013 | u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg); | 1019 | u64 ipath_snap_cntr(struct ipath_devdata *, ipath_creg); |
1014 | void ipath_disarm_senderrbufs(struct ipath_devdata *, int); | 1020 | void ipath_disarm_senderrbufs(struct ipath_devdata *); |
1015 | void ipath_force_pio_avail_update(struct ipath_devdata *); | 1021 | void ipath_force_pio_avail_update(struct ipath_devdata *); |
1016 | void signal_ib_event(struct ipath_devdata *dd, enum ib_event_type ev); | 1022 | void signal_ib_event(struct ipath_devdata *dd, enum ib_event_type ev); |
1017 | 1023 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_qp.c b/drivers/infiniband/hw/ipath/ipath_qp.c index dd5b6e9d57c2..4715911101e4 100644 --- a/drivers/infiniband/hw/ipath/ipath_qp.c +++ b/drivers/infiniband/hw/ipath/ipath_qp.c | |||
@@ -242,7 +242,6 @@ static void ipath_free_qp(struct ipath_qp_table *qpt, struct ipath_qp *qp) | |||
242 | { | 242 | { |
243 | struct ipath_qp *q, **qpp; | 243 | struct ipath_qp *q, **qpp; |
244 | unsigned long flags; | 244 | unsigned long flags; |
245 | int fnd = 0; | ||
246 | 245 | ||
247 | spin_lock_irqsave(&qpt->lock, flags); | 246 | spin_lock_irqsave(&qpt->lock, flags); |
248 | 247 | ||
@@ -253,51 +252,40 @@ static void ipath_free_qp(struct ipath_qp_table *qpt, struct ipath_qp *qp) | |||
253 | *qpp = qp->next; | 252 | *qpp = qp->next; |
254 | qp->next = NULL; | 253 | qp->next = NULL; |
255 | atomic_dec(&qp->refcount); | 254 | atomic_dec(&qp->refcount); |
256 | fnd = 1; | ||
257 | break; | 255 | break; |
258 | } | 256 | } |
259 | } | 257 | } |
260 | 258 | ||
261 | spin_unlock_irqrestore(&qpt->lock, flags); | 259 | spin_unlock_irqrestore(&qpt->lock, flags); |
262 | |||
263 | if (!fnd) | ||
264 | return; | ||
265 | |||
266 | free_qpn(qpt, qp->ibqp.qp_num); | ||
267 | |||
268 | wait_event(qp->wait, !atomic_read(&qp->refcount)); | ||
269 | } | 260 | } |
270 | 261 | ||
271 | /** | 262 | /** |
272 | * ipath_free_all_qps - remove all QPs from the table | 263 | * ipath_free_all_qps - check for QPs still in use |
273 | * @qpt: the QP table to empty | 264 | * @qpt: the QP table to empty |
265 | * | ||
266 | * There should not be any QPs still in use. | ||
267 | * Free memory for table. | ||
274 | */ | 268 | */ |
275 | void ipath_free_all_qps(struct ipath_qp_table *qpt) | 269 | unsigned ipath_free_all_qps(struct ipath_qp_table *qpt) |
276 | { | 270 | { |
277 | unsigned long flags; | 271 | unsigned long flags; |
278 | struct ipath_qp *qp, *nqp; | 272 | struct ipath_qp *qp; |
279 | u32 n; | 273 | u32 n, qp_inuse = 0; |
280 | 274 | ||
275 | spin_lock_irqsave(&qpt->lock, flags); | ||
281 | for (n = 0; n < qpt->max; n++) { | 276 | for (n = 0; n < qpt->max; n++) { |
282 | spin_lock_irqsave(&qpt->lock, flags); | ||
283 | qp = qpt->table[n]; | 277 | qp = qpt->table[n]; |
284 | qpt->table[n] = NULL; | 278 | qpt->table[n] = NULL; |
285 | spin_unlock_irqrestore(&qpt->lock, flags); | 279 | |
286 | 280 | for (; qp; qp = qp->next) | |
287 | while (qp) { | 281 | qp_inuse++; |
288 | nqp = qp->next; | ||
289 | free_qpn(qpt, qp->ibqp.qp_num); | ||
290 | if (!atomic_dec_and_test(&qp->refcount) || | ||
291 | !ipath_destroy_qp(&qp->ibqp)) | ||
292 | ipath_dbg("QP memory leak!\n"); | ||
293 | qp = nqp; | ||
294 | } | ||
295 | } | 282 | } |
283 | spin_unlock_irqrestore(&qpt->lock, flags); | ||
296 | 284 | ||
297 | for (n = 0; n < ARRAY_SIZE(qpt->map); n++) { | 285 | for (n = 0; n < ARRAY_SIZE(qpt->map); n++) |
298 | if (qpt->map[n].page) | 286 | if (qpt->map[n].page) |
299 | free_page((unsigned long)qpt->map[n].page); | 287 | free_page((unsigned long) qpt->map[n].page); |
300 | } | 288 | return qp_inuse; |
301 | } | 289 | } |
302 | 290 | ||
303 | /** | 291 | /** |
@@ -336,11 +324,12 @@ static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) | |||
336 | qp->remote_qpn = 0; | 324 | qp->remote_qpn = 0; |
337 | qp->qkey = 0; | 325 | qp->qkey = 0; |
338 | qp->qp_access_flags = 0; | 326 | qp->qp_access_flags = 0; |
339 | qp->s_busy = 0; | 327 | atomic_set(&qp->s_dma_busy, 0); |
340 | qp->s_flags &= IPATH_S_SIGNAL_REQ_WR; | 328 | qp->s_flags &= IPATH_S_SIGNAL_REQ_WR; |
341 | qp->s_hdrwords = 0; | 329 | qp->s_hdrwords = 0; |
342 | qp->s_wqe = NULL; | 330 | qp->s_wqe = NULL; |
343 | qp->s_pkt_delay = 0; | 331 | qp->s_pkt_delay = 0; |
332 | qp->s_draining = 0; | ||
344 | qp->s_psn = 0; | 333 | qp->s_psn = 0; |
345 | qp->r_psn = 0; | 334 | qp->r_psn = 0; |
346 | qp->r_msn = 0; | 335 | qp->r_msn = 0; |
@@ -353,7 +342,8 @@ static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) | |||
353 | } | 342 | } |
354 | qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE; | 343 | qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE; |
355 | qp->r_nak_state = 0; | 344 | qp->r_nak_state = 0; |
356 | qp->r_wrid_valid = 0; | 345 | qp->r_aflags = 0; |
346 | qp->r_flags = 0; | ||
357 | qp->s_rnr_timeout = 0; | 347 | qp->s_rnr_timeout = 0; |
358 | qp->s_head = 0; | 348 | qp->s_head = 0; |
359 | qp->s_tail = 0; | 349 | qp->s_tail = 0; |
@@ -361,7 +351,6 @@ static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) | |||
361 | qp->s_last = 0; | 351 | qp->s_last = 0; |
362 | qp->s_ssn = 1; | 352 | qp->s_ssn = 1; |
363 | qp->s_lsn = 0; | 353 | qp->s_lsn = 0; |
364 | qp->s_wait_credit = 0; | ||
365 | memset(qp->s_ack_queue, 0, sizeof(qp->s_ack_queue)); | 354 | memset(qp->s_ack_queue, 0, sizeof(qp->s_ack_queue)); |
366 | qp->r_head_ack_queue = 0; | 355 | qp->r_head_ack_queue = 0; |
367 | qp->s_tail_ack_queue = 0; | 356 | qp->s_tail_ack_queue = 0; |
@@ -370,17 +359,17 @@ static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type) | |||
370 | qp->r_rq.wq->head = 0; | 359 | qp->r_rq.wq->head = 0; |
371 | qp->r_rq.wq->tail = 0; | 360 | qp->r_rq.wq->tail = 0; |
372 | } | 361 | } |
373 | qp->r_reuse_sge = 0; | ||
374 | } | 362 | } |
375 | 363 | ||
376 | /** | 364 | /** |
377 | * ipath_error_qp - put a QP into an error state | 365 | * ipath_error_qp - put a QP into the error state |
378 | * @qp: the QP to put into an error state | 366 | * @qp: the QP to put into the error state |
379 | * @err: the receive completion error to signal if a RWQE is active | 367 | * @err: the receive completion error to signal if a RWQE is active |
380 | * | 368 | * |
381 | * Flushes both send and receive work queues. | 369 | * Flushes both send and receive work queues. |
382 | * Returns true if last WQE event should be generated. | 370 | * Returns true if last WQE event should be generated. |
383 | * The QP s_lock should be held and interrupts disabled. | 371 | * The QP s_lock should be held and interrupts disabled. |
372 | * If we are already in error state, just return. | ||
384 | */ | 373 | */ |
385 | 374 | ||
386 | int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | 375 | int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) |
@@ -389,8 +378,10 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
389 | struct ib_wc wc; | 378 | struct ib_wc wc; |
390 | int ret = 0; | 379 | int ret = 0; |
391 | 380 | ||
392 | ipath_dbg("QP%d/%d in error state (%d)\n", | 381 | if (qp->state == IB_QPS_ERR) |
393 | qp->ibqp.qp_num, qp->remote_qpn, err); | 382 | goto bail; |
383 | |||
384 | qp->state = IB_QPS_ERR; | ||
394 | 385 | ||
395 | spin_lock(&dev->pending_lock); | 386 | spin_lock(&dev->pending_lock); |
396 | if (!list_empty(&qp->timerwait)) | 387 | if (!list_empty(&qp->timerwait)) |
@@ -399,39 +390,21 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
399 | list_del_init(&qp->piowait); | 390 | list_del_init(&qp->piowait); |
400 | spin_unlock(&dev->pending_lock); | 391 | spin_unlock(&dev->pending_lock); |
401 | 392 | ||
402 | wc.vendor_err = 0; | 393 | /* Schedule the sending tasklet to drain the send work queue. */ |
403 | wc.byte_len = 0; | 394 | if (qp->s_last != qp->s_head) |
404 | wc.imm_data = 0; | 395 | ipath_schedule_send(qp); |
396 | |||
397 | memset(&wc, 0, sizeof(wc)); | ||
405 | wc.qp = &qp->ibqp; | 398 | wc.qp = &qp->ibqp; |
406 | wc.src_qp = 0; | 399 | wc.opcode = IB_WC_RECV; |
407 | wc.wc_flags = 0; | 400 | |
408 | wc.pkey_index = 0; | 401 | if (test_and_clear_bit(IPATH_R_WRID_VALID, &qp->r_aflags)) { |
409 | wc.slid = 0; | ||
410 | wc.sl = 0; | ||
411 | wc.dlid_path_bits = 0; | ||
412 | wc.port_num = 0; | ||
413 | if (qp->r_wrid_valid) { | ||
414 | qp->r_wrid_valid = 0; | ||
415 | wc.wr_id = qp->r_wr_id; | 402 | wc.wr_id = qp->r_wr_id; |
416 | wc.opcode = IB_WC_RECV; | ||
417 | wc.status = err; | 403 | wc.status = err; |
418 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); | 404 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); |
419 | } | 405 | } |
420 | wc.status = IB_WC_WR_FLUSH_ERR; | 406 | wc.status = IB_WC_WR_FLUSH_ERR; |
421 | 407 | ||
422 | while (qp->s_last != qp->s_head) { | ||
423 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); | ||
424 | |||
425 | wc.wr_id = wqe->wr.wr_id; | ||
426 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
427 | if (++qp->s_last >= qp->s_size) | ||
428 | qp->s_last = 0; | ||
429 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1); | ||
430 | } | ||
431 | qp->s_cur = qp->s_tail = qp->s_head; | ||
432 | qp->s_hdrwords = 0; | ||
433 | qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE; | ||
434 | |||
435 | if (qp->r_rq.wq) { | 408 | if (qp->r_rq.wq) { |
436 | struct ipath_rwq *wq; | 409 | struct ipath_rwq *wq; |
437 | u32 head; | 410 | u32 head; |
@@ -447,7 +420,6 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
447 | tail = wq->tail; | 420 | tail = wq->tail; |
448 | if (tail >= qp->r_rq.size) | 421 | if (tail >= qp->r_rq.size) |
449 | tail = 0; | 422 | tail = 0; |
450 | wc.opcode = IB_WC_RECV; | ||
451 | while (tail != head) { | 423 | while (tail != head) { |
452 | wc.wr_id = get_rwqe_ptr(&qp->r_rq, tail)->wr_id; | 424 | wc.wr_id = get_rwqe_ptr(&qp->r_rq, tail)->wr_id; |
453 | if (++tail >= qp->r_rq.size) | 425 | if (++tail >= qp->r_rq.size) |
@@ -460,6 +432,7 @@ int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err) | |||
460 | } else if (qp->ibqp.event_handler) | 432 | } else if (qp->ibqp.event_handler) |
461 | ret = 1; | 433 | ret = 1; |
462 | 434 | ||
435 | bail: | ||
463 | return ret; | 436 | return ret; |
464 | } | 437 | } |
465 | 438 | ||
@@ -478,11 +451,10 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
478 | struct ipath_ibdev *dev = to_idev(ibqp->device); | 451 | struct ipath_ibdev *dev = to_idev(ibqp->device); |
479 | struct ipath_qp *qp = to_iqp(ibqp); | 452 | struct ipath_qp *qp = to_iqp(ibqp); |
480 | enum ib_qp_state cur_state, new_state; | 453 | enum ib_qp_state cur_state, new_state; |
481 | unsigned long flags; | ||
482 | int lastwqe = 0; | 454 | int lastwqe = 0; |
483 | int ret; | 455 | int ret; |
484 | 456 | ||
485 | spin_lock_irqsave(&qp->s_lock, flags); | 457 | spin_lock_irq(&qp->s_lock); |
486 | 458 | ||
487 | cur_state = attr_mask & IB_QP_CUR_STATE ? | 459 | cur_state = attr_mask & IB_QP_CUR_STATE ? |
488 | attr->cur_qp_state : qp->state; | 460 | attr->cur_qp_state : qp->state; |
@@ -535,16 +507,42 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
535 | 507 | ||
536 | switch (new_state) { | 508 | switch (new_state) { |
537 | case IB_QPS_RESET: | 509 | case IB_QPS_RESET: |
510 | if (qp->state != IB_QPS_RESET) { | ||
511 | qp->state = IB_QPS_RESET; | ||
512 | spin_lock(&dev->pending_lock); | ||
513 | if (!list_empty(&qp->timerwait)) | ||
514 | list_del_init(&qp->timerwait); | ||
515 | if (!list_empty(&qp->piowait)) | ||
516 | list_del_init(&qp->piowait); | ||
517 | spin_unlock(&dev->pending_lock); | ||
518 | qp->s_flags &= ~IPATH_S_ANY_WAIT; | ||
519 | spin_unlock_irq(&qp->s_lock); | ||
520 | /* Stop the sending tasklet */ | ||
521 | tasklet_kill(&qp->s_task); | ||
522 | wait_event(qp->wait_dma, !atomic_read(&qp->s_dma_busy)); | ||
523 | spin_lock_irq(&qp->s_lock); | ||
524 | } | ||
538 | ipath_reset_qp(qp, ibqp->qp_type); | 525 | ipath_reset_qp(qp, ibqp->qp_type); |
539 | break; | 526 | break; |
540 | 527 | ||
528 | case IB_QPS_SQD: | ||
529 | qp->s_draining = qp->s_last != qp->s_cur; | ||
530 | qp->state = new_state; | ||
531 | break; | ||
532 | |||
533 | case IB_QPS_SQE: | ||
534 | if (qp->ibqp.qp_type == IB_QPT_RC) | ||
535 | goto inval; | ||
536 | qp->state = new_state; | ||
537 | break; | ||
538 | |||
541 | case IB_QPS_ERR: | 539 | case IB_QPS_ERR: |
542 | lastwqe = ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); | 540 | lastwqe = ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
543 | break; | 541 | break; |
544 | 542 | ||
545 | default: | 543 | default: |
544 | qp->state = new_state; | ||
546 | break; | 545 | break; |
547 | |||
548 | } | 546 | } |
549 | 547 | ||
550 | if (attr_mask & IB_QP_PKEY_INDEX) | 548 | if (attr_mask & IB_QP_PKEY_INDEX) |
@@ -597,8 +595,7 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
597 | if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) | 595 | if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) |
598 | qp->s_max_rd_atomic = attr->max_rd_atomic; | 596 | qp->s_max_rd_atomic = attr->max_rd_atomic; |
599 | 597 | ||
600 | qp->state = new_state; | 598 | spin_unlock_irq(&qp->s_lock); |
601 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
602 | 599 | ||
603 | if (lastwqe) { | 600 | if (lastwqe) { |
604 | struct ib_event ev; | 601 | struct ib_event ev; |
@@ -612,7 +609,7 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
612 | goto bail; | 609 | goto bail; |
613 | 610 | ||
614 | inval: | 611 | inval: |
615 | spin_unlock_irqrestore(&qp->s_lock, flags); | 612 | spin_unlock_irq(&qp->s_lock); |
616 | ret = -EINVAL; | 613 | ret = -EINVAL; |
617 | 614 | ||
618 | bail: | 615 | bail: |
@@ -643,7 +640,7 @@ int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
643 | attr->pkey_index = qp->s_pkey_index; | 640 | attr->pkey_index = qp->s_pkey_index; |
644 | attr->alt_pkey_index = 0; | 641 | attr->alt_pkey_index = 0; |
645 | attr->en_sqd_async_notify = 0; | 642 | attr->en_sqd_async_notify = 0; |
646 | attr->sq_draining = 0; | 643 | attr->sq_draining = qp->s_draining; |
647 | attr->max_rd_atomic = qp->s_max_rd_atomic; | 644 | attr->max_rd_atomic = qp->s_max_rd_atomic; |
648 | attr->max_dest_rd_atomic = qp->r_max_rd_atomic; | 645 | attr->max_dest_rd_atomic = qp->r_max_rd_atomic; |
649 | attr->min_rnr_timer = qp->r_min_rnr_timer; | 646 | attr->min_rnr_timer = qp->r_min_rnr_timer; |
@@ -833,6 +830,7 @@ struct ib_qp *ipath_create_qp(struct ib_pd *ibpd, | |||
833 | spin_lock_init(&qp->r_rq.lock); | 830 | spin_lock_init(&qp->r_rq.lock); |
834 | atomic_set(&qp->refcount, 0); | 831 | atomic_set(&qp->refcount, 0); |
835 | init_waitqueue_head(&qp->wait); | 832 | init_waitqueue_head(&qp->wait); |
833 | init_waitqueue_head(&qp->wait_dma); | ||
836 | tasklet_init(&qp->s_task, ipath_do_send, (unsigned long)qp); | 834 | tasklet_init(&qp->s_task, ipath_do_send, (unsigned long)qp); |
837 | INIT_LIST_HEAD(&qp->piowait); | 835 | INIT_LIST_HEAD(&qp->piowait); |
838 | INIT_LIST_HEAD(&qp->timerwait); | 836 | INIT_LIST_HEAD(&qp->timerwait); |
@@ -926,6 +924,7 @@ bail_ip: | |||
926 | else | 924 | else |
927 | vfree(qp->r_rq.wq); | 925 | vfree(qp->r_rq.wq); |
928 | ipath_free_qp(&dev->qp_table, qp); | 926 | ipath_free_qp(&dev->qp_table, qp); |
927 | free_qpn(&dev->qp_table, qp->ibqp.qp_num); | ||
929 | bail_qp: | 928 | bail_qp: |
930 | kfree(qp); | 929 | kfree(qp); |
931 | bail_swq: | 930 | bail_swq: |
@@ -947,41 +946,44 @@ int ipath_destroy_qp(struct ib_qp *ibqp) | |||
947 | { | 946 | { |
948 | struct ipath_qp *qp = to_iqp(ibqp); | 947 | struct ipath_qp *qp = to_iqp(ibqp); |
949 | struct ipath_ibdev *dev = to_idev(ibqp->device); | 948 | struct ipath_ibdev *dev = to_idev(ibqp->device); |
950 | unsigned long flags; | ||
951 | 949 | ||
952 | spin_lock_irqsave(&qp->s_lock, flags); | 950 | /* Make sure HW and driver activity is stopped. */ |
953 | qp->state = IB_QPS_ERR; | 951 | spin_lock_irq(&qp->s_lock); |
954 | spin_unlock_irqrestore(&qp->s_lock, flags); | 952 | if (qp->state != IB_QPS_RESET) { |
955 | spin_lock(&dev->n_qps_lock); | 953 | qp->state = IB_QPS_RESET; |
956 | dev->n_qps_allocated--; | 954 | spin_lock(&dev->pending_lock); |
957 | spin_unlock(&dev->n_qps_lock); | 955 | if (!list_empty(&qp->timerwait)) |
956 | list_del_init(&qp->timerwait); | ||
957 | if (!list_empty(&qp->piowait)) | ||
958 | list_del_init(&qp->piowait); | ||
959 | spin_unlock(&dev->pending_lock); | ||
960 | qp->s_flags &= ~IPATH_S_ANY_WAIT; | ||
961 | spin_unlock_irq(&qp->s_lock); | ||
962 | /* Stop the sending tasklet */ | ||
963 | tasklet_kill(&qp->s_task); | ||
964 | wait_event(qp->wait_dma, !atomic_read(&qp->s_dma_busy)); | ||
965 | } else | ||
966 | spin_unlock_irq(&qp->s_lock); | ||
958 | 967 | ||
959 | /* Stop the sending tasklet. */ | 968 | ipath_free_qp(&dev->qp_table, qp); |
960 | tasklet_kill(&qp->s_task); | ||
961 | 969 | ||
962 | if (qp->s_tx) { | 970 | if (qp->s_tx) { |
963 | atomic_dec(&qp->refcount); | 971 | atomic_dec(&qp->refcount); |
964 | if (qp->s_tx->txreq.flags & IPATH_SDMA_TXREQ_F_FREEBUF) | 972 | if (qp->s_tx->txreq.flags & IPATH_SDMA_TXREQ_F_FREEBUF) |
965 | kfree(qp->s_tx->txreq.map_addr); | 973 | kfree(qp->s_tx->txreq.map_addr); |
974 | spin_lock_irq(&dev->pending_lock); | ||
975 | list_add(&qp->s_tx->txreq.list, &dev->txreq_free); | ||
976 | spin_unlock_irq(&dev->pending_lock); | ||
977 | qp->s_tx = NULL; | ||
966 | } | 978 | } |
967 | 979 | ||
968 | /* Make sure the QP isn't on the timeout list. */ | 980 | wait_event(qp->wait, !atomic_read(&qp->refcount)); |
969 | spin_lock_irqsave(&dev->pending_lock, flags); | ||
970 | if (!list_empty(&qp->timerwait)) | ||
971 | list_del_init(&qp->timerwait); | ||
972 | if (!list_empty(&qp->piowait)) | ||
973 | list_del_init(&qp->piowait); | ||
974 | if (qp->s_tx) | ||
975 | list_add(&qp->s_tx->txreq.list, &dev->txreq_free); | ||
976 | spin_unlock_irqrestore(&dev->pending_lock, flags); | ||
977 | 981 | ||
978 | /* | 982 | /* all user's cleaned up, mark it available */ |
979 | * Make sure that the QP is not in the QPN table so receive | 983 | free_qpn(&dev->qp_table, qp->ibqp.qp_num); |
980 | * interrupts will discard packets for this QP. XXX Also remove QP | 984 | spin_lock(&dev->n_qps_lock); |
981 | * from multicast table. | 985 | dev->n_qps_allocated--; |
982 | */ | 986 | spin_unlock(&dev->n_qps_lock); |
983 | if (atomic_read(&qp->refcount) != 0) | ||
984 | ipath_free_qp(&dev->qp_table, qp); | ||
985 | 987 | ||
986 | if (qp->ip) | 988 | if (qp->ip) |
987 | kref_put(&qp->ip->ref, ipath_release_mmap_info); | 989 | kref_put(&qp->ip->ref, ipath_release_mmap_info); |
@@ -1026,48 +1028,6 @@ bail: | |||
1026 | } | 1028 | } |
1027 | 1029 | ||
1028 | /** | 1030 | /** |
1029 | * ipath_sqerror_qp - put a QP's send queue into an error state | ||
1030 | * @qp: QP who's send queue will be put into an error state | ||
1031 | * @wc: the WC responsible for putting the QP in this state | ||
1032 | * | ||
1033 | * Flushes the send work queue. | ||
1034 | * The QP s_lock should be held and interrupts disabled. | ||
1035 | */ | ||
1036 | |||
1037 | void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc) | ||
1038 | { | ||
1039 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | ||
1040 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); | ||
1041 | |||
1042 | ipath_dbg("Send queue error on QP%d/%d: err: %d\n", | ||
1043 | qp->ibqp.qp_num, qp->remote_qpn, wc->status); | ||
1044 | |||
1045 | spin_lock(&dev->pending_lock); | ||
1046 | if (!list_empty(&qp->timerwait)) | ||
1047 | list_del_init(&qp->timerwait); | ||
1048 | if (!list_empty(&qp->piowait)) | ||
1049 | list_del_init(&qp->piowait); | ||
1050 | spin_unlock(&dev->pending_lock); | ||
1051 | |||
1052 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); | ||
1053 | if (++qp->s_last >= qp->s_size) | ||
1054 | qp->s_last = 0; | ||
1055 | |||
1056 | wc->status = IB_WC_WR_FLUSH_ERR; | ||
1057 | |||
1058 | while (qp->s_last != qp->s_head) { | ||
1059 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
1060 | wc->wr_id = wqe->wr.wr_id; | ||
1061 | wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
1062 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), wc, 1); | ||
1063 | if (++qp->s_last >= qp->s_size) | ||
1064 | qp->s_last = 0; | ||
1065 | } | ||
1066 | qp->s_cur = qp->s_tail = qp->s_head; | ||
1067 | qp->state = IB_QPS_SQE; | ||
1068 | } | ||
1069 | |||
1070 | /** | ||
1071 | * ipath_get_credit - flush the send work queue of a QP | 1031 | * ipath_get_credit - flush the send work queue of a QP |
1072 | * @qp: the qp who's send work queue to flush | 1032 | * @qp: the qp who's send work queue to flush |
1073 | * @aeth: the Acknowledge Extended Transport Header | 1033 | * @aeth: the Acknowledge Extended Transport Header |
@@ -1093,9 +1053,10 @@ void ipath_get_credit(struct ipath_qp *qp, u32 aeth) | |||
1093 | } | 1053 | } |
1094 | 1054 | ||
1095 | /* Restart sending if it was blocked due to lack of credits. */ | 1055 | /* Restart sending if it was blocked due to lack of credits. */ |
1096 | if (qp->s_cur != qp->s_head && | 1056 | if ((qp->s_flags & IPATH_S_WAIT_SSN_CREDIT) && |
1057 | qp->s_cur != qp->s_head && | ||
1097 | (qp->s_lsn == (u32) -1 || | 1058 | (qp->s_lsn == (u32) -1 || |
1098 | ipath_cmp24(get_swqe_ptr(qp, qp->s_cur)->ssn, | 1059 | ipath_cmp24(get_swqe_ptr(qp, qp->s_cur)->ssn, |
1099 | qp->s_lsn + 1) <= 0)) | 1060 | qp->s_lsn + 1) <= 0)) |
1100 | tasklet_hi_schedule(&qp->s_task); | 1061 | ipath_schedule_send(qp); |
1101 | } | 1062 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_rc.c b/drivers/infiniband/hw/ipath/ipath_rc.c index c405dfba5531..108df667d2ee 100644 --- a/drivers/infiniband/hw/ipath/ipath_rc.c +++ b/drivers/infiniband/hw/ipath/ipath_rc.c | |||
@@ -92,6 +92,10 @@ static int ipath_make_rc_ack(struct ipath_ibdev *dev, struct ipath_qp *qp, | |||
92 | u32 bth0; | 92 | u32 bth0; |
93 | u32 bth2; | 93 | u32 bth2; |
94 | 94 | ||
95 | /* Don't send an ACK if we aren't supposed to. */ | ||
96 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) | ||
97 | goto bail; | ||
98 | |||
95 | /* header size in 32-bit words LRH+BTH = (8+12)/4. */ | 99 | /* header size in 32-bit words LRH+BTH = (8+12)/4. */ |
96 | hwords = 5; | 100 | hwords = 5; |
97 | 101 | ||
@@ -238,14 +242,25 @@ int ipath_make_rc_req(struct ipath_qp *qp) | |||
238 | ipath_make_rc_ack(dev, qp, ohdr, pmtu)) | 242 | ipath_make_rc_ack(dev, qp, ohdr, pmtu)) |
239 | goto done; | 243 | goto done; |
240 | 244 | ||
241 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK) || | 245 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK)) { |
242 | qp->s_rnr_timeout || qp->s_wait_credit) | 246 | if (!(ib_ipath_state_ops[qp->state] & IPATH_FLUSH_SEND)) |
243 | goto bail; | 247 | goto bail; |
248 | /* We are in the error state, flush the work request. */ | ||
249 | if (qp->s_last == qp->s_head) | ||
250 | goto bail; | ||
251 | /* If DMAs are in progress, we can't flush immediately. */ | ||
252 | if (atomic_read(&qp->s_dma_busy)) { | ||
253 | qp->s_flags |= IPATH_S_WAIT_DMA; | ||
254 | goto bail; | ||
255 | } | ||
256 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
257 | ipath_send_complete(qp, wqe, IB_WC_WR_FLUSH_ERR); | ||
258 | goto done; | ||
259 | } | ||
244 | 260 | ||
245 | /* Limit the number of packets sent without an ACK. */ | 261 | /* Leave BUSY set until RNR timeout. */ |
246 | if (ipath_cmp24(qp->s_psn, qp->s_last_psn + IPATH_PSN_CREDIT) > 0) { | 262 | if (qp->s_rnr_timeout) { |
247 | qp->s_wait_credit = 1; | 263 | qp->s_flags |= IPATH_S_WAITING; |
248 | dev->n_rc_stalls++; | ||
249 | goto bail; | 264 | goto bail; |
250 | } | 265 | } |
251 | 266 | ||
@@ -257,6 +272,9 @@ int ipath_make_rc_req(struct ipath_qp *qp) | |||
257 | wqe = get_swqe_ptr(qp, qp->s_cur); | 272 | wqe = get_swqe_ptr(qp, qp->s_cur); |
258 | switch (qp->s_state) { | 273 | switch (qp->s_state) { |
259 | default: | 274 | default: |
275 | if (!(ib_ipath_state_ops[qp->state] & | ||
276 | IPATH_PROCESS_NEXT_SEND_OK)) | ||
277 | goto bail; | ||
260 | /* | 278 | /* |
261 | * Resend an old request or start a new one. | 279 | * Resend an old request or start a new one. |
262 | * | 280 | * |
@@ -294,8 +312,10 @@ int ipath_make_rc_req(struct ipath_qp *qp) | |||
294 | case IB_WR_SEND_WITH_IMM: | 312 | case IB_WR_SEND_WITH_IMM: |
295 | /* If no credit, return. */ | 313 | /* If no credit, return. */ |
296 | if (qp->s_lsn != (u32) -1 && | 314 | if (qp->s_lsn != (u32) -1 && |
297 | ipath_cmp24(wqe->ssn, qp->s_lsn + 1) > 0) | 315 | ipath_cmp24(wqe->ssn, qp->s_lsn + 1) > 0) { |
316 | qp->s_flags |= IPATH_S_WAIT_SSN_CREDIT; | ||
298 | goto bail; | 317 | goto bail; |
318 | } | ||
299 | wqe->lpsn = wqe->psn; | 319 | wqe->lpsn = wqe->psn; |
300 | if (len > pmtu) { | 320 | if (len > pmtu) { |
301 | wqe->lpsn += (len - 1) / pmtu; | 321 | wqe->lpsn += (len - 1) / pmtu; |
@@ -325,8 +345,10 @@ int ipath_make_rc_req(struct ipath_qp *qp) | |||
325 | case IB_WR_RDMA_WRITE_WITH_IMM: | 345 | case IB_WR_RDMA_WRITE_WITH_IMM: |
326 | /* If no credit, return. */ | 346 | /* If no credit, return. */ |
327 | if (qp->s_lsn != (u32) -1 && | 347 | if (qp->s_lsn != (u32) -1 && |
328 | ipath_cmp24(wqe->ssn, qp->s_lsn + 1) > 0) | 348 | ipath_cmp24(wqe->ssn, qp->s_lsn + 1) > 0) { |
349 | qp->s_flags |= IPATH_S_WAIT_SSN_CREDIT; | ||
329 | goto bail; | 350 | goto bail; |
351 | } | ||
330 | ohdr->u.rc.reth.vaddr = | 352 | ohdr->u.rc.reth.vaddr = |
331 | cpu_to_be64(wqe->wr.wr.rdma.remote_addr); | 353 | cpu_to_be64(wqe->wr.wr.rdma.remote_addr); |
332 | ohdr->u.rc.reth.rkey = | 354 | ohdr->u.rc.reth.rkey = |
@@ -570,7 +592,11 @@ int ipath_make_rc_req(struct ipath_qp *qp) | |||
570 | ipath_make_ruc_header(dev, qp, ohdr, bth0 | (qp->s_state << 24), bth2); | 592 | ipath_make_ruc_header(dev, qp, ohdr, bth0 | (qp->s_state << 24), bth2); |
571 | done: | 593 | done: |
572 | ret = 1; | 594 | ret = 1; |
595 | goto unlock; | ||
596 | |||
573 | bail: | 597 | bail: |
598 | qp->s_flags &= ~IPATH_S_BUSY; | ||
599 | unlock: | ||
574 | spin_unlock_irqrestore(&qp->s_lock, flags); | 600 | spin_unlock_irqrestore(&qp->s_lock, flags); |
575 | return ret; | 601 | return ret; |
576 | } | 602 | } |
@@ -606,7 +632,11 @@ static void send_rc_ack(struct ipath_qp *qp) | |||
606 | 632 | ||
607 | spin_unlock_irqrestore(&qp->s_lock, flags); | 633 | spin_unlock_irqrestore(&qp->s_lock, flags); |
608 | 634 | ||
635 | /* Don't try to send ACKs if the link isn't ACTIVE */ | ||
609 | dd = dev->dd; | 636 | dd = dev->dd; |
637 | if (!(dd->ipath_flags & IPATH_LINKACTIVE)) | ||
638 | goto done; | ||
639 | |||
610 | piobuf = ipath_getpiobuf(dd, 0, NULL); | 640 | piobuf = ipath_getpiobuf(dd, 0, NULL); |
611 | if (!piobuf) { | 641 | if (!piobuf) { |
612 | /* | 642 | /* |
@@ -668,15 +698,16 @@ static void send_rc_ack(struct ipath_qp *qp) | |||
668 | goto done; | 698 | goto done; |
669 | 699 | ||
670 | queue_ack: | 700 | queue_ack: |
671 | dev->n_rc_qacks++; | 701 | if (ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK) { |
672 | qp->s_flags |= IPATH_S_ACK_PENDING; | 702 | dev->n_rc_qacks++; |
673 | qp->s_nak_state = qp->r_nak_state; | 703 | qp->s_flags |= IPATH_S_ACK_PENDING; |
674 | qp->s_ack_psn = qp->r_ack_psn; | 704 | qp->s_nak_state = qp->r_nak_state; |
705 | qp->s_ack_psn = qp->r_ack_psn; | ||
706 | |||
707 | /* Schedule the send tasklet. */ | ||
708 | ipath_schedule_send(qp); | ||
709 | } | ||
675 | spin_unlock_irqrestore(&qp->s_lock, flags); | 710 | spin_unlock_irqrestore(&qp->s_lock, flags); |
676 | |||
677 | /* Call ipath_do_rc_send() in another thread. */ | ||
678 | tasklet_hi_schedule(&qp->s_task); | ||
679 | |||
680 | done: | 711 | done: |
681 | return; | 712 | return; |
682 | } | 713 | } |
@@ -735,7 +766,7 @@ static void reset_psn(struct ipath_qp *qp, u32 psn) | |||
735 | /* | 766 | /* |
736 | * Set the state to restart in the middle of a request. | 767 | * Set the state to restart in the middle of a request. |
737 | * Don't change the s_sge, s_cur_sge, or s_cur_size. | 768 | * Don't change the s_sge, s_cur_sge, or s_cur_size. |
738 | * See ipath_do_rc_send(). | 769 | * See ipath_make_rc_req(). |
739 | */ | 770 | */ |
740 | switch (opcode) { | 771 | switch (opcode) { |
741 | case IB_WR_SEND: | 772 | case IB_WR_SEND: |
@@ -771,27 +802,14 @@ done: | |||
771 | * | 802 | * |
772 | * The QP s_lock should be held and interrupts disabled. | 803 | * The QP s_lock should be held and interrupts disabled. |
773 | */ | 804 | */ |
774 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) | 805 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn) |
775 | { | 806 | { |
776 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); | 807 | struct ipath_swqe *wqe = get_swqe_ptr(qp, qp->s_last); |
777 | struct ipath_ibdev *dev; | 808 | struct ipath_ibdev *dev; |
778 | 809 | ||
779 | if (qp->s_retry == 0) { | 810 | if (qp->s_retry == 0) { |
780 | wc->wr_id = wqe->wr.wr_id; | 811 | ipath_send_complete(qp, wqe, IB_WC_RETRY_EXC_ERR); |
781 | wc->status = IB_WC_RETRY_EXC_ERR; | 812 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
782 | wc->opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
783 | wc->vendor_err = 0; | ||
784 | wc->byte_len = 0; | ||
785 | wc->qp = &qp->ibqp; | ||
786 | wc->imm_data = 0; | ||
787 | wc->src_qp = qp->remote_qpn; | ||
788 | wc->wc_flags = 0; | ||
789 | wc->pkey_index = 0; | ||
790 | wc->slid = qp->remote_ah_attr.dlid; | ||
791 | wc->sl = qp->remote_ah_attr.sl; | ||
792 | wc->dlid_path_bits = 0; | ||
793 | wc->port_num = 0; | ||
794 | ipath_sqerror_qp(qp, wc); | ||
795 | goto bail; | 813 | goto bail; |
796 | } | 814 | } |
797 | qp->s_retry--; | 815 | qp->s_retry--; |
@@ -804,6 +822,8 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) | |||
804 | spin_lock(&dev->pending_lock); | 822 | spin_lock(&dev->pending_lock); |
805 | if (!list_empty(&qp->timerwait)) | 823 | if (!list_empty(&qp->timerwait)) |
806 | list_del_init(&qp->timerwait); | 824 | list_del_init(&qp->timerwait); |
825 | if (!list_empty(&qp->piowait)) | ||
826 | list_del_init(&qp->piowait); | ||
807 | spin_unlock(&dev->pending_lock); | 827 | spin_unlock(&dev->pending_lock); |
808 | 828 | ||
809 | if (wqe->wr.opcode == IB_WR_RDMA_READ) | 829 | if (wqe->wr.opcode == IB_WR_RDMA_READ) |
@@ -812,7 +832,7 @@ void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc) | |||
812 | dev->n_rc_resends += (qp->s_psn - psn) & IPATH_PSN_MASK; | 832 | dev->n_rc_resends += (qp->s_psn - psn) & IPATH_PSN_MASK; |
813 | 833 | ||
814 | reset_psn(qp, psn); | 834 | reset_psn(qp, psn); |
815 | tasklet_hi_schedule(&qp->s_task); | 835 | ipath_schedule_send(qp); |
816 | 836 | ||
817 | bail: | 837 | bail: |
818 | return; | 838 | return; |
@@ -820,13 +840,7 @@ bail: | |||
820 | 840 | ||
821 | static inline void update_last_psn(struct ipath_qp *qp, u32 psn) | 841 | static inline void update_last_psn(struct ipath_qp *qp, u32 psn) |
822 | { | 842 | { |
823 | if (qp->s_last_psn != psn) { | 843 | qp->s_last_psn = psn; |
824 | qp->s_last_psn = psn; | ||
825 | if (qp->s_wait_credit) { | ||
826 | qp->s_wait_credit = 0; | ||
827 | tasklet_hi_schedule(&qp->s_task); | ||
828 | } | ||
829 | } | ||
830 | } | 844 | } |
831 | 845 | ||
832 | /** | 846 | /** |
@@ -845,6 +859,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
845 | { | 859 | { |
846 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | 860 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); |
847 | struct ib_wc wc; | 861 | struct ib_wc wc; |
862 | enum ib_wc_status status; | ||
848 | struct ipath_swqe *wqe; | 863 | struct ipath_swqe *wqe; |
849 | int ret = 0; | 864 | int ret = 0; |
850 | u32 ack_psn; | 865 | u32 ack_psn; |
@@ -909,7 +924,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
909 | */ | 924 | */ |
910 | update_last_psn(qp, wqe->psn - 1); | 925 | update_last_psn(qp, wqe->psn - 1); |
911 | /* Retry this request. */ | 926 | /* Retry this request. */ |
912 | ipath_restart_rc(qp, wqe->psn, &wc); | 927 | ipath_restart_rc(qp, wqe->psn); |
913 | /* | 928 | /* |
914 | * No need to process the ACK/NAK since we are | 929 | * No need to process the ACK/NAK since we are |
915 | * restarting an earlier request. | 930 | * restarting an earlier request. |
@@ -925,32 +940,23 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
925 | wqe->wr.opcode == IB_WR_ATOMIC_FETCH_AND_ADD)) { | 940 | wqe->wr.opcode == IB_WR_ATOMIC_FETCH_AND_ADD)) { |
926 | qp->s_num_rd_atomic--; | 941 | qp->s_num_rd_atomic--; |
927 | /* Restart sending task if fence is complete */ | 942 | /* Restart sending task if fence is complete */ |
928 | if ((qp->s_flags & IPATH_S_FENCE_PENDING) && | 943 | if (((qp->s_flags & IPATH_S_FENCE_PENDING) && |
929 | !qp->s_num_rd_atomic) { | 944 | !qp->s_num_rd_atomic) || |
930 | qp->s_flags &= ~IPATH_S_FENCE_PENDING; | 945 | qp->s_flags & IPATH_S_RDMAR_PENDING) |
931 | tasklet_hi_schedule(&qp->s_task); | 946 | ipath_schedule_send(qp); |
932 | } else if (qp->s_flags & IPATH_S_RDMAR_PENDING) { | ||
933 | qp->s_flags &= ~IPATH_S_RDMAR_PENDING; | ||
934 | tasklet_hi_schedule(&qp->s_task); | ||
935 | } | ||
936 | } | 947 | } |
937 | /* Post a send completion queue entry if requested. */ | 948 | /* Post a send completion queue entry if requested. */ |
938 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || | 949 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || |
939 | (wqe->wr.send_flags & IB_SEND_SIGNALED)) { | 950 | (wqe->wr.send_flags & IB_SEND_SIGNALED)) { |
951 | memset(&wc, 0, sizeof wc); | ||
940 | wc.wr_id = wqe->wr.wr_id; | 952 | wc.wr_id = wqe->wr.wr_id; |
941 | wc.status = IB_WC_SUCCESS; | 953 | wc.status = IB_WC_SUCCESS; |
942 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 954 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; |
943 | wc.vendor_err = 0; | ||
944 | wc.byte_len = wqe->length; | 955 | wc.byte_len = wqe->length; |
945 | wc.imm_data = 0; | ||
946 | wc.qp = &qp->ibqp; | 956 | wc.qp = &qp->ibqp; |
947 | wc.src_qp = qp->remote_qpn; | 957 | wc.src_qp = qp->remote_qpn; |
948 | wc.wc_flags = 0; | ||
949 | wc.pkey_index = 0; | ||
950 | wc.slid = qp->remote_ah_attr.dlid; | 958 | wc.slid = qp->remote_ah_attr.dlid; |
951 | wc.sl = qp->remote_ah_attr.sl; | 959 | wc.sl = qp->remote_ah_attr.sl; |
952 | wc.dlid_path_bits = 0; | ||
953 | wc.port_num = 0; | ||
954 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); | 960 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); |
955 | } | 961 | } |
956 | qp->s_retry = qp->s_retry_cnt; | 962 | qp->s_retry = qp->s_retry_cnt; |
@@ -971,6 +977,8 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
971 | } else { | 977 | } else { |
972 | if (++qp->s_last >= qp->s_size) | 978 | if (++qp->s_last >= qp->s_size) |
973 | qp->s_last = 0; | 979 | qp->s_last = 0; |
980 | if (qp->state == IB_QPS_SQD && qp->s_last == qp->s_cur) | ||
981 | qp->s_draining = 0; | ||
974 | if (qp->s_last == qp->s_tail) | 982 | if (qp->s_last == qp->s_tail) |
975 | break; | 983 | break; |
976 | wqe = get_swqe_ptr(qp, qp->s_last); | 984 | wqe = get_swqe_ptr(qp, qp->s_last); |
@@ -994,7 +1002,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
994 | */ | 1002 | */ |
995 | if (ipath_cmp24(qp->s_psn, psn) <= 0) { | 1003 | if (ipath_cmp24(qp->s_psn, psn) <= 0) { |
996 | reset_psn(qp, psn + 1); | 1004 | reset_psn(qp, psn + 1); |
997 | tasklet_hi_schedule(&qp->s_task); | 1005 | ipath_schedule_send(qp); |
998 | } | 1006 | } |
999 | } else if (ipath_cmp24(qp->s_psn, psn) <= 0) { | 1007 | } else if (ipath_cmp24(qp->s_psn, psn) <= 0) { |
1000 | qp->s_state = OP(SEND_LAST); | 1008 | qp->s_state = OP(SEND_LAST); |
@@ -1012,7 +1020,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
1012 | if (qp->s_last == qp->s_tail) | 1020 | if (qp->s_last == qp->s_tail) |
1013 | goto bail; | 1021 | goto bail; |
1014 | if (qp->s_rnr_retry == 0) { | 1022 | if (qp->s_rnr_retry == 0) { |
1015 | wc.status = IB_WC_RNR_RETRY_EXC_ERR; | 1023 | status = IB_WC_RNR_RETRY_EXC_ERR; |
1016 | goto class_b; | 1024 | goto class_b; |
1017 | } | 1025 | } |
1018 | if (qp->s_rnr_retry_cnt < 7) | 1026 | if (qp->s_rnr_retry_cnt < 7) |
@@ -1033,6 +1041,7 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
1033 | ib_ipath_rnr_table[(aeth >> IPATH_AETH_CREDIT_SHIFT) & | 1041 | ib_ipath_rnr_table[(aeth >> IPATH_AETH_CREDIT_SHIFT) & |
1034 | IPATH_AETH_CREDIT_MASK]; | 1042 | IPATH_AETH_CREDIT_MASK]; |
1035 | ipath_insert_rnr_queue(qp); | 1043 | ipath_insert_rnr_queue(qp); |
1044 | ipath_schedule_send(qp); | ||
1036 | goto bail; | 1045 | goto bail; |
1037 | 1046 | ||
1038 | case 3: /* NAK */ | 1047 | case 3: /* NAK */ |
@@ -1050,37 +1059,25 @@ static int do_rc_ack(struct ipath_qp *qp, u32 aeth, u32 psn, int opcode, | |||
1050 | * RDMA READ response which terminates the RDMA | 1059 | * RDMA READ response which terminates the RDMA |
1051 | * READ. | 1060 | * READ. |
1052 | */ | 1061 | */ |
1053 | ipath_restart_rc(qp, psn, &wc); | 1062 | ipath_restart_rc(qp, psn); |
1054 | break; | 1063 | break; |
1055 | 1064 | ||
1056 | case 1: /* Invalid Request */ | 1065 | case 1: /* Invalid Request */ |
1057 | wc.status = IB_WC_REM_INV_REQ_ERR; | 1066 | status = IB_WC_REM_INV_REQ_ERR; |
1058 | dev->n_other_naks++; | 1067 | dev->n_other_naks++; |
1059 | goto class_b; | 1068 | goto class_b; |
1060 | 1069 | ||
1061 | case 2: /* Remote Access Error */ | 1070 | case 2: /* Remote Access Error */ |
1062 | wc.status = IB_WC_REM_ACCESS_ERR; | 1071 | status = IB_WC_REM_ACCESS_ERR; |
1063 | dev->n_other_naks++; | 1072 | dev->n_other_naks++; |
1064 | goto class_b; | 1073 | goto class_b; |
1065 | 1074 | ||
1066 | case 3: /* Remote Operation Error */ | 1075 | case 3: /* Remote Operation Error */ |
1067 | wc.status = IB_WC_REM_OP_ERR; | 1076 | status = IB_WC_REM_OP_ERR; |
1068 | dev->n_other_naks++; | 1077 | dev->n_other_naks++; |
1069 | class_b: | 1078 | class_b: |
1070 | wc.wr_id = wqe->wr.wr_id; | 1079 | ipath_send_complete(qp, wqe, status); |
1071 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 1080 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
1072 | wc.vendor_err = 0; | ||
1073 | wc.byte_len = 0; | ||
1074 | wc.qp = &qp->ibqp; | ||
1075 | wc.imm_data = 0; | ||
1076 | wc.src_qp = qp->remote_qpn; | ||
1077 | wc.wc_flags = 0; | ||
1078 | wc.pkey_index = 0; | ||
1079 | wc.slid = qp->remote_ah_attr.dlid; | ||
1080 | wc.sl = qp->remote_ah_attr.sl; | ||
1081 | wc.dlid_path_bits = 0; | ||
1082 | wc.port_num = 0; | ||
1083 | ipath_sqerror_qp(qp, &wc); | ||
1084 | break; | 1081 | break; |
1085 | 1082 | ||
1086 | default: | 1083 | default: |
@@ -1126,8 +1123,8 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1126 | int header_in_data) | 1123 | int header_in_data) |
1127 | { | 1124 | { |
1128 | struct ipath_swqe *wqe; | 1125 | struct ipath_swqe *wqe; |
1126 | enum ib_wc_status status; | ||
1129 | unsigned long flags; | 1127 | unsigned long flags; |
1130 | struct ib_wc wc; | ||
1131 | int diff; | 1128 | int diff; |
1132 | u32 pad; | 1129 | u32 pad; |
1133 | u32 aeth; | 1130 | u32 aeth; |
@@ -1135,6 +1132,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1135 | 1132 | ||
1136 | spin_lock_irqsave(&qp->s_lock, flags); | 1133 | spin_lock_irqsave(&qp->s_lock, flags); |
1137 | 1134 | ||
1135 | /* Double check we can process this now that we hold the s_lock. */ | ||
1136 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) | ||
1137 | goto ack_done; | ||
1138 | |||
1138 | /* Ignore invalid responses. */ | 1139 | /* Ignore invalid responses. */ |
1139 | if (ipath_cmp24(psn, qp->s_next_psn) >= 0) | 1140 | if (ipath_cmp24(psn, qp->s_next_psn) >= 0) |
1140 | goto ack_done; | 1141 | goto ack_done; |
@@ -1159,6 +1160,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1159 | if (unlikely(qp->s_last == qp->s_tail)) | 1160 | if (unlikely(qp->s_last == qp->s_tail)) |
1160 | goto ack_done; | 1161 | goto ack_done; |
1161 | wqe = get_swqe_ptr(qp, qp->s_last); | 1162 | wqe = get_swqe_ptr(qp, qp->s_last); |
1163 | status = IB_WC_SUCCESS; | ||
1162 | 1164 | ||
1163 | switch (opcode) { | 1165 | switch (opcode) { |
1164 | case OP(ACKNOWLEDGE): | 1166 | case OP(ACKNOWLEDGE): |
@@ -1187,6 +1189,7 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1187 | wqe = get_swqe_ptr(qp, qp->s_last); | 1189 | wqe = get_swqe_ptr(qp, qp->s_last); |
1188 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1190 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
1189 | goto ack_op_err; | 1191 | goto ack_op_err; |
1192 | qp->r_flags &= ~IPATH_R_RDMAR_SEQ; | ||
1190 | /* | 1193 | /* |
1191 | * If this is a response to a resent RDMA read, we | 1194 | * If this is a response to a resent RDMA read, we |
1192 | * have to be careful to copy the data to the right | 1195 | * have to be careful to copy the data to the right |
@@ -1200,7 +1203,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1200 | /* no AETH, no ACK */ | 1203 | /* no AETH, no ACK */ |
1201 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1204 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
1202 | dev->n_rdma_seq++; | 1205 | dev->n_rdma_seq++; |
1203 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 1206 | if (qp->r_flags & IPATH_R_RDMAR_SEQ) |
1207 | goto ack_done; | ||
1208 | qp->r_flags |= IPATH_R_RDMAR_SEQ; | ||
1209 | ipath_restart_rc(qp, qp->s_last_psn + 1); | ||
1204 | goto ack_done; | 1210 | goto ack_done; |
1205 | } | 1211 | } |
1206 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1212 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
@@ -1261,7 +1267,10 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1261 | /* ACKs READ req. */ | 1267 | /* ACKs READ req. */ |
1262 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { | 1268 | if (unlikely(ipath_cmp24(psn, qp->s_last_psn + 1))) { |
1263 | dev->n_rdma_seq++; | 1269 | dev->n_rdma_seq++; |
1264 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 1270 | if (qp->r_flags & IPATH_R_RDMAR_SEQ) |
1271 | goto ack_done; | ||
1272 | qp->r_flags |= IPATH_R_RDMAR_SEQ; | ||
1273 | ipath_restart_rc(qp, qp->s_last_psn + 1); | ||
1265 | goto ack_done; | 1274 | goto ack_done; |
1266 | } | 1275 | } |
1267 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) | 1276 | if (unlikely(wqe->wr.opcode != IB_WR_RDMA_READ)) |
@@ -1291,31 +1300,16 @@ static inline void ipath_rc_rcv_resp(struct ipath_ibdev *dev, | |||
1291 | goto ack_done; | 1300 | goto ack_done; |
1292 | } | 1301 | } |
1293 | 1302 | ||
1294 | ack_done: | ||
1295 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1296 | goto bail; | ||
1297 | |||
1298 | ack_op_err: | 1303 | ack_op_err: |
1299 | wc.status = IB_WC_LOC_QP_OP_ERR; | 1304 | status = IB_WC_LOC_QP_OP_ERR; |
1300 | goto ack_err; | 1305 | goto ack_err; |
1301 | 1306 | ||
1302 | ack_len_err: | 1307 | ack_len_err: |
1303 | wc.status = IB_WC_LOC_LEN_ERR; | 1308 | status = IB_WC_LOC_LEN_ERR; |
1304 | ack_err: | 1309 | ack_err: |
1305 | wc.wr_id = wqe->wr.wr_id; | 1310 | ipath_send_complete(qp, wqe, status); |
1306 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 1311 | ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR); |
1307 | wc.vendor_err = 0; | 1312 | ack_done: |
1308 | wc.byte_len = 0; | ||
1309 | wc.imm_data = 0; | ||
1310 | wc.qp = &qp->ibqp; | ||
1311 | wc.src_qp = qp->remote_qpn; | ||
1312 | wc.wc_flags = 0; | ||
1313 | wc.pkey_index = 0; | ||
1314 | wc.slid = qp->remote_ah_attr.dlid; | ||
1315 | wc.sl = qp->remote_ah_attr.sl; | ||
1316 | wc.dlid_path_bits = 0; | ||
1317 | wc.port_num = 0; | ||
1318 | ipath_sqerror_qp(qp, &wc); | ||
1319 | spin_unlock_irqrestore(&qp->s_lock, flags); | 1313 | spin_unlock_irqrestore(&qp->s_lock, flags); |
1320 | bail: | 1314 | bail: |
1321 | return; | 1315 | return; |
@@ -1384,7 +1378,12 @@ static inline int ipath_rc_rcv_error(struct ipath_ibdev *dev, | |||
1384 | psn &= IPATH_PSN_MASK; | 1378 | psn &= IPATH_PSN_MASK; |
1385 | e = NULL; | 1379 | e = NULL; |
1386 | old_req = 1; | 1380 | old_req = 1; |
1381 | |||
1387 | spin_lock_irqsave(&qp->s_lock, flags); | 1382 | spin_lock_irqsave(&qp->s_lock, flags); |
1383 | /* Double check we can process this now that we hold the s_lock. */ | ||
1384 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) | ||
1385 | goto unlock_done; | ||
1386 | |||
1388 | for (i = qp->r_head_ack_queue; ; i = prev) { | 1387 | for (i = qp->r_head_ack_queue; ; i = prev) { |
1389 | if (i == qp->s_tail_ack_queue) | 1388 | if (i == qp->s_tail_ack_queue) |
1390 | old_req = 0; | 1389 | old_req = 0; |
@@ -1512,7 +1511,7 @@ static inline int ipath_rc_rcv_error(struct ipath_ibdev *dev, | |||
1512 | break; | 1511 | break; |
1513 | } | 1512 | } |
1514 | qp->r_nak_state = 0; | 1513 | qp->r_nak_state = 0; |
1515 | tasklet_hi_schedule(&qp->s_task); | 1514 | ipath_schedule_send(qp); |
1516 | 1515 | ||
1517 | unlock_done: | 1516 | unlock_done: |
1518 | spin_unlock_irqrestore(&qp->s_lock, flags); | 1517 | spin_unlock_irqrestore(&qp->s_lock, flags); |
@@ -1523,13 +1522,12 @@ send_ack: | |||
1523 | return 0; | 1522 | return 0; |
1524 | } | 1523 | } |
1525 | 1524 | ||
1526 | static void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err) | 1525 | void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err) |
1527 | { | 1526 | { |
1528 | unsigned long flags; | 1527 | unsigned long flags; |
1529 | int lastwqe; | 1528 | int lastwqe; |
1530 | 1529 | ||
1531 | spin_lock_irqsave(&qp->s_lock, flags); | 1530 | spin_lock_irqsave(&qp->s_lock, flags); |
1532 | qp->state = IB_QPS_ERR; | ||
1533 | lastwqe = ipath_error_qp(qp, err); | 1531 | lastwqe = ipath_error_qp(qp, err); |
1534 | spin_unlock_irqrestore(&qp->s_lock, flags); | 1532 | spin_unlock_irqrestore(&qp->s_lock, flags); |
1535 | 1533 | ||
@@ -1545,18 +1543,15 @@ static void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err) | |||
1545 | 1543 | ||
1546 | static inline void ipath_update_ack_queue(struct ipath_qp *qp, unsigned n) | 1544 | static inline void ipath_update_ack_queue(struct ipath_qp *qp, unsigned n) |
1547 | { | 1545 | { |
1548 | unsigned long flags; | ||
1549 | unsigned next; | 1546 | unsigned next; |
1550 | 1547 | ||
1551 | next = n + 1; | 1548 | next = n + 1; |
1552 | if (next > IPATH_MAX_RDMA_ATOMIC) | 1549 | if (next > IPATH_MAX_RDMA_ATOMIC) |
1553 | next = 0; | 1550 | next = 0; |
1554 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1555 | if (n == qp->s_tail_ack_queue) { | 1551 | if (n == qp->s_tail_ack_queue) { |
1556 | qp->s_tail_ack_queue = next; | 1552 | qp->s_tail_ack_queue = next; |
1557 | qp->s_ack_state = OP(ACKNOWLEDGE); | 1553 | qp->s_ack_state = OP(ACKNOWLEDGE); |
1558 | } | 1554 | } |
1559 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1560 | } | 1555 | } |
1561 | 1556 | ||
1562 | /** | 1557 | /** |
@@ -1585,6 +1580,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1585 | int diff; | 1580 | int diff; |
1586 | struct ib_reth *reth; | 1581 | struct ib_reth *reth; |
1587 | int header_in_data; | 1582 | int header_in_data; |
1583 | unsigned long flags; | ||
1588 | 1584 | ||
1589 | /* Validate the SLID. See Ch. 9.6.1.5 */ | 1585 | /* Validate the SLID. See Ch. 9.6.1.5 */ |
1590 | if (unlikely(be16_to_cpu(hdr->lrh[3]) != qp->remote_ah_attr.dlid)) | 1586 | if (unlikely(be16_to_cpu(hdr->lrh[3]) != qp->remote_ah_attr.dlid)) |
@@ -1643,11 +1639,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1643 | opcode == OP(SEND_LAST) || | 1639 | opcode == OP(SEND_LAST) || |
1644 | opcode == OP(SEND_LAST_WITH_IMMEDIATE)) | 1640 | opcode == OP(SEND_LAST_WITH_IMMEDIATE)) |
1645 | break; | 1641 | break; |
1646 | nack_inv: | 1642 | goto nack_inv; |
1647 | ipath_rc_error(qp, IB_WC_REM_INV_REQ_ERR); | ||
1648 | qp->r_nak_state = IB_NAK_INVALID_REQUEST; | ||
1649 | qp->r_ack_psn = qp->r_psn; | ||
1650 | goto send_ack; | ||
1651 | 1643 | ||
1652 | case OP(RDMA_WRITE_FIRST): | 1644 | case OP(RDMA_WRITE_FIRST): |
1653 | case OP(RDMA_WRITE_MIDDLE): | 1645 | case OP(RDMA_WRITE_MIDDLE): |
@@ -1673,18 +1665,13 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1673 | break; | 1665 | break; |
1674 | } | 1666 | } |
1675 | 1667 | ||
1676 | wc.imm_data = 0; | 1668 | memset(&wc, 0, sizeof wc); |
1677 | wc.wc_flags = 0; | ||
1678 | 1669 | ||
1679 | /* OK, process the packet. */ | 1670 | /* OK, process the packet. */ |
1680 | switch (opcode) { | 1671 | switch (opcode) { |
1681 | case OP(SEND_FIRST): | 1672 | case OP(SEND_FIRST): |
1682 | if (!ipath_get_rwqe(qp, 0)) { | 1673 | if (!ipath_get_rwqe(qp, 0)) |
1683 | rnr_nak: | 1674 | goto rnr_nak; |
1684 | qp->r_nak_state = IB_RNR_NAK | qp->r_min_rnr_timer; | ||
1685 | qp->r_ack_psn = qp->r_psn; | ||
1686 | goto send_ack; | ||
1687 | } | ||
1688 | qp->r_rcv_len = 0; | 1675 | qp->r_rcv_len = 0; |
1689 | /* FALLTHROUGH */ | 1676 | /* FALLTHROUGH */ |
1690 | case OP(SEND_MIDDLE): | 1677 | case OP(SEND_MIDDLE): |
@@ -1741,20 +1728,19 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1741 | goto nack_inv; | 1728 | goto nack_inv; |
1742 | ipath_copy_sge(&qp->r_sge, data, tlen); | 1729 | ipath_copy_sge(&qp->r_sge, data, tlen); |
1743 | qp->r_msn++; | 1730 | qp->r_msn++; |
1744 | if (!qp->r_wrid_valid) | 1731 | if (!test_and_clear_bit(IPATH_R_WRID_VALID, &qp->r_aflags)) |
1745 | break; | 1732 | break; |
1746 | qp->r_wrid_valid = 0; | ||
1747 | wc.wr_id = qp->r_wr_id; | 1733 | wc.wr_id = qp->r_wr_id; |
1748 | wc.status = IB_WC_SUCCESS; | 1734 | wc.status = IB_WC_SUCCESS; |
1749 | wc.opcode = IB_WC_RECV; | 1735 | if (opcode == OP(RDMA_WRITE_LAST_WITH_IMMEDIATE) || |
1750 | wc.vendor_err = 0; | 1736 | opcode == OP(RDMA_WRITE_ONLY_WITH_IMMEDIATE)) |
1737 | wc.opcode = IB_WC_RECV_RDMA_WITH_IMM; | ||
1738 | else | ||
1739 | wc.opcode = IB_WC_RECV; | ||
1751 | wc.qp = &qp->ibqp; | 1740 | wc.qp = &qp->ibqp; |
1752 | wc.src_qp = qp->remote_qpn; | 1741 | wc.src_qp = qp->remote_qpn; |
1753 | wc.pkey_index = 0; | ||
1754 | wc.slid = qp->remote_ah_attr.dlid; | 1742 | wc.slid = qp->remote_ah_attr.dlid; |
1755 | wc.sl = qp->remote_ah_attr.sl; | 1743 | wc.sl = qp->remote_ah_attr.sl; |
1756 | wc.dlid_path_bits = 0; | ||
1757 | wc.port_num = 0; | ||
1758 | /* Signal completion event if the solicited bit is set. */ | 1744 | /* Signal completion event if the solicited bit is set. */ |
1759 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, | 1745 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, |
1760 | (ohdr->bth[0] & | 1746 | (ohdr->bth[0] & |
@@ -1815,9 +1801,13 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1815 | next = qp->r_head_ack_queue + 1; | 1801 | next = qp->r_head_ack_queue + 1; |
1816 | if (next > IPATH_MAX_RDMA_ATOMIC) | 1802 | if (next > IPATH_MAX_RDMA_ATOMIC) |
1817 | next = 0; | 1803 | next = 0; |
1804 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1805 | /* Double check we can process this while holding the s_lock. */ | ||
1806 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) | ||
1807 | goto unlock; | ||
1818 | if (unlikely(next == qp->s_tail_ack_queue)) { | 1808 | if (unlikely(next == qp->s_tail_ack_queue)) { |
1819 | if (!qp->s_ack_queue[next].sent) | 1809 | if (!qp->s_ack_queue[next].sent) |
1820 | goto nack_inv; | 1810 | goto nack_inv_unlck; |
1821 | ipath_update_ack_queue(qp, next); | 1811 | ipath_update_ack_queue(qp, next); |
1822 | } | 1812 | } |
1823 | e = &qp->s_ack_queue[qp->r_head_ack_queue]; | 1813 | e = &qp->s_ack_queue[qp->r_head_ack_queue]; |
@@ -1838,7 +1828,7 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1838 | ok = ipath_rkey_ok(qp, &e->rdma_sge, len, vaddr, | 1828 | ok = ipath_rkey_ok(qp, &e->rdma_sge, len, vaddr, |
1839 | rkey, IB_ACCESS_REMOTE_READ); | 1829 | rkey, IB_ACCESS_REMOTE_READ); |
1840 | if (unlikely(!ok)) | 1830 | if (unlikely(!ok)) |
1841 | goto nack_acc; | 1831 | goto nack_acc_unlck; |
1842 | /* | 1832 | /* |
1843 | * Update the next expected PSN. We add 1 later | 1833 | * Update the next expected PSN. We add 1 later |
1844 | * below, so only add the remainder here. | 1834 | * below, so only add the remainder here. |
@@ -1865,13 +1855,12 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1865 | qp->r_psn++; | 1855 | qp->r_psn++; |
1866 | qp->r_state = opcode; | 1856 | qp->r_state = opcode; |
1867 | qp->r_nak_state = 0; | 1857 | qp->r_nak_state = 0; |
1868 | barrier(); | ||
1869 | qp->r_head_ack_queue = next; | 1858 | qp->r_head_ack_queue = next; |
1870 | 1859 | ||
1871 | /* Call ipath_do_rc_send() in another thread. */ | 1860 | /* Schedule the send tasklet. */ |
1872 | tasklet_hi_schedule(&qp->s_task); | 1861 | ipath_schedule_send(qp); |
1873 | 1862 | ||
1874 | goto done; | 1863 | goto unlock; |
1875 | } | 1864 | } |
1876 | 1865 | ||
1877 | case OP(COMPARE_SWAP): | 1866 | case OP(COMPARE_SWAP): |
@@ -1890,9 +1879,13 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1890 | next = qp->r_head_ack_queue + 1; | 1879 | next = qp->r_head_ack_queue + 1; |
1891 | if (next > IPATH_MAX_RDMA_ATOMIC) | 1880 | if (next > IPATH_MAX_RDMA_ATOMIC) |
1892 | next = 0; | 1881 | next = 0; |
1882 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1883 | /* Double check we can process this while holding the s_lock. */ | ||
1884 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) | ||
1885 | goto unlock; | ||
1893 | if (unlikely(next == qp->s_tail_ack_queue)) { | 1886 | if (unlikely(next == qp->s_tail_ack_queue)) { |
1894 | if (!qp->s_ack_queue[next].sent) | 1887 | if (!qp->s_ack_queue[next].sent) |
1895 | goto nack_inv; | 1888 | goto nack_inv_unlck; |
1896 | ipath_update_ack_queue(qp, next); | 1889 | ipath_update_ack_queue(qp, next); |
1897 | } | 1890 | } |
1898 | if (!header_in_data) | 1891 | if (!header_in_data) |
@@ -1902,13 +1895,13 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1902 | vaddr = ((u64) be32_to_cpu(ateth->vaddr[0]) << 32) | | 1895 | vaddr = ((u64) be32_to_cpu(ateth->vaddr[0]) << 32) | |
1903 | be32_to_cpu(ateth->vaddr[1]); | 1896 | be32_to_cpu(ateth->vaddr[1]); |
1904 | if (unlikely(vaddr & (sizeof(u64) - 1))) | 1897 | if (unlikely(vaddr & (sizeof(u64) - 1))) |
1905 | goto nack_inv; | 1898 | goto nack_inv_unlck; |
1906 | rkey = be32_to_cpu(ateth->rkey); | 1899 | rkey = be32_to_cpu(ateth->rkey); |
1907 | /* Check rkey & NAK */ | 1900 | /* Check rkey & NAK */ |
1908 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, | 1901 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, |
1909 | sizeof(u64), vaddr, rkey, | 1902 | sizeof(u64), vaddr, rkey, |
1910 | IB_ACCESS_REMOTE_ATOMIC))) | 1903 | IB_ACCESS_REMOTE_ATOMIC))) |
1911 | goto nack_acc; | 1904 | goto nack_acc_unlck; |
1912 | /* Perform atomic OP and save result. */ | 1905 | /* Perform atomic OP and save result. */ |
1913 | maddr = (atomic64_t *) qp->r_sge.sge.vaddr; | 1906 | maddr = (atomic64_t *) qp->r_sge.sge.vaddr; |
1914 | sdata = be64_to_cpu(ateth->swap_data); | 1907 | sdata = be64_to_cpu(ateth->swap_data); |
@@ -1925,13 +1918,12 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1925 | qp->r_psn++; | 1918 | qp->r_psn++; |
1926 | qp->r_state = opcode; | 1919 | qp->r_state = opcode; |
1927 | qp->r_nak_state = 0; | 1920 | qp->r_nak_state = 0; |
1928 | barrier(); | ||
1929 | qp->r_head_ack_queue = next; | 1921 | qp->r_head_ack_queue = next; |
1930 | 1922 | ||
1931 | /* Call ipath_do_rc_send() in another thread. */ | 1923 | /* Schedule the send tasklet. */ |
1932 | tasklet_hi_schedule(&qp->s_task); | 1924 | ipath_schedule_send(qp); |
1933 | 1925 | ||
1934 | goto done; | 1926 | goto unlock; |
1935 | } | 1927 | } |
1936 | 1928 | ||
1937 | default: | 1929 | default: |
@@ -1947,14 +1939,31 @@ void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
1947 | goto send_ack; | 1939 | goto send_ack; |
1948 | goto done; | 1940 | goto done; |
1949 | 1941 | ||
1942 | rnr_nak: | ||
1943 | qp->r_nak_state = IB_RNR_NAK | qp->r_min_rnr_timer; | ||
1944 | qp->r_ack_psn = qp->r_psn; | ||
1945 | goto send_ack; | ||
1946 | |||
1947 | nack_inv_unlck: | ||
1948 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1949 | nack_inv: | ||
1950 | ipath_rc_error(qp, IB_WC_LOC_QP_OP_ERR); | ||
1951 | qp->r_nak_state = IB_NAK_INVALID_REQUEST; | ||
1952 | qp->r_ack_psn = qp->r_psn; | ||
1953 | goto send_ack; | ||
1954 | |||
1955 | nack_acc_unlck: | ||
1956 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1950 | nack_acc: | 1957 | nack_acc: |
1951 | ipath_rc_error(qp, IB_WC_REM_ACCESS_ERR); | 1958 | ipath_rc_error(qp, IB_WC_LOC_PROT_ERR); |
1952 | qp->r_nak_state = IB_NAK_REMOTE_ACCESS_ERROR; | 1959 | qp->r_nak_state = IB_NAK_REMOTE_ACCESS_ERROR; |
1953 | qp->r_ack_psn = qp->r_psn; | 1960 | qp->r_ack_psn = qp->r_psn; |
1954 | |||
1955 | send_ack: | 1961 | send_ack: |
1956 | send_rc_ack(qp); | 1962 | send_rc_ack(qp); |
1963 | goto done; | ||
1957 | 1964 | ||
1965 | unlock: | ||
1966 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1958 | done: | 1967 | done: |
1959 | return; | 1968 | return; |
1960 | } | 1969 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_ruc.c b/drivers/infiniband/hw/ipath/ipath_ruc.c index 8ac5c1d82ccd..a4b5521567fe 100644 --- a/drivers/infiniband/hw/ipath/ipath_ruc.c +++ b/drivers/infiniband/hw/ipath/ipath_ruc.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved. | 2 | * Copyright (c) 2006, 2007, 2008 QLogic Corporation. All rights reserved. |
3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. | 3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. |
4 | * | 4 | * |
5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
@@ -78,6 +78,7 @@ const u32 ib_ipath_rnr_table[32] = { | |||
78 | * ipath_insert_rnr_queue - put QP on the RNR timeout list for the device | 78 | * ipath_insert_rnr_queue - put QP on the RNR timeout list for the device |
79 | * @qp: the QP | 79 | * @qp: the QP |
80 | * | 80 | * |
81 | * Called with the QP s_lock held and interrupts disabled. | ||
81 | * XXX Use a simple list for now. We might need a priority | 82 | * XXX Use a simple list for now. We might need a priority |
82 | * queue if we have lots of QPs waiting for RNR timeouts | 83 | * queue if we have lots of QPs waiting for RNR timeouts |
83 | * but that should be rare. | 84 | * but that should be rare. |
@@ -85,9 +86,9 @@ const u32 ib_ipath_rnr_table[32] = { | |||
85 | void ipath_insert_rnr_queue(struct ipath_qp *qp) | 86 | void ipath_insert_rnr_queue(struct ipath_qp *qp) |
86 | { | 87 | { |
87 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | 88 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); |
88 | unsigned long flags; | ||
89 | 89 | ||
90 | spin_lock_irqsave(&dev->pending_lock, flags); | 90 | /* We already did a spin_lock_irqsave(), so just use spin_lock */ |
91 | spin_lock(&dev->pending_lock); | ||
91 | if (list_empty(&dev->rnrwait)) | 92 | if (list_empty(&dev->rnrwait)) |
92 | list_add(&qp->timerwait, &dev->rnrwait); | 93 | list_add(&qp->timerwait, &dev->rnrwait); |
93 | else { | 94 | else { |
@@ -109,7 +110,7 @@ void ipath_insert_rnr_queue(struct ipath_qp *qp) | |||
109 | nqp->s_rnr_timeout -= qp->s_rnr_timeout; | 110 | nqp->s_rnr_timeout -= qp->s_rnr_timeout; |
110 | list_add(&qp->timerwait, l); | 111 | list_add(&qp->timerwait, l); |
111 | } | 112 | } |
112 | spin_unlock_irqrestore(&dev->pending_lock, flags); | 113 | spin_unlock(&dev->pending_lock); |
113 | } | 114 | } |
114 | 115 | ||
115 | /** | 116 | /** |
@@ -140,20 +141,11 @@ int ipath_init_sge(struct ipath_qp *qp, struct ipath_rwqe *wqe, | |||
140 | goto bail; | 141 | goto bail; |
141 | 142 | ||
142 | bad_lkey: | 143 | bad_lkey: |
144 | memset(&wc, 0, sizeof(wc)); | ||
143 | wc.wr_id = wqe->wr_id; | 145 | wc.wr_id = wqe->wr_id; |
144 | wc.status = IB_WC_LOC_PROT_ERR; | 146 | wc.status = IB_WC_LOC_PROT_ERR; |
145 | wc.opcode = IB_WC_RECV; | 147 | wc.opcode = IB_WC_RECV; |
146 | wc.vendor_err = 0; | ||
147 | wc.byte_len = 0; | ||
148 | wc.imm_data = 0; | ||
149 | wc.qp = &qp->ibqp; | 148 | wc.qp = &qp->ibqp; |
150 | wc.src_qp = 0; | ||
151 | wc.wc_flags = 0; | ||
152 | wc.pkey_index = 0; | ||
153 | wc.slid = 0; | ||
154 | wc.sl = 0; | ||
155 | wc.dlid_path_bits = 0; | ||
156 | wc.port_num = 0; | ||
157 | /* Signal solicited completion event. */ | 149 | /* Signal solicited completion event. */ |
158 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); | 150 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1); |
159 | ret = 0; | 151 | ret = 0; |
@@ -194,6 +186,11 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
194 | } | 186 | } |
195 | 187 | ||
196 | spin_lock_irqsave(&rq->lock, flags); | 188 | spin_lock_irqsave(&rq->lock, flags); |
189 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) { | ||
190 | ret = 0; | ||
191 | goto unlock; | ||
192 | } | ||
193 | |||
197 | wq = rq->wq; | 194 | wq = rq->wq; |
198 | tail = wq->tail; | 195 | tail = wq->tail; |
199 | /* Validate tail before using it since it is user writable. */ | 196 | /* Validate tail before using it since it is user writable. */ |
@@ -201,9 +198,8 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
201 | tail = 0; | 198 | tail = 0; |
202 | do { | 199 | do { |
203 | if (unlikely(tail == wq->head)) { | 200 | if (unlikely(tail == wq->head)) { |
204 | spin_unlock_irqrestore(&rq->lock, flags); | ||
205 | ret = 0; | 201 | ret = 0; |
206 | goto bail; | 202 | goto unlock; |
207 | } | 203 | } |
208 | /* Make sure entry is read after head index is read. */ | 204 | /* Make sure entry is read after head index is read. */ |
209 | smp_rmb(); | 205 | smp_rmb(); |
@@ -216,7 +212,7 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
216 | wq->tail = tail; | 212 | wq->tail = tail; |
217 | 213 | ||
218 | ret = 1; | 214 | ret = 1; |
219 | qp->r_wrid_valid = 1; | 215 | set_bit(IPATH_R_WRID_VALID, &qp->r_aflags); |
220 | if (handler) { | 216 | if (handler) { |
221 | u32 n; | 217 | u32 n; |
222 | 218 | ||
@@ -243,8 +239,8 @@ int ipath_get_rwqe(struct ipath_qp *qp, int wr_id_only) | |||
243 | goto bail; | 239 | goto bail; |
244 | } | 240 | } |
245 | } | 241 | } |
242 | unlock: | ||
246 | spin_unlock_irqrestore(&rq->lock, flags); | 243 | spin_unlock_irqrestore(&rq->lock, flags); |
247 | |||
248 | bail: | 244 | bail: |
249 | return ret; | 245 | return ret; |
250 | } | 246 | } |
@@ -270,38 +266,63 @@ static void ipath_ruc_loopback(struct ipath_qp *sqp) | |||
270 | struct ib_wc wc; | 266 | struct ib_wc wc; |
271 | u64 sdata; | 267 | u64 sdata; |
272 | atomic64_t *maddr; | 268 | atomic64_t *maddr; |
269 | enum ib_wc_status send_status; | ||
273 | 270 | ||
271 | /* | ||
272 | * Note that we check the responder QP state after | ||
273 | * checking the requester's state. | ||
274 | */ | ||
274 | qp = ipath_lookup_qpn(&dev->qp_table, sqp->remote_qpn); | 275 | qp = ipath_lookup_qpn(&dev->qp_table, sqp->remote_qpn); |
275 | if (!qp) { | ||
276 | dev->n_pkt_drops++; | ||
277 | return; | ||
278 | } | ||
279 | 276 | ||
280 | again: | ||
281 | spin_lock_irqsave(&sqp->s_lock, flags); | 277 | spin_lock_irqsave(&sqp->s_lock, flags); |
282 | 278 | ||
283 | if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_SEND_OK) || | 279 | /* Return if we are already busy processing a work request. */ |
284 | sqp->s_rnr_timeout) { | 280 | if ((sqp->s_flags & (IPATH_S_BUSY | IPATH_S_ANY_WAIT)) || |
285 | spin_unlock_irqrestore(&sqp->s_lock, flags); | 281 | !(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_OR_FLUSH_SEND)) |
286 | goto done; | 282 | goto unlock; |
287 | } | ||
288 | 283 | ||
289 | /* Get the next send request. */ | 284 | sqp->s_flags |= IPATH_S_BUSY; |
290 | if (sqp->s_last == sqp->s_head) { | 285 | |
291 | /* Send work queue is empty. */ | 286 | again: |
292 | spin_unlock_irqrestore(&sqp->s_lock, flags); | 287 | if (sqp->s_last == sqp->s_head) |
293 | goto done; | 288 | goto clr_busy; |
289 | wqe = get_swqe_ptr(sqp, sqp->s_last); | ||
290 | |||
291 | /* Return if it is not OK to start a new work reqeust. */ | ||
292 | if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_NEXT_SEND_OK)) { | ||
293 | if (!(ib_ipath_state_ops[sqp->state] & IPATH_FLUSH_SEND)) | ||
294 | goto clr_busy; | ||
295 | /* We are in the error state, flush the work request. */ | ||
296 | send_status = IB_WC_WR_FLUSH_ERR; | ||
297 | goto flush_send; | ||
294 | } | 298 | } |
295 | 299 | ||
296 | /* | 300 | /* |
297 | * We can rely on the entry not changing without the s_lock | 301 | * We can rely on the entry not changing without the s_lock |
298 | * being held until we update s_last. | 302 | * being held until we update s_last. |
303 | * We increment s_cur to indicate s_last is in progress. | ||
299 | */ | 304 | */ |
300 | wqe = get_swqe_ptr(sqp, sqp->s_last); | 305 | if (sqp->s_last == sqp->s_cur) { |
306 | if (++sqp->s_cur >= sqp->s_size) | ||
307 | sqp->s_cur = 0; | ||
308 | } | ||
301 | spin_unlock_irqrestore(&sqp->s_lock, flags); | 309 | spin_unlock_irqrestore(&sqp->s_lock, flags); |
302 | 310 | ||
303 | wc.wc_flags = 0; | 311 | if (!qp || !(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) { |
304 | wc.imm_data = 0; | 312 | dev->n_pkt_drops++; |
313 | /* | ||
314 | * For RC, the requester would timeout and retry so | ||
315 | * shortcut the timeouts and just signal too many retries. | ||
316 | */ | ||
317 | if (sqp->ibqp.qp_type == IB_QPT_RC) | ||
318 | send_status = IB_WC_RETRY_EXC_ERR; | ||
319 | else | ||
320 | send_status = IB_WC_SUCCESS; | ||
321 | goto serr; | ||
322 | } | ||
323 | |||
324 | memset(&wc, 0, sizeof wc); | ||
325 | send_status = IB_WC_SUCCESS; | ||
305 | 326 | ||
306 | sqp->s_sge.sge = wqe->sg_list[0]; | 327 | sqp->s_sge.sge = wqe->sg_list[0]; |
307 | sqp->s_sge.sg_list = wqe->sg_list + 1; | 328 | sqp->s_sge.sg_list = wqe->sg_list + 1; |
@@ -313,75 +334,33 @@ again: | |||
313 | wc.imm_data = wqe->wr.ex.imm_data; | 334 | wc.imm_data = wqe->wr.ex.imm_data; |
314 | /* FALLTHROUGH */ | 335 | /* FALLTHROUGH */ |
315 | case IB_WR_SEND: | 336 | case IB_WR_SEND: |
316 | if (!ipath_get_rwqe(qp, 0)) { | 337 | if (!ipath_get_rwqe(qp, 0)) |
317 | rnr_nak: | 338 | goto rnr_nak; |
318 | /* Handle RNR NAK */ | ||
319 | if (qp->ibqp.qp_type == IB_QPT_UC) | ||
320 | goto send_comp; | ||
321 | if (sqp->s_rnr_retry == 0) { | ||
322 | wc.status = IB_WC_RNR_RETRY_EXC_ERR; | ||
323 | goto err; | ||
324 | } | ||
325 | if (sqp->s_rnr_retry_cnt < 7) | ||
326 | sqp->s_rnr_retry--; | ||
327 | dev->n_rnr_naks++; | ||
328 | sqp->s_rnr_timeout = | ||
329 | ib_ipath_rnr_table[qp->r_min_rnr_timer]; | ||
330 | ipath_insert_rnr_queue(sqp); | ||
331 | goto done; | ||
332 | } | ||
333 | break; | 339 | break; |
334 | 340 | ||
335 | case IB_WR_RDMA_WRITE_WITH_IMM: | 341 | case IB_WR_RDMA_WRITE_WITH_IMM: |
336 | if (unlikely(!(qp->qp_access_flags & | 342 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_WRITE))) |
337 | IB_ACCESS_REMOTE_WRITE))) { | 343 | goto inv_err; |
338 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
339 | goto err; | ||
340 | } | ||
341 | wc.wc_flags = IB_WC_WITH_IMM; | 344 | wc.wc_flags = IB_WC_WITH_IMM; |
342 | wc.imm_data = wqe->wr.ex.imm_data; | 345 | wc.imm_data = wqe->wr.ex.imm_data; |
343 | if (!ipath_get_rwqe(qp, 1)) | 346 | if (!ipath_get_rwqe(qp, 1)) |
344 | goto rnr_nak; | 347 | goto rnr_nak; |
345 | /* FALLTHROUGH */ | 348 | /* FALLTHROUGH */ |
346 | case IB_WR_RDMA_WRITE: | 349 | case IB_WR_RDMA_WRITE: |
347 | if (unlikely(!(qp->qp_access_flags & | 350 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_WRITE))) |
348 | IB_ACCESS_REMOTE_WRITE))) { | 351 | goto inv_err; |
349 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
350 | goto err; | ||
351 | } | ||
352 | if (wqe->length == 0) | 352 | if (wqe->length == 0) |
353 | break; | 353 | break; |
354 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length, | 354 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, wqe->length, |
355 | wqe->wr.wr.rdma.remote_addr, | 355 | wqe->wr.wr.rdma.remote_addr, |
356 | wqe->wr.wr.rdma.rkey, | 356 | wqe->wr.wr.rdma.rkey, |
357 | IB_ACCESS_REMOTE_WRITE))) { | 357 | IB_ACCESS_REMOTE_WRITE))) |
358 | acc_err: | 358 | goto acc_err; |
359 | wc.status = IB_WC_REM_ACCESS_ERR; | ||
360 | err: | ||
361 | wc.wr_id = wqe->wr.wr_id; | ||
362 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | ||
363 | wc.vendor_err = 0; | ||
364 | wc.byte_len = 0; | ||
365 | wc.qp = &sqp->ibqp; | ||
366 | wc.src_qp = sqp->remote_qpn; | ||
367 | wc.pkey_index = 0; | ||
368 | wc.slid = sqp->remote_ah_attr.dlid; | ||
369 | wc.sl = sqp->remote_ah_attr.sl; | ||
370 | wc.dlid_path_bits = 0; | ||
371 | wc.port_num = 0; | ||
372 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
373 | ipath_sqerror_qp(sqp, &wc); | ||
374 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
375 | goto done; | ||
376 | } | ||
377 | break; | 359 | break; |
378 | 360 | ||
379 | case IB_WR_RDMA_READ: | 361 | case IB_WR_RDMA_READ: |
380 | if (unlikely(!(qp->qp_access_flags & | 362 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_READ))) |
381 | IB_ACCESS_REMOTE_READ))) { | 363 | goto inv_err; |
382 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
383 | goto err; | ||
384 | } | ||
385 | if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length, | 364 | if (unlikely(!ipath_rkey_ok(qp, &sqp->s_sge, wqe->length, |
386 | wqe->wr.wr.rdma.remote_addr, | 365 | wqe->wr.wr.rdma.remote_addr, |
387 | wqe->wr.wr.rdma.rkey, | 366 | wqe->wr.wr.rdma.rkey, |
@@ -394,11 +373,8 @@ again: | |||
394 | 373 | ||
395 | case IB_WR_ATOMIC_CMP_AND_SWP: | 374 | case IB_WR_ATOMIC_CMP_AND_SWP: |
396 | case IB_WR_ATOMIC_FETCH_AND_ADD: | 375 | case IB_WR_ATOMIC_FETCH_AND_ADD: |
397 | if (unlikely(!(qp->qp_access_flags & | 376 | if (unlikely(!(qp->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC))) |
398 | IB_ACCESS_REMOTE_ATOMIC))) { | 377 | goto inv_err; |
399 | wc.status = IB_WC_REM_INV_REQ_ERR; | ||
400 | goto err; | ||
401 | } | ||
402 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64), | 378 | if (unlikely(!ipath_rkey_ok(qp, &qp->r_sge, sizeof(u64), |
403 | wqe->wr.wr.atomic.remote_addr, | 379 | wqe->wr.wr.atomic.remote_addr, |
404 | wqe->wr.wr.atomic.rkey, | 380 | wqe->wr.wr.atomic.rkey, |
@@ -415,7 +391,8 @@ again: | |||
415 | goto send_comp; | 391 | goto send_comp; |
416 | 392 | ||
417 | default: | 393 | default: |
418 | goto done; | 394 | send_status = IB_WC_LOC_QP_OP_ERR; |
395 | goto serr; | ||
419 | } | 396 | } |
420 | 397 | ||
421 | sge = &sqp->s_sge.sge; | 398 | sge = &sqp->s_sge.sge; |
@@ -448,8 +425,7 @@ again: | |||
448 | sqp->s_len -= len; | 425 | sqp->s_len -= len; |
449 | } | 426 | } |
450 | 427 | ||
451 | if (wqe->wr.opcode == IB_WR_RDMA_WRITE || | 428 | if (!test_and_clear_bit(IPATH_R_WRID_VALID, &qp->r_aflags)) |
452 | wqe->wr.opcode == IB_WR_RDMA_READ) | ||
453 | goto send_comp; | 429 | goto send_comp; |
454 | 430 | ||
455 | if (wqe->wr.opcode == IB_WR_RDMA_WRITE_WITH_IMM) | 431 | if (wqe->wr.opcode == IB_WR_RDMA_WRITE_WITH_IMM) |
@@ -458,32 +434,89 @@ again: | |||
458 | wc.opcode = IB_WC_RECV; | 434 | wc.opcode = IB_WC_RECV; |
459 | wc.wr_id = qp->r_wr_id; | 435 | wc.wr_id = qp->r_wr_id; |
460 | wc.status = IB_WC_SUCCESS; | 436 | wc.status = IB_WC_SUCCESS; |
461 | wc.vendor_err = 0; | ||
462 | wc.byte_len = wqe->length; | 437 | wc.byte_len = wqe->length; |
463 | wc.qp = &qp->ibqp; | 438 | wc.qp = &qp->ibqp; |
464 | wc.src_qp = qp->remote_qpn; | 439 | wc.src_qp = qp->remote_qpn; |
465 | wc.pkey_index = 0; | ||
466 | wc.slid = qp->remote_ah_attr.dlid; | 440 | wc.slid = qp->remote_ah_attr.dlid; |
467 | wc.sl = qp->remote_ah_attr.sl; | 441 | wc.sl = qp->remote_ah_attr.sl; |
468 | wc.dlid_path_bits = 0; | ||
469 | wc.port_num = 1; | 442 | wc.port_num = 1; |
470 | /* Signal completion event if the solicited bit is set. */ | 443 | /* Signal completion event if the solicited bit is set. */ |
471 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, | 444 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, |
472 | wqe->wr.send_flags & IB_SEND_SOLICITED); | 445 | wqe->wr.send_flags & IB_SEND_SOLICITED); |
473 | 446 | ||
474 | send_comp: | 447 | send_comp: |
448 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
449 | flush_send: | ||
475 | sqp->s_rnr_retry = sqp->s_rnr_retry_cnt; | 450 | sqp->s_rnr_retry = sqp->s_rnr_retry_cnt; |
476 | ipath_send_complete(sqp, wqe, IB_WC_SUCCESS); | 451 | ipath_send_complete(sqp, wqe, send_status); |
477 | goto again; | 452 | goto again; |
478 | 453 | ||
454 | rnr_nak: | ||
455 | /* Handle RNR NAK */ | ||
456 | if (qp->ibqp.qp_type == IB_QPT_UC) | ||
457 | goto send_comp; | ||
458 | /* | ||
459 | * Note: we don't need the s_lock held since the BUSY flag | ||
460 | * makes this single threaded. | ||
461 | */ | ||
462 | if (sqp->s_rnr_retry == 0) { | ||
463 | send_status = IB_WC_RNR_RETRY_EXC_ERR; | ||
464 | goto serr; | ||
465 | } | ||
466 | if (sqp->s_rnr_retry_cnt < 7) | ||
467 | sqp->s_rnr_retry--; | ||
468 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
469 | if (!(ib_ipath_state_ops[sqp->state] & IPATH_PROCESS_RECV_OK)) | ||
470 | goto clr_busy; | ||
471 | sqp->s_flags |= IPATH_S_WAITING; | ||
472 | dev->n_rnr_naks++; | ||
473 | sqp->s_rnr_timeout = ib_ipath_rnr_table[qp->r_min_rnr_timer]; | ||
474 | ipath_insert_rnr_queue(sqp); | ||
475 | goto clr_busy; | ||
476 | |||
477 | inv_err: | ||
478 | send_status = IB_WC_REM_INV_REQ_ERR; | ||
479 | wc.status = IB_WC_LOC_QP_OP_ERR; | ||
480 | goto err; | ||
481 | |||
482 | acc_err: | ||
483 | send_status = IB_WC_REM_ACCESS_ERR; | ||
484 | wc.status = IB_WC_LOC_PROT_ERR; | ||
485 | err: | ||
486 | /* responder goes to error state */ | ||
487 | ipath_rc_error(qp, wc.status); | ||
488 | |||
489 | serr: | ||
490 | spin_lock_irqsave(&sqp->s_lock, flags); | ||
491 | ipath_send_complete(sqp, wqe, send_status); | ||
492 | if (sqp->ibqp.qp_type == IB_QPT_RC) { | ||
493 | int lastwqe = ipath_error_qp(sqp, IB_WC_WR_FLUSH_ERR); | ||
494 | |||
495 | sqp->s_flags &= ~IPATH_S_BUSY; | ||
496 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
497 | if (lastwqe) { | ||
498 | struct ib_event ev; | ||
499 | |||
500 | ev.device = sqp->ibqp.device; | ||
501 | ev.element.qp = &sqp->ibqp; | ||
502 | ev.event = IB_EVENT_QP_LAST_WQE_REACHED; | ||
503 | sqp->ibqp.event_handler(&ev, sqp->ibqp.qp_context); | ||
504 | } | ||
505 | goto done; | ||
506 | } | ||
507 | clr_busy: | ||
508 | sqp->s_flags &= ~IPATH_S_BUSY; | ||
509 | unlock: | ||
510 | spin_unlock_irqrestore(&sqp->s_lock, flags); | ||
479 | done: | 511 | done: |
480 | if (atomic_dec_and_test(&qp->refcount)) | 512 | if (qp && atomic_dec_and_test(&qp->refcount)) |
481 | wake_up(&qp->wait); | 513 | wake_up(&qp->wait); |
482 | } | 514 | } |
483 | 515 | ||
484 | static void want_buffer(struct ipath_devdata *dd) | 516 | static void want_buffer(struct ipath_devdata *dd, struct ipath_qp *qp) |
485 | { | 517 | { |
486 | if (!(dd->ipath_flags & IPATH_HAS_SEND_DMA)) { | 518 | if (!(dd->ipath_flags & IPATH_HAS_SEND_DMA) || |
519 | qp->ibqp.qp_type == IB_QPT_SMI) { | ||
487 | unsigned long flags; | 520 | unsigned long flags; |
488 | 521 | ||
489 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | 522 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); |
@@ -501,26 +534,36 @@ static void want_buffer(struct ipath_devdata *dd) | |||
501 | * @dev: the device we ran out of buffers on | 534 | * @dev: the device we ran out of buffers on |
502 | * | 535 | * |
503 | * Called when we run out of PIO buffers. | 536 | * Called when we run out of PIO buffers. |
537 | * If we are now in the error state, return zero to flush the | ||
538 | * send work request. | ||
504 | */ | 539 | */ |
505 | static void ipath_no_bufs_available(struct ipath_qp *qp, | 540 | static int ipath_no_bufs_available(struct ipath_qp *qp, |
506 | struct ipath_ibdev *dev) | 541 | struct ipath_ibdev *dev) |
507 | { | 542 | { |
508 | unsigned long flags; | 543 | unsigned long flags; |
544 | int ret = 1; | ||
509 | 545 | ||
510 | /* | 546 | /* |
511 | * Note that as soon as want_buffer() is called and | 547 | * Note that as soon as want_buffer() is called and |
512 | * possibly before it returns, ipath_ib_piobufavail() | 548 | * possibly before it returns, ipath_ib_piobufavail() |
513 | * could be called. If we are still in the tasklet function, | 549 | * could be called. Therefore, put QP on the piowait list before |
514 | * tasklet_hi_schedule() will not call us until the next time | 550 | * enabling the PIO avail interrupt. |
515 | * tasklet_hi_schedule() is called. | ||
516 | * We leave the busy flag set so that another post send doesn't | ||
517 | * try to put the same QP on the piowait list again. | ||
518 | */ | 551 | */ |
519 | spin_lock_irqsave(&dev->pending_lock, flags); | 552 | spin_lock_irqsave(&qp->s_lock, flags); |
520 | list_add_tail(&qp->piowait, &dev->piowait); | 553 | if (ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK) { |
521 | spin_unlock_irqrestore(&dev->pending_lock, flags); | 554 | dev->n_piowait++; |
522 | want_buffer(dev->dd); | 555 | qp->s_flags |= IPATH_S_WAITING; |
523 | dev->n_piowait++; | 556 | qp->s_flags &= ~IPATH_S_BUSY; |
557 | spin_lock(&dev->pending_lock); | ||
558 | if (list_empty(&qp->piowait)) | ||
559 | list_add_tail(&qp->piowait, &dev->piowait); | ||
560 | spin_unlock(&dev->pending_lock); | ||
561 | } else | ||
562 | ret = 0; | ||
563 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
564 | if (ret) | ||
565 | want_buffer(dev->dd, qp); | ||
566 | return ret; | ||
524 | } | 567 | } |
525 | 568 | ||
526 | /** | 569 | /** |
@@ -596,15 +639,13 @@ void ipath_do_send(unsigned long data) | |||
596 | struct ipath_qp *qp = (struct ipath_qp *)data; | 639 | struct ipath_qp *qp = (struct ipath_qp *)data; |
597 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | 640 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); |
598 | int (*make_req)(struct ipath_qp *qp); | 641 | int (*make_req)(struct ipath_qp *qp); |
599 | 642 | unsigned long flags; | |
600 | if (test_and_set_bit(IPATH_S_BUSY, &qp->s_busy)) | ||
601 | goto bail; | ||
602 | 643 | ||
603 | if ((qp->ibqp.qp_type == IB_QPT_RC || | 644 | if ((qp->ibqp.qp_type == IB_QPT_RC || |
604 | qp->ibqp.qp_type == IB_QPT_UC) && | 645 | qp->ibqp.qp_type == IB_QPT_UC) && |
605 | qp->remote_ah_attr.dlid == dev->dd->ipath_lid) { | 646 | qp->remote_ah_attr.dlid == dev->dd->ipath_lid) { |
606 | ipath_ruc_loopback(qp); | 647 | ipath_ruc_loopback(qp); |
607 | goto clear; | 648 | goto bail; |
608 | } | 649 | } |
609 | 650 | ||
610 | if (qp->ibqp.qp_type == IB_QPT_RC) | 651 | if (qp->ibqp.qp_type == IB_QPT_RC) |
@@ -614,6 +655,19 @@ void ipath_do_send(unsigned long data) | |||
614 | else | 655 | else |
615 | make_req = ipath_make_ud_req; | 656 | make_req = ipath_make_ud_req; |
616 | 657 | ||
658 | spin_lock_irqsave(&qp->s_lock, flags); | ||
659 | |||
660 | /* Return if we are already busy processing a work request. */ | ||
661 | if ((qp->s_flags & (IPATH_S_BUSY | IPATH_S_ANY_WAIT)) || | ||
662 | !(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_OR_FLUSH_SEND)) { | ||
663 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
664 | goto bail; | ||
665 | } | ||
666 | |||
667 | qp->s_flags |= IPATH_S_BUSY; | ||
668 | |||
669 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
670 | |||
617 | again: | 671 | again: |
618 | /* Check for a constructed packet to be sent. */ | 672 | /* Check for a constructed packet to be sent. */ |
619 | if (qp->s_hdrwords != 0) { | 673 | if (qp->s_hdrwords != 0) { |
@@ -623,8 +677,8 @@ again: | |||
623 | */ | 677 | */ |
624 | if (ipath_verbs_send(qp, &qp->s_hdr, qp->s_hdrwords, | 678 | if (ipath_verbs_send(qp, &qp->s_hdr, qp->s_hdrwords, |
625 | qp->s_cur_sge, qp->s_cur_size)) { | 679 | qp->s_cur_sge, qp->s_cur_size)) { |
626 | ipath_no_bufs_available(qp, dev); | 680 | if (ipath_no_bufs_available(qp, dev)) |
627 | goto bail; | 681 | goto bail; |
628 | } | 682 | } |
629 | dev->n_unicast_xmit++; | 683 | dev->n_unicast_xmit++; |
630 | /* Record that we sent the packet and s_hdr is empty. */ | 684 | /* Record that we sent the packet and s_hdr is empty. */ |
@@ -633,16 +687,20 @@ again: | |||
633 | 687 | ||
634 | if (make_req(qp)) | 688 | if (make_req(qp)) |
635 | goto again; | 689 | goto again; |
636 | clear: | 690 | |
637 | clear_bit(IPATH_S_BUSY, &qp->s_busy); | ||
638 | bail:; | 691 | bail:; |
639 | } | 692 | } |
640 | 693 | ||
694 | /* | ||
695 | * This should be called with s_lock held. | ||
696 | */ | ||
641 | void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe, | 697 | void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe, |
642 | enum ib_wc_status status) | 698 | enum ib_wc_status status) |
643 | { | 699 | { |
644 | unsigned long flags; | 700 | u32 old_last, last; |
645 | u32 last; | 701 | |
702 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_OR_FLUSH_SEND)) | ||
703 | return; | ||
646 | 704 | ||
647 | /* See ch. 11.2.4.1 and 10.7.3.1 */ | 705 | /* See ch. 11.2.4.1 and 10.7.3.1 */ |
648 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || | 706 | if (!(qp->s_flags & IPATH_S_SIGNAL_REQ_WR) || |
@@ -650,27 +708,25 @@ void ipath_send_complete(struct ipath_qp *qp, struct ipath_swqe *wqe, | |||
650 | status != IB_WC_SUCCESS) { | 708 | status != IB_WC_SUCCESS) { |
651 | struct ib_wc wc; | 709 | struct ib_wc wc; |
652 | 710 | ||
711 | memset(&wc, 0, sizeof wc); | ||
653 | wc.wr_id = wqe->wr.wr_id; | 712 | wc.wr_id = wqe->wr.wr_id; |
654 | wc.status = status; | 713 | wc.status = status; |
655 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; | 714 | wc.opcode = ib_ipath_wc_opcode[wqe->wr.opcode]; |
656 | wc.vendor_err = 0; | ||
657 | wc.byte_len = wqe->length; | ||
658 | wc.imm_data = 0; | ||
659 | wc.qp = &qp->ibqp; | 715 | wc.qp = &qp->ibqp; |
660 | wc.src_qp = 0; | 716 | if (status == IB_WC_SUCCESS) |
661 | wc.wc_flags = 0; | 717 | wc.byte_len = wqe->length; |
662 | wc.pkey_index = 0; | 718 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, |
663 | wc.slid = 0; | 719 | status != IB_WC_SUCCESS); |
664 | wc.sl = 0; | ||
665 | wc.dlid_path_bits = 0; | ||
666 | wc.port_num = 0; | ||
667 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 0); | ||
668 | } | 720 | } |
669 | 721 | ||
670 | spin_lock_irqsave(&qp->s_lock, flags); | 722 | old_last = last = qp->s_last; |
671 | last = qp->s_last; | ||
672 | if (++last >= qp->s_size) | 723 | if (++last >= qp->s_size) |
673 | last = 0; | 724 | last = 0; |
674 | qp->s_last = last; | 725 | qp->s_last = last; |
675 | spin_unlock_irqrestore(&qp->s_lock, flags); | 726 | if (qp->s_cur == old_last) |
727 | qp->s_cur = last; | ||
728 | if (qp->s_tail == old_last) | ||
729 | qp->s_tail = last; | ||
730 | if (qp->state == IB_QPS_SQD && last == qp->s_cur) | ||
731 | qp->s_draining = 0; | ||
676 | } | 732 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_sdma.c b/drivers/infiniband/hw/ipath/ipath_sdma.c index 1974df7a9f78..3697449c1ba4 100644 --- a/drivers/infiniband/hw/ipath/ipath_sdma.c +++ b/drivers/infiniband/hw/ipath/ipath_sdma.c | |||
@@ -308,13 +308,15 @@ static void sdma_abort_task(unsigned long opaque) | |||
308 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); | 308 | spin_unlock_irqrestore(&dd->ipath_sdma_lock, flags); |
309 | 309 | ||
310 | /* | 310 | /* |
311 | * Don't restart sdma here. Wait until link is up to ACTIVE. | 311 | * Don't restart sdma here (with the exception |
312 | * VL15 MADs used to bring the link up use PIO, and multiple | 312 | * below). Wait until link is up to ACTIVE. VL15 MADs |
313 | * link transitions otherwise cause the sdma engine to be | 313 | * used to bring the link up use PIO, and multiple link |
314 | * transitions otherwise cause the sdma engine to be | ||
314 | * stopped and started multiple times. | 315 | * stopped and started multiple times. |
315 | * The disable is done here, including the shadow, so the | 316 | * The disable is done here, including the shadow, |
316 | * state is kept consistent. | 317 | * so the state is kept consistent. |
317 | * See ipath_restart_sdma() for the actual starting of sdma. | 318 | * See ipath_restart_sdma() for the actual starting |
319 | * of sdma. | ||
318 | */ | 320 | */ |
319 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); | 321 | spin_lock_irqsave(&dd->ipath_sendctrl_lock, flags); |
320 | dd->ipath_sendctrl &= ~INFINIPATH_S_SDMAENABLE; | 322 | dd->ipath_sendctrl &= ~INFINIPATH_S_SDMAENABLE; |
@@ -326,6 +328,13 @@ static void sdma_abort_task(unsigned long opaque) | |||
326 | /* make sure I see next message */ | 328 | /* make sure I see next message */ |
327 | dd->ipath_sdma_abort_jiffies = 0; | 329 | dd->ipath_sdma_abort_jiffies = 0; |
328 | 330 | ||
331 | /* | ||
332 | * Not everything that takes SDMA offline is a link | ||
333 | * status change. If the link was up, restart SDMA. | ||
334 | */ | ||
335 | if (dd->ipath_flags & IPATH_LINKACTIVE) | ||
336 | ipath_restart_sdma(dd); | ||
337 | |||
329 | goto done; | 338 | goto done; |
330 | } | 339 | } |
331 | 340 | ||
@@ -427,7 +436,12 @@ int setup_sdma(struct ipath_devdata *dd) | |||
427 | goto done; | 436 | goto done; |
428 | } | 437 | } |
429 | 438 | ||
430 | dd->ipath_sdma_status = 0; | 439 | /* |
440 | * Set initial status as if we had been up, then gone down. | ||
441 | * This lets initial start on transition to ACTIVE be the | ||
442 | * same as restart after link flap. | ||
443 | */ | ||
444 | dd->ipath_sdma_status = IPATH_SDMA_ABORT_ABORTED; | ||
431 | dd->ipath_sdma_abort_jiffies = 0; | 445 | dd->ipath_sdma_abort_jiffies = 0; |
432 | dd->ipath_sdma_generation = 0; | 446 | dd->ipath_sdma_generation = 0; |
433 | dd->ipath_sdma_descq_tail = 0; | 447 | dd->ipath_sdma_descq_tail = 0; |
@@ -449,16 +463,19 @@ int setup_sdma(struct ipath_devdata *dd) | |||
449 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmaheadaddr, | 463 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmaheadaddr, |
450 | dd->ipath_sdma_head_phys); | 464 | dd->ipath_sdma_head_phys); |
451 | 465 | ||
452 | /* Reserve all the former "kernel" piobufs */ | 466 | /* |
453 | n = dd->ipath_piobcnt2k + dd->ipath_piobcnt4k - dd->ipath_pioreserved; | 467 | * Reserve all the former "kernel" piobufs, using high number range |
454 | for (i = dd->ipath_lastport_piobuf; i < n; ++i) { | 468 | * so we get as many 4K buffers as possible |
469 | */ | ||
470 | n = dd->ipath_piobcnt2k + dd->ipath_piobcnt4k; | ||
471 | i = dd->ipath_lastport_piobuf + dd->ipath_pioreserved; | ||
472 | ipath_chg_pioavailkernel(dd, i, n - i , 0); | ||
473 | for (; i < n; ++i) { | ||
455 | unsigned word = i / 64; | 474 | unsigned word = i / 64; |
456 | unsigned bit = i & 63; | 475 | unsigned bit = i & 63; |
457 | BUG_ON(word >= 3); | 476 | BUG_ON(word >= 3); |
458 | senddmabufmask[word] |= 1ULL << bit; | 477 | senddmabufmask[word] |= 1ULL << bit; |
459 | } | 478 | } |
460 | ipath_chg_pioavailkernel(dd, dd->ipath_lastport_piobuf, | ||
461 | n - dd->ipath_lastport_piobuf, 0); | ||
462 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmabufmask0, | 479 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmabufmask0, |
463 | senddmabufmask[0]); | 480 | senddmabufmask[0]); |
464 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmabufmask1, | 481 | ipath_write_kreg(dd, dd->ipath_kregs->kr_senddmabufmask1, |
@@ -615,6 +632,9 @@ void ipath_restart_sdma(struct ipath_devdata *dd) | |||
615 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); | 632 | ipath_read_kreg64(dd, dd->ipath_kregs->kr_scratch); |
616 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); | 633 | spin_unlock_irqrestore(&dd->ipath_sendctrl_lock, flags); |
617 | 634 | ||
635 | /* notify upper layers */ | ||
636 | ipath_ib_piobufavail(dd->verbs_dev); | ||
637 | |||
618 | bail: | 638 | bail: |
619 | return; | 639 | return; |
620 | } | 640 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_uc.c b/drivers/infiniband/hw/ipath/ipath_uc.c index bfe8926b5514..7fd18e833907 100644 --- a/drivers/infiniband/hw/ipath/ipath_uc.c +++ b/drivers/infiniband/hw/ipath/ipath_uc.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2006, 2007 QLogic Corporation. All rights reserved. | 2 | * Copyright (c) 2006, 2007, 2008 QLogic Corporation. All rights reserved. |
3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. | 3 | * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. |
4 | * | 4 | * |
5 | * This software is available to you under a choice of one of two | 5 | * This software is available to you under a choice of one of two |
@@ -47,14 +47,30 @@ int ipath_make_uc_req(struct ipath_qp *qp) | |||
47 | { | 47 | { |
48 | struct ipath_other_headers *ohdr; | 48 | struct ipath_other_headers *ohdr; |
49 | struct ipath_swqe *wqe; | 49 | struct ipath_swqe *wqe; |
50 | unsigned long flags; | ||
50 | u32 hwords; | 51 | u32 hwords; |
51 | u32 bth0; | 52 | u32 bth0; |
52 | u32 len; | 53 | u32 len; |
53 | u32 pmtu = ib_mtu_enum_to_int(qp->path_mtu); | 54 | u32 pmtu = ib_mtu_enum_to_int(qp->path_mtu); |
54 | int ret = 0; | 55 | int ret = 0; |
55 | 56 | ||
56 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK)) | 57 | spin_lock_irqsave(&qp->s_lock, flags); |
58 | |||
59 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK)) { | ||
60 | if (!(ib_ipath_state_ops[qp->state] & IPATH_FLUSH_SEND)) | ||
61 | goto bail; | ||
62 | /* We are in the error state, flush the work request. */ | ||
63 | if (qp->s_last == qp->s_head) | ||
64 | goto bail; | ||
65 | /* If DMAs are in progress, we can't flush immediately. */ | ||
66 | if (atomic_read(&qp->s_dma_busy)) { | ||
67 | qp->s_flags |= IPATH_S_WAIT_DMA; | ||
68 | goto bail; | ||
69 | } | ||
70 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
71 | ipath_send_complete(qp, wqe, IB_WC_WR_FLUSH_ERR); | ||
57 | goto done; | 72 | goto done; |
73 | } | ||
58 | 74 | ||
59 | ohdr = &qp->s_hdr.u.oth; | 75 | ohdr = &qp->s_hdr.u.oth; |
60 | if (qp->remote_ah_attr.ah_flags & IB_AH_GRH) | 76 | if (qp->remote_ah_attr.ah_flags & IB_AH_GRH) |
@@ -69,9 +85,12 @@ int ipath_make_uc_req(struct ipath_qp *qp) | |||
69 | qp->s_wqe = NULL; | 85 | qp->s_wqe = NULL; |
70 | switch (qp->s_state) { | 86 | switch (qp->s_state) { |
71 | default: | 87 | default: |
88 | if (!(ib_ipath_state_ops[qp->state] & | ||
89 | IPATH_PROCESS_NEXT_SEND_OK)) | ||
90 | goto bail; | ||
72 | /* Check if send work queue is empty. */ | 91 | /* Check if send work queue is empty. */ |
73 | if (qp->s_cur == qp->s_head) | 92 | if (qp->s_cur == qp->s_head) |
74 | goto done; | 93 | goto bail; |
75 | /* | 94 | /* |
76 | * Start a new request. | 95 | * Start a new request. |
77 | */ | 96 | */ |
@@ -134,7 +153,7 @@ int ipath_make_uc_req(struct ipath_qp *qp) | |||
134 | break; | 153 | break; |
135 | 154 | ||
136 | default: | 155 | default: |
137 | goto done; | 156 | goto bail; |
138 | } | 157 | } |
139 | break; | 158 | break; |
140 | 159 | ||
@@ -194,9 +213,14 @@ int ipath_make_uc_req(struct ipath_qp *qp) | |||
194 | ipath_make_ruc_header(to_idev(qp->ibqp.device), | 213 | ipath_make_ruc_header(to_idev(qp->ibqp.device), |
195 | qp, ohdr, bth0 | (qp->s_state << 24), | 214 | qp, ohdr, bth0 | (qp->s_state << 24), |
196 | qp->s_next_psn++ & IPATH_PSN_MASK); | 215 | qp->s_next_psn++ & IPATH_PSN_MASK); |
216 | done: | ||
197 | ret = 1; | 217 | ret = 1; |
218 | goto unlock; | ||
198 | 219 | ||
199 | done: | 220 | bail: |
221 | qp->s_flags &= ~IPATH_S_BUSY; | ||
222 | unlock: | ||
223 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
200 | return ret; | 224 | return ret; |
201 | } | 225 | } |
202 | 226 | ||
@@ -258,8 +282,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
258 | */ | 282 | */ |
259 | opcode = be32_to_cpu(ohdr->bth[0]) >> 24; | 283 | opcode = be32_to_cpu(ohdr->bth[0]) >> 24; |
260 | 284 | ||
261 | wc.imm_data = 0; | 285 | memset(&wc, 0, sizeof wc); |
262 | wc.wc_flags = 0; | ||
263 | 286 | ||
264 | /* Compare the PSN verses the expected PSN. */ | 287 | /* Compare the PSN verses the expected PSN. */ |
265 | if (unlikely(ipath_cmp24(psn, qp->r_psn) != 0)) { | 288 | if (unlikely(ipath_cmp24(psn, qp->r_psn) != 0)) { |
@@ -322,8 +345,8 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
322 | case OP(SEND_ONLY): | 345 | case OP(SEND_ONLY): |
323 | case OP(SEND_ONLY_WITH_IMMEDIATE): | 346 | case OP(SEND_ONLY_WITH_IMMEDIATE): |
324 | send_first: | 347 | send_first: |
325 | if (qp->r_reuse_sge) { | 348 | if (qp->r_flags & IPATH_R_REUSE_SGE) { |
326 | qp->r_reuse_sge = 0; | 349 | qp->r_flags &= ~IPATH_R_REUSE_SGE; |
327 | qp->r_sge = qp->s_rdma_read_sge; | 350 | qp->r_sge = qp->s_rdma_read_sge; |
328 | } else if (!ipath_get_rwqe(qp, 0)) { | 351 | } else if (!ipath_get_rwqe(qp, 0)) { |
329 | dev->n_pkt_drops++; | 352 | dev->n_pkt_drops++; |
@@ -340,13 +363,13 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
340 | case OP(SEND_MIDDLE): | 363 | case OP(SEND_MIDDLE): |
341 | /* Check for invalid length PMTU or posted rwqe len. */ | 364 | /* Check for invalid length PMTU or posted rwqe len. */ |
342 | if (unlikely(tlen != (hdrsize + pmtu + 4))) { | 365 | if (unlikely(tlen != (hdrsize + pmtu + 4))) { |
343 | qp->r_reuse_sge = 1; | 366 | qp->r_flags |= IPATH_R_REUSE_SGE; |
344 | dev->n_pkt_drops++; | 367 | dev->n_pkt_drops++; |
345 | goto done; | 368 | goto done; |
346 | } | 369 | } |
347 | qp->r_rcv_len += pmtu; | 370 | qp->r_rcv_len += pmtu; |
348 | if (unlikely(qp->r_rcv_len > qp->r_len)) { | 371 | if (unlikely(qp->r_rcv_len > qp->r_len)) { |
349 | qp->r_reuse_sge = 1; | 372 | qp->r_flags |= IPATH_R_REUSE_SGE; |
350 | dev->n_pkt_drops++; | 373 | dev->n_pkt_drops++; |
351 | goto done; | 374 | goto done; |
352 | } | 375 | } |
@@ -372,7 +395,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
372 | /* Check for invalid length. */ | 395 | /* Check for invalid length. */ |
373 | /* XXX LAST len should be >= 1 */ | 396 | /* XXX LAST len should be >= 1 */ |
374 | if (unlikely(tlen < (hdrsize + pad + 4))) { | 397 | if (unlikely(tlen < (hdrsize + pad + 4))) { |
375 | qp->r_reuse_sge = 1; | 398 | qp->r_flags |= IPATH_R_REUSE_SGE; |
376 | dev->n_pkt_drops++; | 399 | dev->n_pkt_drops++; |
377 | goto done; | 400 | goto done; |
378 | } | 401 | } |
@@ -380,7 +403,7 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
380 | tlen -= (hdrsize + pad + 4); | 403 | tlen -= (hdrsize + pad + 4); |
381 | wc.byte_len = tlen + qp->r_rcv_len; | 404 | wc.byte_len = tlen + qp->r_rcv_len; |
382 | if (unlikely(wc.byte_len > qp->r_len)) { | 405 | if (unlikely(wc.byte_len > qp->r_len)) { |
383 | qp->r_reuse_sge = 1; | 406 | qp->r_flags |= IPATH_R_REUSE_SGE; |
384 | dev->n_pkt_drops++; | 407 | dev->n_pkt_drops++; |
385 | goto done; | 408 | goto done; |
386 | } | 409 | } |
@@ -390,14 +413,10 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
390 | wc.wr_id = qp->r_wr_id; | 413 | wc.wr_id = qp->r_wr_id; |
391 | wc.status = IB_WC_SUCCESS; | 414 | wc.status = IB_WC_SUCCESS; |
392 | wc.opcode = IB_WC_RECV; | 415 | wc.opcode = IB_WC_RECV; |
393 | wc.vendor_err = 0; | ||
394 | wc.qp = &qp->ibqp; | 416 | wc.qp = &qp->ibqp; |
395 | wc.src_qp = qp->remote_qpn; | 417 | wc.src_qp = qp->remote_qpn; |
396 | wc.pkey_index = 0; | ||
397 | wc.slid = qp->remote_ah_attr.dlid; | 418 | wc.slid = qp->remote_ah_attr.dlid; |
398 | wc.sl = qp->remote_ah_attr.sl; | 419 | wc.sl = qp->remote_ah_attr.sl; |
399 | wc.dlid_path_bits = 0; | ||
400 | wc.port_num = 0; | ||
401 | /* Signal completion event if the solicited bit is set. */ | 420 | /* Signal completion event if the solicited bit is set. */ |
402 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, | 421 | ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, |
403 | (ohdr->bth[0] & | 422 | (ohdr->bth[0] & |
@@ -488,8 +507,8 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
488 | dev->n_pkt_drops++; | 507 | dev->n_pkt_drops++; |
489 | goto done; | 508 | goto done; |
490 | } | 509 | } |
491 | if (qp->r_reuse_sge) | 510 | if (qp->r_flags & IPATH_R_REUSE_SGE) |
492 | qp->r_reuse_sge = 0; | 511 | qp->r_flags &= ~IPATH_R_REUSE_SGE; |
493 | else if (!ipath_get_rwqe(qp, 1)) { | 512 | else if (!ipath_get_rwqe(qp, 1)) { |
494 | dev->n_pkt_drops++; | 513 | dev->n_pkt_drops++; |
495 | goto done; | 514 | goto done; |
diff --git a/drivers/infiniband/hw/ipath/ipath_ud.c b/drivers/infiniband/hw/ipath/ipath_ud.c index 8b6a261c89e3..77ca8ca74e78 100644 --- a/drivers/infiniband/hw/ipath/ipath_ud.c +++ b/drivers/infiniband/hw/ipath/ipath_ud.c | |||
@@ -65,9 +65,9 @@ static void ipath_ud_loopback(struct ipath_qp *sqp, struct ipath_swqe *swqe) | |||
65 | u32 length; | 65 | u32 length; |
66 | 66 | ||
67 | qp = ipath_lookup_qpn(&dev->qp_table, swqe->wr.wr.ud.remote_qpn); | 67 | qp = ipath_lookup_qpn(&dev->qp_table, swqe->wr.wr.ud.remote_qpn); |
68 | if (!qp) { | 68 | if (!qp || !(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_RECV_OK)) { |
69 | dev->n_pkt_drops++; | 69 | dev->n_pkt_drops++; |
70 | goto send_comp; | 70 | goto done; |
71 | } | 71 | } |
72 | 72 | ||
73 | rsge.sg_list = NULL; | 73 | rsge.sg_list = NULL; |
@@ -91,14 +91,12 @@ static void ipath_ud_loopback(struct ipath_qp *sqp, struct ipath_swqe *swqe) | |||
91 | * present on the wire. | 91 | * present on the wire. |
92 | */ | 92 | */ |
93 | length = swqe->length; | 93 | length = swqe->length; |
94 | memset(&wc, 0, sizeof wc); | ||
94 | wc.byte_len = length + sizeof(struct ib_grh); | 95 | wc.byte_len = length + sizeof(struct ib_grh); |
95 | 96 | ||
96 | if (swqe->wr.opcode == IB_WR_SEND_WITH_IMM) { | 97 | if (swqe->wr.opcode == IB_WR_SEND_WITH_IMM) { |
97 | wc.wc_flags = IB_WC_WITH_IMM; | 98 | wc.wc_flags = IB_WC_WITH_IMM; |
98 | wc.imm_data = swqe->wr.ex.imm_data; | 99 | wc.imm_data = swqe->wr.ex.imm_data; |
99 | } else { | ||
100 | wc.wc_flags = 0; | ||
101 | wc.imm_data = 0; | ||
102 | } | 100 | } |
103 | 101 | ||
104 | /* | 102 | /* |
@@ -229,7 +227,6 @@ static void ipath_ud_loopback(struct ipath_qp *sqp, struct ipath_swqe *swqe) | |||
229 | } | 227 | } |
230 | wc.status = IB_WC_SUCCESS; | 228 | wc.status = IB_WC_SUCCESS; |
231 | wc.opcode = IB_WC_RECV; | 229 | wc.opcode = IB_WC_RECV; |
232 | wc.vendor_err = 0; | ||
233 | wc.qp = &qp->ibqp; | 230 | wc.qp = &qp->ibqp; |
234 | wc.src_qp = sqp->ibqp.qp_num; | 231 | wc.src_qp = sqp->ibqp.qp_num; |
235 | /* XXX do we know which pkey matched? Only needed for GSI. */ | 232 | /* XXX do we know which pkey matched? Only needed for GSI. */ |
@@ -248,8 +245,7 @@ drop: | |||
248 | kfree(rsge.sg_list); | 245 | kfree(rsge.sg_list); |
249 | if (atomic_dec_and_test(&qp->refcount)) | 246 | if (atomic_dec_and_test(&qp->refcount)) |
250 | wake_up(&qp->wait); | 247 | wake_up(&qp->wait); |
251 | send_comp: | 248 | done:; |
252 | ipath_send_complete(sqp, swqe, IB_WC_SUCCESS); | ||
253 | } | 249 | } |
254 | 250 | ||
255 | /** | 251 | /** |
@@ -264,6 +260,7 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
264 | struct ipath_other_headers *ohdr; | 260 | struct ipath_other_headers *ohdr; |
265 | struct ib_ah_attr *ah_attr; | 261 | struct ib_ah_attr *ah_attr; |
266 | struct ipath_swqe *wqe; | 262 | struct ipath_swqe *wqe; |
263 | unsigned long flags; | ||
267 | u32 nwords; | 264 | u32 nwords; |
268 | u32 extra_bytes; | 265 | u32 extra_bytes; |
269 | u32 bth0; | 266 | u32 bth0; |
@@ -271,13 +268,30 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
271 | u16 lid; | 268 | u16 lid; |
272 | int ret = 0; | 269 | int ret = 0; |
273 | 270 | ||
274 | if (unlikely(!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK))) | 271 | spin_lock_irqsave(&qp->s_lock, flags); |
275 | goto bail; | 272 | |
273 | if (!(ib_ipath_state_ops[qp->state] & IPATH_PROCESS_NEXT_SEND_OK)) { | ||
274 | if (!(ib_ipath_state_ops[qp->state] & IPATH_FLUSH_SEND)) | ||
275 | goto bail; | ||
276 | /* We are in the error state, flush the work request. */ | ||
277 | if (qp->s_last == qp->s_head) | ||
278 | goto bail; | ||
279 | /* If DMAs are in progress, we can't flush immediately. */ | ||
280 | if (atomic_read(&qp->s_dma_busy)) { | ||
281 | qp->s_flags |= IPATH_S_WAIT_DMA; | ||
282 | goto bail; | ||
283 | } | ||
284 | wqe = get_swqe_ptr(qp, qp->s_last); | ||
285 | ipath_send_complete(qp, wqe, IB_WC_WR_FLUSH_ERR); | ||
286 | goto done; | ||
287 | } | ||
276 | 288 | ||
277 | if (qp->s_cur == qp->s_head) | 289 | if (qp->s_cur == qp->s_head) |
278 | goto bail; | 290 | goto bail; |
279 | 291 | ||
280 | wqe = get_swqe_ptr(qp, qp->s_cur); | 292 | wqe = get_swqe_ptr(qp, qp->s_cur); |
293 | if (++qp->s_cur >= qp->s_size) | ||
294 | qp->s_cur = 0; | ||
281 | 295 | ||
282 | /* Construct the header. */ | 296 | /* Construct the header. */ |
283 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; | 297 | ah_attr = &to_iah(wqe->wr.wr.ud.ah)->attr; |
@@ -288,10 +302,23 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
288 | dev->n_unicast_xmit++; | 302 | dev->n_unicast_xmit++; |
289 | } else { | 303 | } else { |
290 | dev->n_unicast_xmit++; | 304 | dev->n_unicast_xmit++; |
291 | lid = ah_attr->dlid & | 305 | lid = ah_attr->dlid & ~((1 << dev->dd->ipath_lmc) - 1); |
292 | ~((1 << dev->dd->ipath_lmc) - 1); | ||
293 | if (unlikely(lid == dev->dd->ipath_lid)) { | 306 | if (unlikely(lid == dev->dd->ipath_lid)) { |
307 | /* | ||
308 | * If DMAs are in progress, we can't generate | ||
309 | * a completion for the loopback packet since | ||
310 | * it would be out of order. | ||
311 | * XXX Instead of waiting, we could queue a | ||
312 | * zero length descriptor so we get a callback. | ||
313 | */ | ||
314 | if (atomic_read(&qp->s_dma_busy)) { | ||
315 | qp->s_flags |= IPATH_S_WAIT_DMA; | ||
316 | goto bail; | ||
317 | } | ||
318 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
294 | ipath_ud_loopback(qp, wqe); | 319 | ipath_ud_loopback(qp, wqe); |
320 | spin_lock_irqsave(&qp->s_lock, flags); | ||
321 | ipath_send_complete(qp, wqe, IB_WC_SUCCESS); | ||
295 | goto done; | 322 | goto done; |
296 | } | 323 | } |
297 | } | 324 | } |
@@ -368,11 +395,13 @@ int ipath_make_ud_req(struct ipath_qp *qp) | |||
368 | ohdr->u.ud.deth[1] = cpu_to_be32(qp->ibqp.qp_num); | 395 | ohdr->u.ud.deth[1] = cpu_to_be32(qp->ibqp.qp_num); |
369 | 396 | ||
370 | done: | 397 | done: |
371 | if (++qp->s_cur >= qp->s_size) | ||
372 | qp->s_cur = 0; | ||
373 | ret = 1; | 398 | ret = 1; |
399 | goto unlock; | ||
374 | 400 | ||
375 | bail: | 401 | bail: |
402 | qp->s_flags &= ~IPATH_S_BUSY; | ||
403 | unlock: | ||
404 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
376 | return ret; | 405 | return ret; |
377 | } | 406 | } |
378 | 407 | ||
@@ -506,8 +535,8 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
506 | /* | 535 | /* |
507 | * Get the next work request entry to find where to put the data. | 536 | * Get the next work request entry to find where to put the data. |
508 | */ | 537 | */ |
509 | if (qp->r_reuse_sge) | 538 | if (qp->r_flags & IPATH_R_REUSE_SGE) |
510 | qp->r_reuse_sge = 0; | 539 | qp->r_flags &= ~IPATH_R_REUSE_SGE; |
511 | else if (!ipath_get_rwqe(qp, 0)) { | 540 | else if (!ipath_get_rwqe(qp, 0)) { |
512 | /* | 541 | /* |
513 | * Count VL15 packets dropped due to no receive buffer. | 542 | * Count VL15 packets dropped due to no receive buffer. |
@@ -523,7 +552,7 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
523 | } | 552 | } |
524 | /* Silently drop packets which are too big. */ | 553 | /* Silently drop packets which are too big. */ |
525 | if (wc.byte_len > qp->r_len) { | 554 | if (wc.byte_len > qp->r_len) { |
526 | qp->r_reuse_sge = 1; | 555 | qp->r_flags |= IPATH_R_REUSE_SGE; |
527 | dev->n_pkt_drops++; | 556 | dev->n_pkt_drops++; |
528 | goto bail; | 557 | goto bail; |
529 | } | 558 | } |
@@ -535,7 +564,8 @@ void ipath_ud_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
535 | ipath_skip_sge(&qp->r_sge, sizeof(struct ib_grh)); | 564 | ipath_skip_sge(&qp->r_sge, sizeof(struct ib_grh)); |
536 | ipath_copy_sge(&qp->r_sge, data, | 565 | ipath_copy_sge(&qp->r_sge, data, |
537 | wc.byte_len - sizeof(struct ib_grh)); | 566 | wc.byte_len - sizeof(struct ib_grh)); |
538 | qp->r_wrid_valid = 0; | 567 | if (!test_and_clear_bit(IPATH_R_WRID_VALID, &qp->r_aflags)) |
568 | goto bail; | ||
539 | wc.wr_id = qp->r_wr_id; | 569 | wc.wr_id = qp->r_wr_id; |
540 | wc.status = IB_WC_SUCCESS; | 570 | wc.status = IB_WC_SUCCESS; |
541 | wc.opcode = IB_WC_RECV; | 571 | wc.opcode = IB_WC_RECV; |
diff --git a/drivers/infiniband/hw/ipath/ipath_user_sdma.h b/drivers/infiniband/hw/ipath/ipath_user_sdma.h index e70946c1428c..fc76316c4a58 100644 --- a/drivers/infiniband/hw/ipath/ipath_user_sdma.h +++ b/drivers/infiniband/hw/ipath/ipath_user_sdma.h | |||
@@ -45,8 +45,6 @@ int ipath_user_sdma_writev(struct ipath_devdata *dd, | |||
45 | int ipath_user_sdma_make_progress(struct ipath_devdata *dd, | 45 | int ipath_user_sdma_make_progress(struct ipath_devdata *dd, |
46 | struct ipath_user_sdma_queue *pq); | 46 | struct ipath_user_sdma_queue *pq); |
47 | 47 | ||
48 | int ipath_user_sdma_pkt_sent(const struct ipath_user_sdma_queue *pq, | ||
49 | u32 counter); | ||
50 | void ipath_user_sdma_queue_drain(struct ipath_devdata *dd, | 48 | void ipath_user_sdma_queue_drain(struct ipath_devdata *dd, |
51 | struct ipath_user_sdma_queue *pq); | 49 | struct ipath_user_sdma_queue *pq); |
52 | 50 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.c b/drivers/infiniband/hw/ipath/ipath_verbs.c index e63927cce5b5..e0ec540042bf 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.c +++ b/drivers/infiniband/hw/ipath/ipath_verbs.c | |||
@@ -111,16 +111,24 @@ static unsigned int ib_ipath_disable_sma; | |||
111 | module_param_named(disable_sma, ib_ipath_disable_sma, uint, S_IWUSR | S_IRUGO); | 111 | module_param_named(disable_sma, ib_ipath_disable_sma, uint, S_IWUSR | S_IRUGO); |
112 | MODULE_PARM_DESC(disable_sma, "Disable the SMA"); | 112 | MODULE_PARM_DESC(disable_sma, "Disable the SMA"); |
113 | 113 | ||
114 | /* | ||
115 | * Note that it is OK to post send work requests in the SQE and ERR | ||
116 | * states; ipath_do_send() will process them and generate error | ||
117 | * completions as per IB 1.2 C10-96. | ||
118 | */ | ||
114 | const int ib_ipath_state_ops[IB_QPS_ERR + 1] = { | 119 | const int ib_ipath_state_ops[IB_QPS_ERR + 1] = { |
115 | [IB_QPS_RESET] = 0, | 120 | [IB_QPS_RESET] = 0, |
116 | [IB_QPS_INIT] = IPATH_POST_RECV_OK, | 121 | [IB_QPS_INIT] = IPATH_POST_RECV_OK, |
117 | [IB_QPS_RTR] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK, | 122 | [IB_QPS_RTR] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK, |
118 | [IB_QPS_RTS] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK | | 123 | [IB_QPS_RTS] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK | |
119 | IPATH_POST_SEND_OK | IPATH_PROCESS_SEND_OK, | 124 | IPATH_POST_SEND_OK | IPATH_PROCESS_SEND_OK | |
125 | IPATH_PROCESS_NEXT_SEND_OK, | ||
120 | [IB_QPS_SQD] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK | | 126 | [IB_QPS_SQD] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK | |
121 | IPATH_POST_SEND_OK, | 127 | IPATH_POST_SEND_OK | IPATH_PROCESS_SEND_OK, |
122 | [IB_QPS_SQE] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK, | 128 | [IB_QPS_SQE] = IPATH_POST_RECV_OK | IPATH_PROCESS_RECV_OK | |
123 | [IB_QPS_ERR] = 0, | 129 | IPATH_POST_SEND_OK | IPATH_FLUSH_SEND, |
130 | [IB_QPS_ERR] = IPATH_POST_RECV_OK | IPATH_FLUSH_RECV | | ||
131 | IPATH_POST_SEND_OK | IPATH_FLUSH_SEND, | ||
124 | }; | 132 | }; |
125 | 133 | ||
126 | struct ipath_ucontext { | 134 | struct ipath_ucontext { |
@@ -230,18 +238,6 @@ void ipath_skip_sge(struct ipath_sge_state *ss, u32 length) | |||
230 | } | 238 | } |
231 | } | 239 | } |
232 | 240 | ||
233 | static void ipath_flush_wqe(struct ipath_qp *qp, struct ib_send_wr *wr) | ||
234 | { | ||
235 | struct ib_wc wc; | ||
236 | |||
237 | memset(&wc, 0, sizeof(wc)); | ||
238 | wc.wr_id = wr->wr_id; | ||
239 | wc.status = IB_WC_WR_FLUSH_ERR; | ||
240 | wc.opcode = ib_ipath_wc_opcode[wr->opcode]; | ||
241 | wc.qp = &qp->ibqp; | ||
242 | ipath_cq_enter(to_icq(qp->ibqp.send_cq), &wc, 1); | ||
243 | } | ||
244 | |||
245 | /* | 241 | /* |
246 | * Count the number of DMA descriptors needed to send length bytes of data. | 242 | * Count the number of DMA descriptors needed to send length bytes of data. |
247 | * Don't modify the ipath_sge_state to get the count. | 243 | * Don't modify the ipath_sge_state to get the count. |
@@ -347,14 +343,8 @@ static int ipath_post_one_send(struct ipath_qp *qp, struct ib_send_wr *wr) | |||
347 | spin_lock_irqsave(&qp->s_lock, flags); | 343 | spin_lock_irqsave(&qp->s_lock, flags); |
348 | 344 | ||
349 | /* Check that state is OK to post send. */ | 345 | /* Check that state is OK to post send. */ |
350 | if (unlikely(!(ib_ipath_state_ops[qp->state] & IPATH_POST_SEND_OK))) { | 346 | if (unlikely(!(ib_ipath_state_ops[qp->state] & IPATH_POST_SEND_OK))) |
351 | if (qp->state != IB_QPS_SQE && qp->state != IB_QPS_ERR) | 347 | goto bail_inval; |
352 | goto bail_inval; | ||
353 | /* C10-96 says generate a flushed completion entry. */ | ||
354 | ipath_flush_wqe(qp, wr); | ||
355 | ret = 0; | ||
356 | goto bail; | ||
357 | } | ||
358 | 348 | ||
359 | /* IB spec says that num_sge == 0 is OK. */ | 349 | /* IB spec says that num_sge == 0 is OK. */ |
360 | if (wr->num_sge > qp->s_max_sge) | 350 | if (wr->num_sge > qp->s_max_sge) |
@@ -396,7 +386,6 @@ static int ipath_post_one_send(struct ipath_qp *qp, struct ib_send_wr *wr) | |||
396 | 386 | ||
397 | wqe = get_swqe_ptr(qp, qp->s_head); | 387 | wqe = get_swqe_ptr(qp, qp->s_head); |
398 | wqe->wr = *wr; | 388 | wqe->wr = *wr; |
399 | wqe->ssn = qp->s_ssn++; | ||
400 | wqe->length = 0; | 389 | wqe->length = 0; |
401 | if (wr->num_sge) { | 390 | if (wr->num_sge) { |
402 | acc = wr->opcode >= IB_WR_RDMA_READ ? | 391 | acc = wr->opcode >= IB_WR_RDMA_READ ? |
@@ -422,6 +411,7 @@ static int ipath_post_one_send(struct ipath_qp *qp, struct ib_send_wr *wr) | |||
422 | goto bail_inval; | 411 | goto bail_inval; |
423 | } else if (wqe->length > to_idev(qp->ibqp.device)->dd->ipath_ibmtu) | 412 | } else if (wqe->length > to_idev(qp->ibqp.device)->dd->ipath_ibmtu) |
424 | goto bail_inval; | 413 | goto bail_inval; |
414 | wqe->ssn = qp->s_ssn++; | ||
425 | qp->s_head = next; | 415 | qp->s_head = next; |
426 | 416 | ||
427 | ret = 0; | 417 | ret = 0; |
@@ -677,6 +667,7 @@ bail:; | |||
677 | static void ipath_ib_timer(struct ipath_ibdev *dev) | 667 | static void ipath_ib_timer(struct ipath_ibdev *dev) |
678 | { | 668 | { |
679 | struct ipath_qp *resend = NULL; | 669 | struct ipath_qp *resend = NULL; |
670 | struct ipath_qp *rnr = NULL; | ||
680 | struct list_head *last; | 671 | struct list_head *last; |
681 | struct ipath_qp *qp; | 672 | struct ipath_qp *qp; |
682 | unsigned long flags; | 673 | unsigned long flags; |
@@ -703,7 +694,9 @@ static void ipath_ib_timer(struct ipath_ibdev *dev) | |||
703 | if (--qp->s_rnr_timeout == 0) { | 694 | if (--qp->s_rnr_timeout == 0) { |
704 | do { | 695 | do { |
705 | list_del_init(&qp->timerwait); | 696 | list_del_init(&qp->timerwait); |
706 | tasklet_hi_schedule(&qp->s_task); | 697 | qp->timer_next = rnr; |
698 | rnr = qp; | ||
699 | atomic_inc(&qp->refcount); | ||
707 | if (list_empty(last)) | 700 | if (list_empty(last)) |
708 | break; | 701 | break; |
709 | qp = list_entry(last->next, struct ipath_qp, | 702 | qp = list_entry(last->next, struct ipath_qp, |
@@ -743,13 +736,15 @@ static void ipath_ib_timer(struct ipath_ibdev *dev) | |||
743 | spin_unlock_irqrestore(&dev->pending_lock, flags); | 736 | spin_unlock_irqrestore(&dev->pending_lock, flags); |
744 | 737 | ||
745 | /* XXX What if timer fires again while this is running? */ | 738 | /* XXX What if timer fires again while this is running? */ |
746 | for (qp = resend; qp != NULL; qp = qp->timer_next) { | 739 | while (resend != NULL) { |
747 | struct ib_wc wc; | 740 | qp = resend; |
741 | resend = qp->timer_next; | ||
748 | 742 | ||
749 | spin_lock_irqsave(&qp->s_lock, flags); | 743 | spin_lock_irqsave(&qp->s_lock, flags); |
750 | if (qp->s_last != qp->s_tail && qp->state == IB_QPS_RTS) { | 744 | if (qp->s_last != qp->s_tail && |
745 | ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK) { | ||
751 | dev->n_timeouts++; | 746 | dev->n_timeouts++; |
752 | ipath_restart_rc(qp, qp->s_last_psn + 1, &wc); | 747 | ipath_restart_rc(qp, qp->s_last_psn + 1); |
753 | } | 748 | } |
754 | spin_unlock_irqrestore(&qp->s_lock, flags); | 749 | spin_unlock_irqrestore(&qp->s_lock, flags); |
755 | 750 | ||
@@ -757,6 +752,19 @@ static void ipath_ib_timer(struct ipath_ibdev *dev) | |||
757 | if (atomic_dec_and_test(&qp->refcount)) | 752 | if (atomic_dec_and_test(&qp->refcount)) |
758 | wake_up(&qp->wait); | 753 | wake_up(&qp->wait); |
759 | } | 754 | } |
755 | while (rnr != NULL) { | ||
756 | qp = rnr; | ||
757 | rnr = qp->timer_next; | ||
758 | |||
759 | spin_lock_irqsave(&qp->s_lock, flags); | ||
760 | if (ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK) | ||
761 | ipath_schedule_send(qp); | ||
762 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
763 | |||
764 | /* Notify ipath_destroy_qp() if it is waiting. */ | ||
765 | if (atomic_dec_and_test(&qp->refcount)) | ||
766 | wake_up(&qp->wait); | ||
767 | } | ||
760 | } | 768 | } |
761 | 769 | ||
762 | static void update_sge(struct ipath_sge_state *ss, u32 length) | 770 | static void update_sge(struct ipath_sge_state *ss, u32 length) |
@@ -1012,13 +1020,24 @@ static void sdma_complete(void *cookie, int status) | |||
1012 | struct ipath_verbs_txreq *tx = cookie; | 1020 | struct ipath_verbs_txreq *tx = cookie; |
1013 | struct ipath_qp *qp = tx->qp; | 1021 | struct ipath_qp *qp = tx->qp; |
1014 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); | 1022 | struct ipath_ibdev *dev = to_idev(qp->ibqp.device); |
1023 | unsigned int flags; | ||
1024 | enum ib_wc_status ibs = status == IPATH_SDMA_TXREQ_S_OK ? | ||
1025 | IB_WC_SUCCESS : IB_WC_WR_FLUSH_ERR; | ||
1015 | 1026 | ||
1016 | /* Generate a completion queue entry if needed */ | 1027 | if (atomic_dec_and_test(&qp->s_dma_busy)) { |
1017 | if (qp->ibqp.qp_type != IB_QPT_RC && tx->wqe) { | 1028 | spin_lock_irqsave(&qp->s_lock, flags); |
1018 | enum ib_wc_status ibs = status == IPATH_SDMA_TXREQ_S_OK ? | 1029 | if (tx->wqe) |
1019 | IB_WC_SUCCESS : IB_WC_WR_FLUSH_ERR; | 1030 | ipath_send_complete(qp, tx->wqe, ibs); |
1020 | 1031 | if ((ib_ipath_state_ops[qp->state] & IPATH_FLUSH_SEND && | |
1032 | qp->s_last != qp->s_head) || | ||
1033 | (qp->s_flags & IPATH_S_WAIT_DMA)) | ||
1034 | ipath_schedule_send(qp); | ||
1035 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1036 | wake_up(&qp->wait_dma); | ||
1037 | } else if (tx->wqe) { | ||
1038 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1021 | ipath_send_complete(qp, tx->wqe, ibs); | 1039 | ipath_send_complete(qp, tx->wqe, ibs); |
1040 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1022 | } | 1041 | } |
1023 | 1042 | ||
1024 | if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_FREEBUF) | 1043 | if (tx->txreq.flags & IPATH_SDMA_TXREQ_F_FREEBUF) |
@@ -1029,6 +1048,21 @@ static void sdma_complete(void *cookie, int status) | |||
1029 | wake_up(&qp->wait); | 1048 | wake_up(&qp->wait); |
1030 | } | 1049 | } |
1031 | 1050 | ||
1051 | static void decrement_dma_busy(struct ipath_qp *qp) | ||
1052 | { | ||
1053 | unsigned int flags; | ||
1054 | |||
1055 | if (atomic_dec_and_test(&qp->s_dma_busy)) { | ||
1056 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1057 | if ((ib_ipath_state_ops[qp->state] & IPATH_FLUSH_SEND && | ||
1058 | qp->s_last != qp->s_head) || | ||
1059 | (qp->s_flags & IPATH_S_WAIT_DMA)) | ||
1060 | ipath_schedule_send(qp); | ||
1061 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1062 | wake_up(&qp->wait_dma); | ||
1063 | } | ||
1064 | } | ||
1065 | |||
1032 | /* | 1066 | /* |
1033 | * Compute the number of clock cycles of delay before sending the next packet. | 1067 | * Compute the number of clock cycles of delay before sending the next packet. |
1034 | * The multipliers reflect the number of clocks for the fastest rate so | 1068 | * The multipliers reflect the number of clocks for the fastest rate so |
@@ -1067,9 +1101,12 @@ static int ipath_verbs_send_dma(struct ipath_qp *qp, | |||
1067 | if (tx) { | 1101 | if (tx) { |
1068 | qp->s_tx = NULL; | 1102 | qp->s_tx = NULL; |
1069 | /* resend previously constructed packet */ | 1103 | /* resend previously constructed packet */ |
1104 | atomic_inc(&qp->s_dma_busy); | ||
1070 | ret = ipath_sdma_verbs_send(dd, tx->ss, tx->len, tx); | 1105 | ret = ipath_sdma_verbs_send(dd, tx->ss, tx->len, tx); |
1071 | if (ret) | 1106 | if (ret) { |
1072 | qp->s_tx = tx; | 1107 | qp->s_tx = tx; |
1108 | decrement_dma_busy(qp); | ||
1109 | } | ||
1073 | goto bail; | 1110 | goto bail; |
1074 | } | 1111 | } |
1075 | 1112 | ||
@@ -1120,12 +1157,14 @@ static int ipath_verbs_send_dma(struct ipath_qp *qp, | |||
1120 | tx->txreq.sg_count = ndesc; | 1157 | tx->txreq.sg_count = ndesc; |
1121 | tx->map_len = (hdrwords + 2) << 2; | 1158 | tx->map_len = (hdrwords + 2) << 2; |
1122 | tx->txreq.map_addr = &tx->hdr; | 1159 | tx->txreq.map_addr = &tx->hdr; |
1160 | atomic_inc(&qp->s_dma_busy); | ||
1123 | ret = ipath_sdma_verbs_send(dd, ss, dwords, tx); | 1161 | ret = ipath_sdma_verbs_send(dd, ss, dwords, tx); |
1124 | if (ret) { | 1162 | if (ret) { |
1125 | /* save ss and length in dwords */ | 1163 | /* save ss and length in dwords */ |
1126 | tx->ss = ss; | 1164 | tx->ss = ss; |
1127 | tx->len = dwords; | 1165 | tx->len = dwords; |
1128 | qp->s_tx = tx; | 1166 | qp->s_tx = tx; |
1167 | decrement_dma_busy(qp); | ||
1129 | } | 1168 | } |
1130 | goto bail; | 1169 | goto bail; |
1131 | } | 1170 | } |
@@ -1146,6 +1185,7 @@ static int ipath_verbs_send_dma(struct ipath_qp *qp, | |||
1146 | memcpy(piobuf, hdr, hdrwords << 2); | 1185 | memcpy(piobuf, hdr, hdrwords << 2); |
1147 | ipath_copy_from_sge(piobuf + hdrwords, ss, len); | 1186 | ipath_copy_from_sge(piobuf + hdrwords, ss, len); |
1148 | 1187 | ||
1188 | atomic_inc(&qp->s_dma_busy); | ||
1149 | ret = ipath_sdma_verbs_send(dd, NULL, 0, tx); | 1189 | ret = ipath_sdma_verbs_send(dd, NULL, 0, tx); |
1150 | /* | 1190 | /* |
1151 | * If we couldn't queue the DMA request, save the info | 1191 | * If we couldn't queue the DMA request, save the info |
@@ -1156,6 +1196,7 @@ static int ipath_verbs_send_dma(struct ipath_qp *qp, | |||
1156 | tx->ss = NULL; | 1196 | tx->ss = NULL; |
1157 | tx->len = 0; | 1197 | tx->len = 0; |
1158 | qp->s_tx = tx; | 1198 | qp->s_tx = tx; |
1199 | decrement_dma_busy(qp); | ||
1159 | } | 1200 | } |
1160 | dev->n_unaligned++; | 1201 | dev->n_unaligned++; |
1161 | goto bail; | 1202 | goto bail; |
@@ -1179,6 +1220,7 @@ static int ipath_verbs_send_pio(struct ipath_qp *qp, | |||
1179 | unsigned flush_wc; | 1220 | unsigned flush_wc; |
1180 | u32 control; | 1221 | u32 control; |
1181 | int ret; | 1222 | int ret; |
1223 | unsigned int flags; | ||
1182 | 1224 | ||
1183 | piobuf = ipath_getpiobuf(dd, plen, NULL); | 1225 | piobuf = ipath_getpiobuf(dd, plen, NULL); |
1184 | if (unlikely(piobuf == NULL)) { | 1226 | if (unlikely(piobuf == NULL)) { |
@@ -1249,8 +1291,11 @@ static int ipath_verbs_send_pio(struct ipath_qp *qp, | |||
1249 | } | 1291 | } |
1250 | copy_io(piobuf, ss, len, flush_wc); | 1292 | copy_io(piobuf, ss, len, flush_wc); |
1251 | done: | 1293 | done: |
1252 | if (qp->s_wqe) | 1294 | if (qp->s_wqe) { |
1295 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1253 | ipath_send_complete(qp, qp->s_wqe, IB_WC_SUCCESS); | 1296 | ipath_send_complete(qp, qp->s_wqe, IB_WC_SUCCESS); |
1297 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1298 | } | ||
1254 | ret = 0; | 1299 | ret = 0; |
1255 | bail: | 1300 | bail: |
1256 | return ret; | 1301 | return ret; |
@@ -1283,19 +1328,12 @@ int ipath_verbs_send(struct ipath_qp *qp, struct ipath_ib_header *hdr, | |||
1283 | * can defer SDMA restart until link goes ACTIVE without | 1328 | * can defer SDMA restart until link goes ACTIVE without |
1284 | * worrying about just how we got there. | 1329 | * worrying about just how we got there. |
1285 | */ | 1330 | */ |
1286 | if (qp->ibqp.qp_type == IB_QPT_SMI) | 1331 | if (qp->ibqp.qp_type == IB_QPT_SMI || |
1332 | !(dd->ipath_flags & IPATH_HAS_SEND_DMA)) | ||
1287 | ret = ipath_verbs_send_pio(qp, hdr, hdrwords, ss, len, | 1333 | ret = ipath_verbs_send_pio(qp, hdr, hdrwords, ss, len, |
1288 | plen, dwords); | 1334 | plen, dwords); |
1289 | /* All non-VL15 packets are dropped if link is not ACTIVE */ | ||
1290 | else if (!(dd->ipath_flags & IPATH_LINKACTIVE)) { | ||
1291 | if (qp->s_wqe) | ||
1292 | ipath_send_complete(qp, qp->s_wqe, IB_WC_SUCCESS); | ||
1293 | ret = 0; | ||
1294 | } else if (dd->ipath_flags & IPATH_HAS_SEND_DMA) | ||
1295 | ret = ipath_verbs_send_dma(qp, hdr, hdrwords, ss, len, | ||
1296 | plen, dwords); | ||
1297 | else | 1335 | else |
1298 | ret = ipath_verbs_send_pio(qp, hdr, hdrwords, ss, len, | 1336 | ret = ipath_verbs_send_dma(qp, hdr, hdrwords, ss, len, |
1299 | plen, dwords); | 1337 | plen, dwords); |
1300 | 1338 | ||
1301 | return ret; | 1339 | return ret; |
@@ -1403,27 +1441,46 @@ bail: | |||
1403 | * This is called from ipath_intr() at interrupt level when a PIO buffer is | 1441 | * This is called from ipath_intr() at interrupt level when a PIO buffer is |
1404 | * available after ipath_verbs_send() returned an error that no buffers were | 1442 | * available after ipath_verbs_send() returned an error that no buffers were |
1405 | * available. Return 1 if we consumed all the PIO buffers and we still have | 1443 | * available. Return 1 if we consumed all the PIO buffers and we still have |
1406 | * QPs waiting for buffers (for now, just do a tasklet_hi_schedule and | 1444 | * QPs waiting for buffers (for now, just restart the send tasklet and |
1407 | * return zero). | 1445 | * return zero). |
1408 | */ | 1446 | */ |
1409 | int ipath_ib_piobufavail(struct ipath_ibdev *dev) | 1447 | int ipath_ib_piobufavail(struct ipath_ibdev *dev) |
1410 | { | 1448 | { |
1449 | struct list_head *list; | ||
1450 | struct ipath_qp *qplist; | ||
1411 | struct ipath_qp *qp; | 1451 | struct ipath_qp *qp; |
1412 | unsigned long flags; | 1452 | unsigned long flags; |
1413 | 1453 | ||
1414 | if (dev == NULL) | 1454 | if (dev == NULL) |
1415 | goto bail; | 1455 | goto bail; |
1416 | 1456 | ||
1457 | list = &dev->piowait; | ||
1458 | qplist = NULL; | ||
1459 | |||
1417 | spin_lock_irqsave(&dev->pending_lock, flags); | 1460 | spin_lock_irqsave(&dev->pending_lock, flags); |
1418 | while (!list_empty(&dev->piowait)) { | 1461 | while (!list_empty(list)) { |
1419 | qp = list_entry(dev->piowait.next, struct ipath_qp, | 1462 | qp = list_entry(list->next, struct ipath_qp, piowait); |
1420 | piowait); | ||
1421 | list_del_init(&qp->piowait); | 1463 | list_del_init(&qp->piowait); |
1422 | clear_bit(IPATH_S_BUSY, &qp->s_busy); | 1464 | qp->pio_next = qplist; |
1423 | tasklet_hi_schedule(&qp->s_task); | 1465 | qplist = qp; |
1466 | atomic_inc(&qp->refcount); | ||
1424 | } | 1467 | } |
1425 | spin_unlock_irqrestore(&dev->pending_lock, flags); | 1468 | spin_unlock_irqrestore(&dev->pending_lock, flags); |
1426 | 1469 | ||
1470 | while (qplist != NULL) { | ||
1471 | qp = qplist; | ||
1472 | qplist = qp->pio_next; | ||
1473 | |||
1474 | spin_lock_irqsave(&qp->s_lock, flags); | ||
1475 | if (ib_ipath_state_ops[qp->state] & IPATH_PROCESS_SEND_OK) | ||
1476 | ipath_schedule_send(qp); | ||
1477 | spin_unlock_irqrestore(&qp->s_lock, flags); | ||
1478 | |||
1479 | /* Notify ipath_destroy_qp() if it is waiting. */ | ||
1480 | if (atomic_dec_and_test(&qp->refcount)) | ||
1481 | wake_up(&qp->wait); | ||
1482 | } | ||
1483 | |||
1427 | bail: | 1484 | bail: |
1428 | return 0; | 1485 | return 0; |
1429 | } | 1486 | } |
@@ -2145,11 +2202,12 @@ bail: | |||
2145 | void ipath_unregister_ib_device(struct ipath_ibdev *dev) | 2202 | void ipath_unregister_ib_device(struct ipath_ibdev *dev) |
2146 | { | 2203 | { |
2147 | struct ib_device *ibdev = &dev->ibdev; | 2204 | struct ib_device *ibdev = &dev->ibdev; |
2148 | 2205 | u32 qps_inuse; | |
2149 | disable_timer(dev->dd); | ||
2150 | 2206 | ||
2151 | ib_unregister_device(ibdev); | 2207 | ib_unregister_device(ibdev); |
2152 | 2208 | ||
2209 | disable_timer(dev->dd); | ||
2210 | |||
2153 | if (!list_empty(&dev->pending[0]) || | 2211 | if (!list_empty(&dev->pending[0]) || |
2154 | !list_empty(&dev->pending[1]) || | 2212 | !list_empty(&dev->pending[1]) || |
2155 | !list_empty(&dev->pending[2])) | 2213 | !list_empty(&dev->pending[2])) |
@@ -2164,7 +2222,10 @@ void ipath_unregister_ib_device(struct ipath_ibdev *dev) | |||
2164 | * Note that ipath_unregister_ib_device() can be called before all | 2222 | * Note that ipath_unregister_ib_device() can be called before all |
2165 | * the QPs are destroyed! | 2223 | * the QPs are destroyed! |
2166 | */ | 2224 | */ |
2167 | ipath_free_all_qps(&dev->qp_table); | 2225 | qps_inuse = ipath_free_all_qps(&dev->qp_table); |
2226 | if (qps_inuse) | ||
2227 | ipath_dev_err(dev->dd, "QP memory leak! %u still in use\n", | ||
2228 | qps_inuse); | ||
2168 | kfree(dev->qp_table.table); | 2229 | kfree(dev->qp_table.table); |
2169 | kfree(dev->lk_table.table); | 2230 | kfree(dev->lk_table.table); |
2170 | kfree(dev->txreq_bufs); | 2231 | kfree(dev->txreq_bufs); |
@@ -2215,17 +2276,14 @@ static ssize_t show_stats(struct device *device, struct device_attribute *attr, | |||
2215 | "RC OTH NAKs %d\n" | 2276 | "RC OTH NAKs %d\n" |
2216 | "RC timeouts %d\n" | 2277 | "RC timeouts %d\n" |
2217 | "RC RDMA dup %d\n" | 2278 | "RC RDMA dup %d\n" |
2218 | "RC stalls %d\n" | ||
2219 | "piobuf wait %d\n" | 2279 | "piobuf wait %d\n" |
2220 | "no piobuf %d\n" | ||
2221 | "unaligned %d\n" | 2280 | "unaligned %d\n" |
2222 | "PKT drops %d\n" | 2281 | "PKT drops %d\n" |
2223 | "WQE errs %d\n", | 2282 | "WQE errs %d\n", |
2224 | dev->n_rc_resends, dev->n_rc_qacks, dev->n_rc_acks, | 2283 | dev->n_rc_resends, dev->n_rc_qacks, dev->n_rc_acks, |
2225 | dev->n_seq_naks, dev->n_rdma_seq, dev->n_rnr_naks, | 2284 | dev->n_seq_naks, dev->n_rdma_seq, dev->n_rnr_naks, |
2226 | dev->n_other_naks, dev->n_timeouts, | 2285 | dev->n_other_naks, dev->n_timeouts, |
2227 | dev->n_rdma_dup_busy, dev->n_rc_stalls, dev->n_piowait, | 2286 | dev->n_rdma_dup_busy, dev->n_piowait, dev->n_unaligned, |
2228 | dev->n_no_piobuf, dev->n_unaligned, | ||
2229 | dev->n_pkt_drops, dev->n_wqe_errs); | 2287 | dev->n_pkt_drops, dev->n_wqe_errs); |
2230 | for (i = 0; i < ARRAY_SIZE(dev->opstats); i++) { | 2288 | for (i = 0; i < ARRAY_SIZE(dev->opstats); i++) { |
2231 | const struct ipath_opcode_stats *si = &dev->opstats[i]; | 2289 | const struct ipath_opcode_stats *si = &dev->opstats[i]; |
diff --git a/drivers/infiniband/hw/ipath/ipath_verbs.h b/drivers/infiniband/hw/ipath/ipath_verbs.h index 6514aa8306cd..9d12ae8a778e 100644 --- a/drivers/infiniband/hw/ipath/ipath_verbs.h +++ b/drivers/infiniband/hw/ipath/ipath_verbs.h | |||
@@ -74,6 +74,11 @@ | |||
74 | #define IPATH_POST_RECV_OK 0x02 | 74 | #define IPATH_POST_RECV_OK 0x02 |
75 | #define IPATH_PROCESS_RECV_OK 0x04 | 75 | #define IPATH_PROCESS_RECV_OK 0x04 |
76 | #define IPATH_PROCESS_SEND_OK 0x08 | 76 | #define IPATH_PROCESS_SEND_OK 0x08 |
77 | #define IPATH_PROCESS_NEXT_SEND_OK 0x10 | ||
78 | #define IPATH_FLUSH_SEND 0x20 | ||
79 | #define IPATH_FLUSH_RECV 0x40 | ||
80 | #define IPATH_PROCESS_OR_FLUSH_SEND \ | ||
81 | (IPATH_PROCESS_SEND_OK | IPATH_FLUSH_SEND) | ||
77 | 82 | ||
78 | /* IB Performance Manager status values */ | 83 | /* IB Performance Manager status values */ |
79 | #define IB_PMA_SAMPLE_STATUS_DONE 0x00 | 84 | #define IB_PMA_SAMPLE_STATUS_DONE 0x00 |
@@ -353,12 +358,14 @@ struct ipath_qp { | |||
353 | struct ib_qp ibqp; | 358 | struct ib_qp ibqp; |
354 | struct ipath_qp *next; /* link list for QPN hash table */ | 359 | struct ipath_qp *next; /* link list for QPN hash table */ |
355 | struct ipath_qp *timer_next; /* link list for ipath_ib_timer() */ | 360 | struct ipath_qp *timer_next; /* link list for ipath_ib_timer() */ |
361 | struct ipath_qp *pio_next; /* link for ipath_ib_piobufavail() */ | ||
356 | struct list_head piowait; /* link for wait PIO buf */ | 362 | struct list_head piowait; /* link for wait PIO buf */ |
357 | struct list_head timerwait; /* link for waiting for timeouts */ | 363 | struct list_head timerwait; /* link for waiting for timeouts */ |
358 | struct ib_ah_attr remote_ah_attr; | 364 | struct ib_ah_attr remote_ah_attr; |
359 | struct ipath_ib_header s_hdr; /* next packet header to send */ | 365 | struct ipath_ib_header s_hdr; /* next packet header to send */ |
360 | atomic_t refcount; | 366 | atomic_t refcount; |
361 | wait_queue_head_t wait; | 367 | wait_queue_head_t wait; |
368 | wait_queue_head_t wait_dma; | ||
362 | struct tasklet_struct s_task; | 369 | struct tasklet_struct s_task; |
363 | struct ipath_mmap_info *ip; | 370 | struct ipath_mmap_info *ip; |
364 | struct ipath_sge_state *s_cur_sge; | 371 | struct ipath_sge_state *s_cur_sge; |
@@ -369,7 +376,7 @@ struct ipath_qp { | |||
369 | struct ipath_sge_state s_rdma_read_sge; | 376 | struct ipath_sge_state s_rdma_read_sge; |
370 | struct ipath_sge_state r_sge; /* current receive data */ | 377 | struct ipath_sge_state r_sge; /* current receive data */ |
371 | spinlock_t s_lock; | 378 | spinlock_t s_lock; |
372 | unsigned long s_busy; | 379 | atomic_t s_dma_busy; |
373 | u16 s_pkt_delay; | 380 | u16 s_pkt_delay; |
374 | u16 s_hdrwords; /* size of s_hdr in 32 bit words */ | 381 | u16 s_hdrwords; /* size of s_hdr in 32 bit words */ |
375 | u32 s_cur_size; /* size of send packet in bytes */ | 382 | u32 s_cur_size; /* size of send packet in bytes */ |
@@ -383,6 +390,7 @@ struct ipath_qp { | |||
383 | u32 s_rnr_timeout; /* number of milliseconds for RNR timeout */ | 390 | u32 s_rnr_timeout; /* number of milliseconds for RNR timeout */ |
384 | u32 r_ack_psn; /* PSN for next ACK or atomic ACK */ | 391 | u32 r_ack_psn; /* PSN for next ACK or atomic ACK */ |
385 | u64 r_wr_id; /* ID for current receive WQE */ | 392 | u64 r_wr_id; /* ID for current receive WQE */ |
393 | unsigned long r_aflags; | ||
386 | u32 r_len; /* total length of r_sge */ | 394 | u32 r_len; /* total length of r_sge */ |
387 | u32 r_rcv_len; /* receive data len processed */ | 395 | u32 r_rcv_len; /* receive data len processed */ |
388 | u32 r_psn; /* expected rcv packet sequence number */ | 396 | u32 r_psn; /* expected rcv packet sequence number */ |
@@ -394,8 +402,7 @@ struct ipath_qp { | |||
394 | u8 r_state; /* opcode of last packet received */ | 402 | u8 r_state; /* opcode of last packet received */ |
395 | u8 r_nak_state; /* non-zero if NAK is pending */ | 403 | u8 r_nak_state; /* non-zero if NAK is pending */ |
396 | u8 r_min_rnr_timer; /* retry timeout value for RNR NAKs */ | 404 | u8 r_min_rnr_timer; /* retry timeout value for RNR NAKs */ |
397 | u8 r_reuse_sge; /* for UC receive errors */ | 405 | u8 r_flags; |
398 | u8 r_wrid_valid; /* r_wrid set but CQ entry not yet made */ | ||
399 | u8 r_max_rd_atomic; /* max number of RDMA read/atomic to receive */ | 406 | u8 r_max_rd_atomic; /* max number of RDMA read/atomic to receive */ |
400 | u8 r_head_ack_queue; /* index into s_ack_queue[] */ | 407 | u8 r_head_ack_queue; /* index into s_ack_queue[] */ |
401 | u8 qp_access_flags; | 408 | u8 qp_access_flags; |
@@ -404,13 +411,13 @@ struct ipath_qp { | |||
404 | u8 s_rnr_retry_cnt; | 411 | u8 s_rnr_retry_cnt; |
405 | u8 s_retry; /* requester retry counter */ | 412 | u8 s_retry; /* requester retry counter */ |
406 | u8 s_rnr_retry; /* requester RNR retry counter */ | 413 | u8 s_rnr_retry; /* requester RNR retry counter */ |
407 | u8 s_wait_credit; /* limit number of unacked packets sent */ | ||
408 | u8 s_pkey_index; /* PKEY index to use */ | 414 | u8 s_pkey_index; /* PKEY index to use */ |
409 | u8 s_max_rd_atomic; /* max number of RDMA read/atomic to send */ | 415 | u8 s_max_rd_atomic; /* max number of RDMA read/atomic to send */ |
410 | u8 s_num_rd_atomic; /* number of RDMA read/atomic pending */ | 416 | u8 s_num_rd_atomic; /* number of RDMA read/atomic pending */ |
411 | u8 s_tail_ack_queue; /* index into s_ack_queue[] */ | 417 | u8 s_tail_ack_queue; /* index into s_ack_queue[] */ |
412 | u8 s_flags; | 418 | u8 s_flags; |
413 | u8 s_dmult; | 419 | u8 s_dmult; |
420 | u8 s_draining; | ||
414 | u8 timeout; /* Timeout for this QP */ | 421 | u8 timeout; /* Timeout for this QP */ |
415 | enum ib_mtu path_mtu; | 422 | enum ib_mtu path_mtu; |
416 | u32 remote_qpn; | 423 | u32 remote_qpn; |
@@ -428,16 +435,40 @@ struct ipath_qp { | |||
428 | struct ipath_sge r_sg_list[0]; /* verified SGEs */ | 435 | struct ipath_sge r_sg_list[0]; /* verified SGEs */ |
429 | }; | 436 | }; |
430 | 437 | ||
431 | /* Bit definition for s_busy. */ | 438 | /* |
432 | #define IPATH_S_BUSY 0 | 439 | * Atomic bit definitions for r_aflags. |
440 | */ | ||
441 | #define IPATH_R_WRID_VALID 0 | ||
442 | |||
443 | /* | ||
444 | * Bit definitions for r_flags. | ||
445 | */ | ||
446 | #define IPATH_R_REUSE_SGE 0x01 | ||
447 | #define IPATH_R_RDMAR_SEQ 0x02 | ||
433 | 448 | ||
434 | /* | 449 | /* |
435 | * Bit definitions for s_flags. | 450 | * Bit definitions for s_flags. |
451 | * | ||
452 | * IPATH_S_FENCE_PENDING - waiting for all prior RDMA read or atomic SWQEs | ||
453 | * before processing the next SWQE | ||
454 | * IPATH_S_RDMAR_PENDING - waiting for any RDMA read or atomic SWQEs | ||
455 | * before processing the next SWQE | ||
456 | * IPATH_S_WAITING - waiting for RNR timeout or send buffer available. | ||
457 | * IPATH_S_WAIT_SSN_CREDIT - waiting for RC credits to process next SWQE | ||
458 | * IPATH_S_WAIT_DMA - waiting for send DMA queue to drain before generating | ||
459 | * next send completion entry not via send DMA. | ||
436 | */ | 460 | */ |
437 | #define IPATH_S_SIGNAL_REQ_WR 0x01 | 461 | #define IPATH_S_SIGNAL_REQ_WR 0x01 |
438 | #define IPATH_S_FENCE_PENDING 0x02 | 462 | #define IPATH_S_FENCE_PENDING 0x02 |
439 | #define IPATH_S_RDMAR_PENDING 0x04 | 463 | #define IPATH_S_RDMAR_PENDING 0x04 |
440 | #define IPATH_S_ACK_PENDING 0x08 | 464 | #define IPATH_S_ACK_PENDING 0x08 |
465 | #define IPATH_S_BUSY 0x10 | ||
466 | #define IPATH_S_WAITING 0x20 | ||
467 | #define IPATH_S_WAIT_SSN_CREDIT 0x40 | ||
468 | #define IPATH_S_WAIT_DMA 0x80 | ||
469 | |||
470 | #define IPATH_S_ANY_WAIT (IPATH_S_FENCE_PENDING | IPATH_S_RDMAR_PENDING | \ | ||
471 | IPATH_S_WAITING | IPATH_S_WAIT_SSN_CREDIT | IPATH_S_WAIT_DMA) | ||
441 | 472 | ||
442 | #define IPATH_PSN_CREDIT 512 | 473 | #define IPATH_PSN_CREDIT 512 |
443 | 474 | ||
@@ -573,13 +604,11 @@ struct ipath_ibdev { | |||
573 | u32 n_rnr_naks; | 604 | u32 n_rnr_naks; |
574 | u32 n_other_naks; | 605 | u32 n_other_naks; |
575 | u32 n_timeouts; | 606 | u32 n_timeouts; |
576 | u32 n_rc_stalls; | ||
577 | u32 n_pkt_drops; | 607 | u32 n_pkt_drops; |
578 | u32 n_vl15_dropped; | 608 | u32 n_vl15_dropped; |
579 | u32 n_wqe_errs; | 609 | u32 n_wqe_errs; |
580 | u32 n_rdma_dup_busy; | 610 | u32 n_rdma_dup_busy; |
581 | u32 n_piowait; | 611 | u32 n_piowait; |
582 | u32 n_no_piobuf; | ||
583 | u32 n_unaligned; | 612 | u32 n_unaligned; |
584 | u32 port_cap_flags; | 613 | u32 port_cap_flags; |
585 | u32 pma_sample_start; | 614 | u32 pma_sample_start; |
@@ -657,6 +686,17 @@ static inline struct ipath_ibdev *to_idev(struct ib_device *ibdev) | |||
657 | return container_of(ibdev, struct ipath_ibdev, ibdev); | 686 | return container_of(ibdev, struct ipath_ibdev, ibdev); |
658 | } | 687 | } |
659 | 688 | ||
689 | /* | ||
690 | * This must be called with s_lock held. | ||
691 | */ | ||
692 | static inline void ipath_schedule_send(struct ipath_qp *qp) | ||
693 | { | ||
694 | if (qp->s_flags & IPATH_S_ANY_WAIT) | ||
695 | qp->s_flags &= ~IPATH_S_ANY_WAIT; | ||
696 | if (!(qp->s_flags & IPATH_S_BUSY)) | ||
697 | tasklet_hi_schedule(&qp->s_task); | ||
698 | } | ||
699 | |||
660 | int ipath_process_mad(struct ib_device *ibdev, | 700 | int ipath_process_mad(struct ib_device *ibdev, |
661 | int mad_flags, | 701 | int mad_flags, |
662 | u8 port_num, | 702 | u8 port_num, |
@@ -706,12 +746,10 @@ int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | |||
706 | int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, | 746 | int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, |
707 | int attr_mask, struct ib_qp_init_attr *init_attr); | 747 | int attr_mask, struct ib_qp_init_attr *init_attr); |
708 | 748 | ||
709 | void ipath_free_all_qps(struct ipath_qp_table *qpt); | 749 | unsigned ipath_free_all_qps(struct ipath_qp_table *qpt); |
710 | 750 | ||
711 | int ipath_init_qp_table(struct ipath_ibdev *idev, int size); | 751 | int ipath_init_qp_table(struct ipath_ibdev *idev, int size); |
712 | 752 | ||
713 | void ipath_sqerror_qp(struct ipath_qp *qp, struct ib_wc *wc); | ||
714 | |||
715 | void ipath_get_credit(struct ipath_qp *qp, u32 aeth); | 753 | void ipath_get_credit(struct ipath_qp *qp, u32 aeth); |
716 | 754 | ||
717 | unsigned ipath_ib_rate_to_mult(enum ib_rate rate); | 755 | unsigned ipath_ib_rate_to_mult(enum ib_rate rate); |
@@ -729,7 +767,9 @@ void ipath_uc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | |||
729 | void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, | 767 | void ipath_rc_rcv(struct ipath_ibdev *dev, struct ipath_ib_header *hdr, |
730 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); | 768 | int has_grh, void *data, u32 tlen, struct ipath_qp *qp); |
731 | 769 | ||
732 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn, struct ib_wc *wc); | 770 | void ipath_restart_rc(struct ipath_qp *qp, u32 psn); |
771 | |||
772 | void ipath_rc_error(struct ipath_qp *qp, enum ib_wc_status err); | ||
733 | 773 | ||
734 | int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr); | 774 | int ipath_post_ud_send(struct ipath_qp *qp, struct ib_send_wr *wr); |
735 | 775 | ||
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c index 2f199c5c4a72..4521319b1406 100644 --- a/drivers/infiniband/hw/mlx4/cq.c +++ b/drivers/infiniband/hw/mlx4/cq.c | |||
@@ -246,7 +246,7 @@ err_mtt: | |||
246 | if (context) | 246 | if (context) |
247 | ib_umem_release(cq->umem); | 247 | ib_umem_release(cq->umem); |
248 | else | 248 | else |
249 | mlx4_ib_free_cq_buf(dev, &cq->buf, entries); | 249 | mlx4_ib_free_cq_buf(dev, &cq->buf, cq->ibcq.cqe); |
250 | 250 | ||
251 | err_db: | 251 | err_db: |
252 | if (!context) | 252 | if (!context) |
@@ -434,7 +434,7 @@ int mlx4_ib_destroy_cq(struct ib_cq *cq) | |||
434 | mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db); | 434 | mlx4_ib_db_unmap_user(to_mucontext(cq->uobject->context), &mcq->db); |
435 | ib_umem_release(mcq->umem); | 435 | ib_umem_release(mcq->umem); |
436 | } else { | 436 | } else { |
437 | mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe + 1); | 437 | mlx4_ib_free_cq_buf(dev, &mcq->buf, cq->cqe); |
438 | mlx4_db_free(dev->dev, &mcq->db); | 438 | mlx4_db_free(dev->dev, &mcq->db); |
439 | } | 439 | } |
440 | 440 | ||
diff --git a/drivers/infiniband/hw/nes/nes.c b/drivers/infiniband/hw/nes/nes.c index 9f7364a9096d..a4e9269a29bd 100644 --- a/drivers/infiniband/hw/nes/nes.c +++ b/drivers/infiniband/hw/nes/nes.c | |||
@@ -91,10 +91,6 @@ unsigned int nes_debug_level = 0; | |||
91 | module_param_named(debug_level, nes_debug_level, uint, 0644); | 91 | module_param_named(debug_level, nes_debug_level, uint, 0644); |
92 | MODULE_PARM_DESC(debug_level, "Enable debug output level"); | 92 | MODULE_PARM_DESC(debug_level, "Enable debug output level"); |
93 | 93 | ||
94 | unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR; | ||
95 | module_param(nes_lro_max_aggr, int, NES_LRO_MAX_AGGR); | ||
96 | MODULE_PARM_DESC(nes_mro_max_aggr, " nic LRO MAX packet aggregation"); | ||
97 | |||
98 | LIST_HEAD(nes_adapter_list); | 94 | LIST_HEAD(nes_adapter_list); |
99 | static LIST_HEAD(nes_dev_list); | 95 | static LIST_HEAD(nes_dev_list); |
100 | 96 | ||
diff --git a/drivers/infiniband/hw/nes/nes.h b/drivers/infiniband/hw/nes/nes.h index 1f9f7bf73862..61b46e9c7d2d 100644 --- a/drivers/infiniband/hw/nes/nes.h +++ b/drivers/infiniband/hw/nes/nes.h | |||
@@ -173,7 +173,6 @@ extern int disable_mpa_crc; | |||
173 | extern unsigned int send_first; | 173 | extern unsigned int send_first; |
174 | extern unsigned int nes_drv_opt; | 174 | extern unsigned int nes_drv_opt; |
175 | extern unsigned int nes_debug_level; | 175 | extern unsigned int nes_debug_level; |
176 | extern unsigned int nes_lro_max_aggr; | ||
177 | 176 | ||
178 | extern struct list_head nes_adapter_list; | 177 | extern struct list_head nes_adapter_list; |
179 | 178 | ||
diff --git a/drivers/infiniband/hw/nes/nes_hw.c b/drivers/infiniband/hw/nes/nes_hw.c index 8dc70f9bad2f..d3278f111ca7 100644 --- a/drivers/infiniband/hw/nes/nes_hw.c +++ b/drivers/infiniband/hw/nes/nes_hw.c | |||
@@ -42,6 +42,10 @@ | |||
42 | 42 | ||
43 | #include "nes.h" | 43 | #include "nes.h" |
44 | 44 | ||
45 | static unsigned int nes_lro_max_aggr = NES_LRO_MAX_AGGR; | ||
46 | module_param(nes_lro_max_aggr, uint, 0444); | ||
47 | MODULE_PARM_DESC(nes_lro_max_aggr, "NIC LRO max packet aggregation"); | ||
48 | |||
45 | static u32 crit_err_count; | 49 | static u32 crit_err_count; |
46 | u32 int_mod_timer_init; | 50 | u32 int_mod_timer_init; |
47 | u32 int_mod_cq_depth_256; | 51 | u32 int_mod_cq_depth_256; |
@@ -1738,7 +1742,7 @@ int nes_init_nic_qp(struct nes_device *nesdev, struct net_device *netdev) | |||
1738 | jumbomode = 1; | 1742 | jumbomode = 1; |
1739 | nes_nic_init_timer_defaults(nesdev, jumbomode); | 1743 | nes_nic_init_timer_defaults(nesdev, jumbomode); |
1740 | } | 1744 | } |
1741 | nesvnic->lro_mgr.max_aggr = NES_LRO_MAX_AGGR; | 1745 | nesvnic->lro_mgr.max_aggr = nes_lro_max_aggr; |
1742 | nesvnic->lro_mgr.max_desc = NES_MAX_LRO_DESCRIPTORS; | 1746 | nesvnic->lro_mgr.max_desc = NES_MAX_LRO_DESCRIPTORS; |
1743 | nesvnic->lro_mgr.lro_arr = nesvnic->lro_desc; | 1747 | nesvnic->lro_mgr.lro_arr = nesvnic->lro_desc; |
1744 | nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr; | 1748 | nesvnic->lro_mgr.get_skb_header = nes_lro_get_skb_hdr; |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index 9044f8803532..ca126fc2b853 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h | |||
@@ -334,6 +334,7 @@ struct ipoib_dev_priv { | |||
334 | #endif | 334 | #endif |
335 | int hca_caps; | 335 | int hca_caps; |
336 | struct ipoib_ethtool_st ethtool; | 336 | struct ipoib_ethtool_st ethtool; |
337 | struct timer_list poll_timer; | ||
337 | }; | 338 | }; |
338 | 339 | ||
339 | struct ipoib_ah { | 340 | struct ipoib_ah { |
@@ -404,6 +405,7 @@ extern struct workqueue_struct *ipoib_workqueue; | |||
404 | 405 | ||
405 | int ipoib_poll(struct napi_struct *napi, int budget); | 406 | int ipoib_poll(struct napi_struct *napi, int budget); |
406 | void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr); | 407 | void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr); |
408 | void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr); | ||
407 | 409 | ||
408 | struct ipoib_ah *ipoib_create_ah(struct net_device *dev, | 410 | struct ipoib_ah *ipoib_create_ah(struct net_device *dev, |
409 | struct ib_pd *pd, struct ib_ah_attr *attr); | 411 | struct ib_pd *pd, struct ib_ah_attr *attr); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index 97b815c1a3fc..f429bce24c20 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c | |||
@@ -461,6 +461,26 @@ void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr) | |||
461 | netif_rx_schedule(dev, &priv->napi); | 461 | netif_rx_schedule(dev, &priv->napi); |
462 | } | 462 | } |
463 | 463 | ||
464 | static void drain_tx_cq(struct net_device *dev) | ||
465 | { | ||
466 | struct ipoib_dev_priv *priv = netdev_priv(dev); | ||
467 | unsigned long flags; | ||
468 | |||
469 | spin_lock_irqsave(&priv->tx_lock, flags); | ||
470 | while (poll_tx(priv)) | ||
471 | ; /* nothing */ | ||
472 | |||
473 | if (netif_queue_stopped(dev)) | ||
474 | mod_timer(&priv->poll_timer, jiffies + 1); | ||
475 | |||
476 | spin_unlock_irqrestore(&priv->tx_lock, flags); | ||
477 | } | ||
478 | |||
479 | void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr) | ||
480 | { | ||
481 | drain_tx_cq((struct net_device *)dev_ptr); | ||
482 | } | ||
483 | |||
464 | static inline int post_send(struct ipoib_dev_priv *priv, | 484 | static inline int post_send(struct ipoib_dev_priv *priv, |
465 | unsigned int wr_id, | 485 | unsigned int wr_id, |
466 | struct ib_ah *address, u32 qpn, | 486 | struct ib_ah *address, u32 qpn, |
@@ -555,12 +575,22 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
555 | else | 575 | else |
556 | priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM; | 576 | priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM; |
557 | 577 | ||
578 | if (++priv->tx_outstanding == ipoib_sendq_size) { | ||
579 | ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); | ||
580 | if (ib_req_notify_cq(priv->send_cq, IB_CQ_NEXT_COMP)) | ||
581 | ipoib_warn(priv, "request notify on send CQ failed\n"); | ||
582 | netif_stop_queue(dev); | ||
583 | } | ||
584 | |||
558 | if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), | 585 | if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1), |
559 | address->ah, qpn, tx_req, phead, hlen))) { | 586 | address->ah, qpn, tx_req, phead, hlen))) { |
560 | ipoib_warn(priv, "post_send failed\n"); | 587 | ipoib_warn(priv, "post_send failed\n"); |
561 | ++dev->stats.tx_errors; | 588 | ++dev->stats.tx_errors; |
589 | --priv->tx_outstanding; | ||
562 | ipoib_dma_unmap_tx(priv->ca, tx_req); | 590 | ipoib_dma_unmap_tx(priv->ca, tx_req); |
563 | dev_kfree_skb_any(skb); | 591 | dev_kfree_skb_any(skb); |
592 | if (netif_queue_stopped(dev)) | ||
593 | netif_wake_queue(dev); | ||
564 | } else { | 594 | } else { |
565 | dev->trans_start = jiffies; | 595 | dev->trans_start = jiffies; |
566 | 596 | ||
@@ -568,14 +598,11 @@ void ipoib_send(struct net_device *dev, struct sk_buff *skb, | |||
568 | ++priv->tx_head; | 598 | ++priv->tx_head; |
569 | skb_orphan(skb); | 599 | skb_orphan(skb); |
570 | 600 | ||
571 | if (++priv->tx_outstanding == ipoib_sendq_size) { | ||
572 | ipoib_dbg(priv, "TX ring full, stopping kernel net queue\n"); | ||
573 | netif_stop_queue(dev); | ||
574 | } | ||
575 | } | 601 | } |
576 | 602 | ||
577 | if (unlikely(priv->tx_outstanding > MAX_SEND_CQE)) | 603 | if (unlikely(priv->tx_outstanding > MAX_SEND_CQE)) |
578 | poll_tx(priv); | 604 | while (poll_tx(priv)) |
605 | ; /* nothing */ | ||
579 | } | 606 | } |
580 | 607 | ||
581 | static void __ipoib_reap_ah(struct net_device *dev) | 608 | static void __ipoib_reap_ah(struct net_device *dev) |
@@ -609,6 +636,11 @@ void ipoib_reap_ah(struct work_struct *work) | |||
609 | round_jiffies_relative(HZ)); | 636 | round_jiffies_relative(HZ)); |
610 | } | 637 | } |
611 | 638 | ||
639 | static void ipoib_ib_tx_timer_func(unsigned long ctx) | ||
640 | { | ||
641 | drain_tx_cq((struct net_device *)ctx); | ||
642 | } | ||
643 | |||
612 | int ipoib_ib_dev_open(struct net_device *dev) | 644 | int ipoib_ib_dev_open(struct net_device *dev) |
613 | { | 645 | { |
614 | struct ipoib_dev_priv *priv = netdev_priv(dev); | 646 | struct ipoib_dev_priv *priv = netdev_priv(dev); |
@@ -645,6 +677,10 @@ int ipoib_ib_dev_open(struct net_device *dev) | |||
645 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, | 677 | queue_delayed_work(ipoib_workqueue, &priv->ah_reap_task, |
646 | round_jiffies_relative(HZ)); | 678 | round_jiffies_relative(HZ)); |
647 | 679 | ||
680 | init_timer(&priv->poll_timer); | ||
681 | priv->poll_timer.function = ipoib_ib_tx_timer_func; | ||
682 | priv->poll_timer.data = (unsigned long)dev; | ||
683 | |||
648 | set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); | 684 | set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags); |
649 | 685 | ||
650 | return 0; | 686 | return 0; |
@@ -810,6 +846,7 @@ int ipoib_ib_dev_stop(struct net_device *dev, int flush) | |||
810 | ipoib_dbg(priv, "All sends and receives done.\n"); | 846 | ipoib_dbg(priv, "All sends and receives done.\n"); |
811 | 847 | ||
812 | timeout: | 848 | timeout: |
849 | del_timer_sync(&priv->poll_timer); | ||
813 | qp_attr.qp_state = IB_QPS_RESET; | 850 | qp_attr.qp_state = IB_QPS_RESET; |
814 | if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE)) | 851 | if (ib_modify_qp(priv->qp, &qp_attr, IB_QP_STATE)) |
815 | ipoib_warn(priv, "Failed to modify QP to RESET state\n"); | 852 | ipoib_warn(priv, "Failed to modify QP to RESET state\n"); |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c index c1e7ece1fd44..8766d29ce3b7 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c | |||
@@ -187,7 +187,8 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca) | |||
187 | goto out_free_mr; | 187 | goto out_free_mr; |
188 | } | 188 | } |
189 | 189 | ||
190 | priv->send_cq = ib_create_cq(priv->ca, NULL, NULL, dev, ipoib_sendq_size, 0); | 190 | priv->send_cq = ib_create_cq(priv->ca, ipoib_send_comp_handler, NULL, |
191 | dev, ipoib_sendq_size, 0); | ||
191 | if (IS_ERR(priv->send_cq)) { | 192 | if (IS_ERR(priv->send_cq)) { |
192 | printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name); | 193 | printk(KERN_WARNING "%s: failed to create send CQ\n", ca->name); |
193 | goto out_free_recv_cq; | 194 | goto out_free_recv_cq; |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 92b683411d5a..3ad8bd9f7543 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -14,7 +14,7 @@ if INPUT_MISC | |||
14 | 14 | ||
15 | config INPUT_PCSPKR | 15 | config INPUT_PCSPKR |
16 | tristate "PC Speaker support" | 16 | tristate "PC Speaker support" |
17 | depends on ALPHA || X86 || MIPS || PPC_PREP || PPC_CHRP || PPC_PSERIES | 17 | depends on PCSPKR_PLATFORM |
18 | depends on SND_PCSP=n | 18 | depends on SND_PCSP=n |
19 | help | 19 | help |
20 | Say Y here if you want the standard PC Speaker to be used for | 20 | Say Y here if you want the standard PC Speaker to be used for |
diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c index 02b3ad8c0826..edfedd9a166c 100644 --- a/drivers/input/serio/hp_sdc.c +++ b/drivers/input/serio/hp_sdc.c | |||
@@ -69,6 +69,7 @@ | |||
69 | #include <linux/time.h> | 69 | #include <linux/time.h> |
70 | #include <linux/slab.h> | 70 | #include <linux/slab.h> |
71 | #include <linux/hil.h> | 71 | #include <linux/hil.h> |
72 | #include <linux/semaphore.h> | ||
72 | #include <asm/io.h> | 73 | #include <asm/io.h> |
73 | #include <asm/system.h> | 74 | #include <asm/system.h> |
74 | 75 | ||
diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index 3b4e13b9ce1b..f451c7351a9d 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h | |||
@@ -25,7 +25,7 @@ | |||
25 | #elif defined(__arm__) | 25 | #elif defined(__arm__) |
26 | /* defined in include/asm-arm/arch-xxx/irqs.h */ | 26 | /* defined in include/asm-arm/arch-xxx/irqs.h */ |
27 | #include <asm/irq.h> | 27 | #include <asm/irq.h> |
28 | #elif defined(CONFIG_SUPERH64) | 28 | #elif defined(CONFIG_SH_CAYMAN) |
29 | #include <asm/irq.h> | 29 | #include <asm/irq.h> |
30 | #else | 30 | #else |
31 | # define I8042_KBD_IRQ 1 | 31 | # define I8042_KBD_IRQ 1 |
diff --git a/drivers/isdn/capi/capiutil.c b/drivers/isdn/capi/capiutil.c index ebef4ce1b00c..29419a8d31dc 100644 --- a/drivers/isdn/capi/capiutil.c +++ b/drivers/isdn/capi/capiutil.c | |||
@@ -948,17 +948,17 @@ int __init cdebug_init(void) | |||
948 | { | 948 | { |
949 | g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL); | 949 | g_cmsg= kmalloc(sizeof(_cmsg), GFP_KERNEL); |
950 | if (!g_cmsg) | 950 | if (!g_cmsg) |
951 | return ENOMEM; | 951 | return -ENOMEM; |
952 | g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL); | 952 | g_debbuf = kmalloc(sizeof(_cdebbuf), GFP_KERNEL); |
953 | if (!g_debbuf) { | 953 | if (!g_debbuf) { |
954 | kfree(g_cmsg); | 954 | kfree(g_cmsg); |
955 | return ENOMEM; | 955 | return -ENOMEM; |
956 | } | 956 | } |
957 | g_debbuf->buf = kmalloc(CDEBUG_GSIZE, GFP_KERNEL); | 957 | g_debbuf->buf = kmalloc(CDEBUG_GSIZE, GFP_KERNEL); |
958 | if (!g_debbuf->buf) { | 958 | if (!g_debbuf->buf) { |
959 | kfree(g_cmsg); | 959 | kfree(g_cmsg); |
960 | kfree(g_debbuf); | 960 | kfree(g_debbuf); |
961 | return ENOMEM;; | 961 | return -ENOMEM;; |
962 | } | 962 | } |
963 | g_debbuf->size = CDEBUG_GSIZE; | 963 | g_debbuf->size = CDEBUG_GSIZE; |
964 | g_debbuf->buf[0] = 0; | 964 | g_debbuf->buf[0] = 0; |
diff --git a/drivers/isdn/hysdn/Kconfig b/drivers/isdn/hysdn/Kconfig index c6d8a7042988..c9e4231968ef 100644 --- a/drivers/isdn/hysdn/Kconfig +++ b/drivers/isdn/hysdn/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | config HYSDN | 4 | config HYSDN |
5 | tristate "Hypercope HYSDN cards (Champ, Ergo, Metro) support (module only)" | 5 | tristate "Hypercope HYSDN cards (Champ, Ergo, Metro) support (module only)" |
6 | depends on m && PROC_FS && PCI && BROKEN_ON_SMP | 6 | depends on m && PROC_FS && PCI |
7 | help | 7 | help |
8 | Say Y here if you have one of Hypercope's active PCI ISDN cards | 8 | Say Y here if you have one of Hypercope's active PCI ISDN cards |
9 | Champ, Ergo and Metro. You will then get a module called hysdn. | 9 | Champ, Ergo and Metro. You will then get a module called hysdn. |
diff --git a/drivers/isdn/hysdn/boardergo.c b/drivers/isdn/hysdn/boardergo.c index 6cdbad3a9926..3eb096f0ae1b 100644 --- a/drivers/isdn/hysdn/boardergo.c +++ b/drivers/isdn/hysdn/boardergo.c | |||
@@ -64,10 +64,11 @@ ergo_interrupt(int intno, void *dev_id) | |||
64 | } /* ergo_interrupt */ | 64 | } /* ergo_interrupt */ |
65 | 65 | ||
66 | /******************************************************************************/ | 66 | /******************************************************************************/ |
67 | /* ergo_irq_bh is the function called by the immediate kernel task list after */ | 67 | /* ergo_irq_bh will be called as part of the kernel clearing its shared work */ |
68 | /* being activated with queue_task and no interrupts active. This task is the */ | 68 | /* queue sometime after a call to schedule_work has been made passing our */ |
69 | /* only one handling data transfer from or to the card after booting. The task */ | 69 | /* work_struct. This task is the only one handling data transfer from or to */ |
70 | /* may be queued from everywhere (interrupts included). */ | 70 | /* the card after booting. The task may be queued from everywhere */ |
71 | /* (interrupts included). */ | ||
71 | /******************************************************************************/ | 72 | /******************************************************************************/ |
72 | static void | 73 | static void |
73 | ergo_irq_bh(struct work_struct *ugli_api) | 74 | ergo_irq_bh(struct work_struct *ugli_api) |
@@ -90,7 +91,6 @@ ergo_irq_bh(struct work_struct *ugli_api) | |||
90 | card->hw_lock = 1; /* we now lock the hardware */ | 91 | card->hw_lock = 1; /* we now lock the hardware */ |
91 | 92 | ||
92 | do { | 93 | do { |
93 | sti(); /* reenable other ints */ | ||
94 | again = 0; /* assume loop not to be repeated */ | 94 | again = 0; /* assume loop not to be repeated */ |
95 | 95 | ||
96 | if (!dpr->ToHyFlag) { | 96 | if (!dpr->ToHyFlag) { |
@@ -110,7 +110,6 @@ ergo_irq_bh(struct work_struct *ugli_api) | |||
110 | again = 1; /* restart loop */ | 110 | again = 1; /* restart loop */ |
111 | } | 111 | } |
112 | } /* a message has arrived for us */ | 112 | } /* a message has arrived for us */ |
113 | cli(); /* no further ints */ | ||
114 | if (again) { | 113 | if (again) { |
115 | dpr->ToHyInt = 1; | 114 | dpr->ToHyInt = 1; |
116 | dpr->ToPcInt = 1; /* interrupt to E1 for all cards */ | 115 | dpr->ToPcInt = 1; /* interrupt to E1 for all cards */ |
@@ -242,7 +241,6 @@ ergo_writebootimg(struct HYSDN_CARD *card, unsigned char *buf, | |||
242 | byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN); /* start E1 processor */ | 241 | byteout(card->iobase + PCI9050_USER_IO, PCI9050_E1_RUN); /* start E1 processor */ |
243 | /* the interrupts are still masked */ | 242 | /* the interrupts are still masked */ |
244 | 243 | ||
245 | sti(); | ||
246 | msleep_interruptible(20); /* Timeout 20ms */ | 244 | msleep_interruptible(20); /* Timeout 20ms */ |
247 | 245 | ||
248 | if (((tDpramBootSpooler *) card->dpram)->Len != DPRAM_SPOOLER_DATA_SIZE) { | 246 | if (((tDpramBootSpooler *) card->dpram)->Len != DPRAM_SPOOLER_DATA_SIZE) { |
@@ -276,7 +274,6 @@ ergo_writebootseq(struct HYSDN_CARD *card, unsigned char *buf, int len) | |||
276 | dst = sp->Data; /* point to data in spool structure */ | 274 | dst = sp->Data; /* point to data in spool structure */ |
277 | buflen = sp->Len; /* maximum len of spooled data */ | 275 | buflen = sp->Len; /* maximum len of spooled data */ |
278 | wr_mirror = sp->WrPtr; /* only once read */ | 276 | wr_mirror = sp->WrPtr; /* only once read */ |
279 | sti(); | ||
280 | 277 | ||
281 | /* try until all bytes written or error */ | 278 | /* try until all bytes written or error */ |
282 | i = 0x1000; /* timeout value */ | 279 | i = 0x1000; /* timeout value */ |
@@ -380,7 +377,6 @@ ergo_waitpofready(struct HYSDN_CARD *card) | |||
380 | #endif /* CONFIG_HYSDN_CAPI */ | 377 | #endif /* CONFIG_HYSDN_CAPI */ |
381 | return (0); /* success */ | 378 | return (0); /* success */ |
382 | } /* data has arrived */ | 379 | } /* data has arrived */ |
383 | sti(); | ||
384 | msleep_interruptible(50); /* Timeout 50ms */ | 380 | msleep_interruptible(50); /* Timeout 50ms */ |
385 | } /* wait until timeout */ | 381 | } /* wait until timeout */ |
386 | 382 | ||
diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 20978205cd02..b8b9e44f7f4e 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c | |||
@@ -37,7 +37,7 @@ | |||
37 | #include <linux/device.h> | 37 | #include <linux/device.h> |
38 | #include <linux/kthread.h> | 38 | #include <linux/kthread.h> |
39 | #include <linux/platform_device.h> | 39 | #include <linux/platform_device.h> |
40 | #include <linux/semaphore.h> | 40 | #include <linux/mutex.h> |
41 | 41 | ||
42 | #include <asm/uaccess.h> | 42 | #include <asm/uaccess.h> |
43 | #ifdef CONFIG_PPC | 43 | #ifdef CONFIG_PPC |
@@ -102,7 +102,7 @@ static struct adb_handler { | |||
102 | } adb_handler[16]; | 102 | } adb_handler[16]; |
103 | 103 | ||
104 | /* | 104 | /* |
105 | * The adb_handler_sem mutex protects all accesses to the original_address | 105 | * The adb_handler_mutex mutex protects all accesses to the original_address |
106 | * and handler_id fields of adb_handler[i] for all i, and changes to the | 106 | * and handler_id fields of adb_handler[i] for all i, and changes to the |
107 | * handler field. | 107 | * handler field. |
108 | * Accesses to the handler field are protected by the adb_handler_lock | 108 | * Accesses to the handler field are protected by the adb_handler_lock |
@@ -110,7 +110,7 @@ static struct adb_handler { | |||
110 | * time adb_unregister returns, we know that the old handler isn't being | 110 | * time adb_unregister returns, we know that the old handler isn't being |
111 | * called. | 111 | * called. |
112 | */ | 112 | */ |
113 | static DECLARE_MUTEX(adb_handler_sem); | 113 | static DEFINE_MUTEX(adb_handler_mutex); |
114 | static DEFINE_RWLOCK(adb_handler_lock); | 114 | static DEFINE_RWLOCK(adb_handler_lock); |
115 | 115 | ||
116 | #if 0 | 116 | #if 0 |
@@ -355,7 +355,7 @@ do_adb_reset_bus(void) | |||
355 | msleep(500); | 355 | msleep(500); |
356 | } | 356 | } |
357 | 357 | ||
358 | down(&adb_handler_sem); | 358 | mutex_lock(&adb_handler_mutex); |
359 | write_lock_irq(&adb_handler_lock); | 359 | write_lock_irq(&adb_handler_lock); |
360 | memset(adb_handler, 0, sizeof(adb_handler)); | 360 | memset(adb_handler, 0, sizeof(adb_handler)); |
361 | write_unlock_irq(&adb_handler_lock); | 361 | write_unlock_irq(&adb_handler_lock); |
@@ -376,7 +376,7 @@ do_adb_reset_bus(void) | |||
376 | if (adb_controller->autopoll) | 376 | if (adb_controller->autopoll) |
377 | adb_controller->autopoll(autopoll_devs); | 377 | adb_controller->autopoll(autopoll_devs); |
378 | } | 378 | } |
379 | up(&adb_handler_sem); | 379 | mutex_unlock(&adb_handler_mutex); |
380 | 380 | ||
381 | blocking_notifier_call_chain(&adb_client_list, | 381 | blocking_notifier_call_chain(&adb_client_list, |
382 | ADB_MSG_POST_RESET, NULL); | 382 | ADB_MSG_POST_RESET, NULL); |
@@ -454,7 +454,7 @@ adb_register(int default_id, int handler_id, struct adb_ids *ids, | |||
454 | { | 454 | { |
455 | int i; | 455 | int i; |
456 | 456 | ||
457 | down(&adb_handler_sem); | 457 | mutex_lock(&adb_handler_mutex); |
458 | ids->nids = 0; | 458 | ids->nids = 0; |
459 | for (i = 1; i < 16; i++) { | 459 | for (i = 1; i < 16; i++) { |
460 | if ((adb_handler[i].original_address == default_id) && | 460 | if ((adb_handler[i].original_address == default_id) && |
@@ -472,7 +472,7 @@ adb_register(int default_id, int handler_id, struct adb_ids *ids, | |||
472 | ids->id[ids->nids++] = i; | 472 | ids->id[ids->nids++] = i; |
473 | } | 473 | } |
474 | } | 474 | } |
475 | up(&adb_handler_sem); | 475 | mutex_unlock(&adb_handler_mutex); |
476 | return ids->nids; | 476 | return ids->nids; |
477 | } | 477 | } |
478 | 478 | ||
@@ -481,7 +481,7 @@ adb_unregister(int index) | |||
481 | { | 481 | { |
482 | int ret = -ENODEV; | 482 | int ret = -ENODEV; |
483 | 483 | ||
484 | down(&adb_handler_sem); | 484 | mutex_lock(&adb_handler_mutex); |
485 | write_lock_irq(&adb_handler_lock); | 485 | write_lock_irq(&adb_handler_lock); |
486 | if (adb_handler[index].handler) { | 486 | if (adb_handler[index].handler) { |
487 | while(adb_handler[index].busy) { | 487 | while(adb_handler[index].busy) { |
@@ -493,7 +493,7 @@ adb_unregister(int index) | |||
493 | adb_handler[index].handler = NULL; | 493 | adb_handler[index].handler = NULL; |
494 | } | 494 | } |
495 | write_unlock_irq(&adb_handler_lock); | 495 | write_unlock_irq(&adb_handler_lock); |
496 | up(&adb_handler_sem); | 496 | mutex_unlock(&adb_handler_mutex); |
497 | return ret; | 497 | return ret; |
498 | } | 498 | } |
499 | 499 | ||
@@ -557,19 +557,19 @@ adb_try_handler_change(int address, int new_id) | |||
557 | { | 557 | { |
558 | int ret; | 558 | int ret; |
559 | 559 | ||
560 | down(&adb_handler_sem); | 560 | mutex_lock(&adb_handler_mutex); |
561 | ret = try_handler_change(address, new_id); | 561 | ret = try_handler_change(address, new_id); |
562 | up(&adb_handler_sem); | 562 | mutex_unlock(&adb_handler_mutex); |
563 | return ret; | 563 | return ret; |
564 | } | 564 | } |
565 | 565 | ||
566 | int | 566 | int |
567 | adb_get_infos(int address, int *original_address, int *handler_id) | 567 | adb_get_infos(int address, int *original_address, int *handler_id) |
568 | { | 568 | { |
569 | down(&adb_handler_sem); | 569 | mutex_lock(&adb_handler_mutex); |
570 | *original_address = adb_handler[address].original_address; | 570 | *original_address = adb_handler[address].original_address; |
571 | *handler_id = adb_handler[address].handler_id; | 571 | *handler_id = adb_handler[address].handler_id; |
572 | up(&adb_handler_sem); | 572 | mutex_unlock(&adb_handler_mutex); |
573 | 573 | ||
574 | return (*original_address != 0); | 574 | return (*original_address != 0); |
575 | } | 575 | } |
@@ -628,10 +628,10 @@ do_adb_query(struct adb_request *req) | |||
628 | case ADB_QUERY_GETDEVINFO: | 628 | case ADB_QUERY_GETDEVINFO: |
629 | if (req->nbytes < 3) | 629 | if (req->nbytes < 3) |
630 | break; | 630 | break; |
631 | down(&adb_handler_sem); | 631 | mutex_lock(&adb_handler_mutex); |
632 | req->reply[0] = adb_handler[req->data[2]].original_address; | 632 | req->reply[0] = adb_handler[req->data[2]].original_address; |
633 | req->reply[1] = adb_handler[req->data[2]].handler_id; | 633 | req->reply[1] = adb_handler[req->data[2]].handler_id; |
634 | up(&adb_handler_sem); | 634 | mutex_unlock(&adb_handler_mutex); |
635 | req->complete = 1; | 635 | req->complete = 1; |
636 | req->reply_len = 2; | 636 | req->reply_len = 2; |
637 | adb_write_done(req); | 637 | adb_write_done(req); |
diff --git a/drivers/macintosh/therm_pm72.c b/drivers/macintosh/therm_pm72.c index 1e0a69a5e815..ddfb426a9abd 100644 --- a/drivers/macintosh/therm_pm72.c +++ b/drivers/macintosh/therm_pm72.c | |||
@@ -122,6 +122,7 @@ | |||
122 | #include <linux/kmod.h> | 122 | #include <linux/kmod.h> |
123 | #include <linux/i2c.h> | 123 | #include <linux/i2c.h> |
124 | #include <linux/kthread.h> | 124 | #include <linux/kthread.h> |
125 | #include <linux/mutex.h> | ||
125 | #include <asm/prom.h> | 126 | #include <asm/prom.h> |
126 | #include <asm/machdep.h> | 127 | #include <asm/machdep.h> |
127 | #include <asm/io.h> | 128 | #include <asm/io.h> |
@@ -169,7 +170,7 @@ static int rackmac; | |||
169 | static s32 dimm_output_clamp; | 170 | static s32 dimm_output_clamp; |
170 | static int fcu_rpm_shift; | 171 | static int fcu_rpm_shift; |
171 | static int fcu_tickle_ticks; | 172 | static int fcu_tickle_ticks; |
172 | static DECLARE_MUTEX(driver_lock); | 173 | static DEFINE_MUTEX(driver_lock); |
173 | 174 | ||
174 | /* | 175 | /* |
175 | * We have 3 types of CPU PID control. One is "split" old style control | 176 | * We have 3 types of CPU PID control. One is "split" old style control |
@@ -729,9 +730,9 @@ static void fetch_cpu_pumps_minmax(void) | |||
729 | static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ | 730 | static ssize_t show_##name(struct device *dev, struct device_attribute *attr, char *buf) \ |
730 | { \ | 731 | { \ |
731 | ssize_t r; \ | 732 | ssize_t r; \ |
732 | down(&driver_lock); \ | 733 | mutex_lock(&driver_lock); \ |
733 | r = sprintf(buf, "%d.%03d", FIX32TOPRINT(data)); \ | 734 | r = sprintf(buf, "%d.%03d", FIX32TOPRINT(data)); \ |
734 | up(&driver_lock); \ | 735 | mutex_unlock(&driver_lock); \ |
735 | return r; \ | 736 | return r; \ |
736 | } | 737 | } |
737 | #define BUILD_SHOW_FUNC_INT(name, data) \ | 738 | #define BUILD_SHOW_FUNC_INT(name, data) \ |
@@ -1803,11 +1804,11 @@ static int main_control_loop(void *x) | |||
1803 | { | 1804 | { |
1804 | DBG("main_control_loop started\n"); | 1805 | DBG("main_control_loop started\n"); |
1805 | 1806 | ||
1806 | down(&driver_lock); | 1807 | mutex_lock(&driver_lock); |
1807 | 1808 | ||
1808 | if (start_fcu() < 0) { | 1809 | if (start_fcu() < 0) { |
1809 | printk(KERN_ERR "kfand: failed to start FCU\n"); | 1810 | printk(KERN_ERR "kfand: failed to start FCU\n"); |
1810 | up(&driver_lock); | 1811 | mutex_unlock(&driver_lock); |
1811 | goto out; | 1812 | goto out; |
1812 | } | 1813 | } |
1813 | 1814 | ||
@@ -1822,14 +1823,14 @@ static int main_control_loop(void *x) | |||
1822 | 1823 | ||
1823 | fcu_tickle_ticks = FCU_TICKLE_TICKS; | 1824 | fcu_tickle_ticks = FCU_TICKLE_TICKS; |
1824 | 1825 | ||
1825 | up(&driver_lock); | 1826 | mutex_unlock(&driver_lock); |
1826 | 1827 | ||
1827 | while (state == state_attached) { | 1828 | while (state == state_attached) { |
1828 | unsigned long elapsed, start; | 1829 | unsigned long elapsed, start; |
1829 | 1830 | ||
1830 | start = jiffies; | 1831 | start = jiffies; |
1831 | 1832 | ||
1832 | down(&driver_lock); | 1833 | mutex_lock(&driver_lock); |
1833 | 1834 | ||
1834 | /* Tickle the FCU just in case */ | 1835 | /* Tickle the FCU just in case */ |
1835 | if (--fcu_tickle_ticks < 0) { | 1836 | if (--fcu_tickle_ticks < 0) { |
@@ -1861,7 +1862,7 @@ static int main_control_loop(void *x) | |||
1861 | do_monitor_slots(&slots_state); | 1862 | do_monitor_slots(&slots_state); |
1862 | else | 1863 | else |
1863 | do_monitor_drives(&drives_state); | 1864 | do_monitor_drives(&drives_state); |
1864 | up(&driver_lock); | 1865 | mutex_unlock(&driver_lock); |
1865 | 1866 | ||
1866 | if (critical_state == 1) { | 1867 | if (critical_state == 1) { |
1867 | printk(KERN_WARNING "Temperature control detected a critical condition\n"); | 1868 | printk(KERN_WARNING "Temperature control detected a critical condition\n"); |
@@ -2019,13 +2020,13 @@ static void detach_fcu(void) | |||
2019 | */ | 2020 | */ |
2020 | static int therm_pm72_attach(struct i2c_adapter *adapter) | 2021 | static int therm_pm72_attach(struct i2c_adapter *adapter) |
2021 | { | 2022 | { |
2022 | down(&driver_lock); | 2023 | mutex_lock(&driver_lock); |
2023 | 2024 | ||
2024 | /* Check state */ | 2025 | /* Check state */ |
2025 | if (state == state_detached) | 2026 | if (state == state_detached) |
2026 | state = state_attaching; | 2027 | state = state_attaching; |
2027 | if (state != state_attaching) { | 2028 | if (state != state_attaching) { |
2028 | up(&driver_lock); | 2029 | mutex_unlock(&driver_lock); |
2029 | return 0; | 2030 | return 0; |
2030 | } | 2031 | } |
2031 | 2032 | ||
@@ -2054,7 +2055,7 @@ static int therm_pm72_attach(struct i2c_adapter *adapter) | |||
2054 | state = state_attached; | 2055 | state = state_attached; |
2055 | start_control_loops(); | 2056 | start_control_loops(); |
2056 | } | 2057 | } |
2057 | up(&driver_lock); | 2058 | mutex_unlock(&driver_lock); |
2058 | 2059 | ||
2059 | return 0; | 2060 | return 0; |
2060 | } | 2061 | } |
@@ -2065,16 +2066,16 @@ static int therm_pm72_attach(struct i2c_adapter *adapter) | |||
2065 | */ | 2066 | */ |
2066 | static int therm_pm72_detach(struct i2c_adapter *adapter) | 2067 | static int therm_pm72_detach(struct i2c_adapter *adapter) |
2067 | { | 2068 | { |
2068 | down(&driver_lock); | 2069 | mutex_lock(&driver_lock); |
2069 | 2070 | ||
2070 | if (state != state_detached) | 2071 | if (state != state_detached) |
2071 | state = state_detaching; | 2072 | state = state_detaching; |
2072 | 2073 | ||
2073 | /* Stop control loops if any */ | 2074 | /* Stop control loops if any */ |
2074 | DBG("stopping control loops\n"); | 2075 | DBG("stopping control loops\n"); |
2075 | up(&driver_lock); | 2076 | mutex_unlock(&driver_lock); |
2076 | stop_control_loops(); | 2077 | stop_control_loops(); |
2077 | down(&driver_lock); | 2078 | mutex_lock(&driver_lock); |
2078 | 2079 | ||
2079 | if (u3_0 != NULL && !strcmp(adapter->name, "u3 0")) { | 2080 | if (u3_0 != NULL && !strcmp(adapter->name, "u3 0")) { |
2080 | DBG("lost U3-0, disposing control loops\n"); | 2081 | DBG("lost U3-0, disposing control loops\n"); |
@@ -2090,7 +2091,7 @@ static int therm_pm72_detach(struct i2c_adapter *adapter) | |||
2090 | if (u3_0 == NULL && u3_1 == NULL) | 2091 | if (u3_0 == NULL && u3_1 == NULL) |
2091 | state = state_detached; | 2092 | state = state_detached; |
2092 | 2093 | ||
2093 | up(&driver_lock); | 2094 | mutex_unlock(&driver_lock); |
2094 | 2095 | ||
2095 | return 0; | 2096 | return 0; |
2096 | } | 2097 | } |
diff --git a/drivers/macintosh/windfarm_smu_sat.c b/drivers/macintosh/windfarm_smu_sat.c index 797918d0e59c..7f2be4baaeda 100644 --- a/drivers/macintosh/windfarm_smu_sat.c +++ b/drivers/macintosh/windfarm_smu_sat.c | |||
@@ -13,7 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/wait.h> | 14 | #include <linux/wait.h> |
15 | #include <linux/i2c.h> | 15 | #include <linux/i2c.h> |
16 | #include <linux/semaphore.h> | 16 | #include <linux/mutex.h> |
17 | #include <asm/prom.h> | 17 | #include <asm/prom.h> |
18 | #include <asm/smu.h> | 18 | #include <asm/smu.h> |
19 | #include <asm/pmac_low_i2c.h> | 19 | #include <asm/pmac_low_i2c.h> |
@@ -36,7 +36,7 @@ | |||
36 | struct wf_sat { | 36 | struct wf_sat { |
37 | int nr; | 37 | int nr; |
38 | atomic_t refcnt; | 38 | atomic_t refcnt; |
39 | struct semaphore mutex; | 39 | struct mutex mutex; |
40 | unsigned long last_read; /* jiffies when cache last updated */ | 40 | unsigned long last_read; /* jiffies when cache last updated */ |
41 | u8 cache[16]; | 41 | u8 cache[16]; |
42 | struct i2c_client i2c; | 42 | struct i2c_client i2c; |
@@ -163,7 +163,7 @@ static int wf_sat_get(struct wf_sensor *sr, s32 *value) | |||
163 | if (sat->i2c.adapter == NULL) | 163 | if (sat->i2c.adapter == NULL) |
164 | return -ENODEV; | 164 | return -ENODEV; |
165 | 165 | ||
166 | down(&sat->mutex); | 166 | mutex_lock(&sat->mutex); |
167 | if (time_after(jiffies, (sat->last_read + MAX_AGE))) { | 167 | if (time_after(jiffies, (sat->last_read + MAX_AGE))) { |
168 | err = wf_sat_read_cache(sat); | 168 | err = wf_sat_read_cache(sat); |
169 | if (err) | 169 | if (err) |
@@ -182,7 +182,7 @@ static int wf_sat_get(struct wf_sensor *sr, s32 *value) | |||
182 | err = 0; | 182 | err = 0; |
183 | 183 | ||
184 | fail: | 184 | fail: |
185 | up(&sat->mutex); | 185 | mutex_unlock(&sat->mutex); |
186 | return err; | 186 | return err; |
187 | } | 187 | } |
188 | 188 | ||
@@ -233,7 +233,7 @@ static void wf_sat_create(struct i2c_adapter *adapter, struct device_node *dev) | |||
233 | sat->nr = -1; | 233 | sat->nr = -1; |
234 | sat->node = of_node_get(dev); | 234 | sat->node = of_node_get(dev); |
235 | atomic_set(&sat->refcnt, 0); | 235 | atomic_set(&sat->refcnt, 0); |
236 | init_MUTEX(&sat->mutex); | 236 | mutex_init(&sat->mutex); |
237 | sat->i2c.addr = (addr >> 1) & 0x7f; | 237 | sat->i2c.addr = (addr >> 1) & 0x7f; |
238 | sat->i2c.adapter = adapter; | 238 | sat->i2c.adapter = adapter; |
239 | sat->i2c.driver = &wf_sat_driver; | 239 | sat->i2c.driver = &wf_sat_driver; |
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 0b8511776b3e..10748240cb2f 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -250,6 +250,7 @@ static int linear_run (mddev_t *mddev) | |||
250 | { | 250 | { |
251 | linear_conf_t *conf; | 251 | linear_conf_t *conf; |
252 | 252 | ||
253 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | ||
253 | conf = linear_conf(mddev, mddev->raid_disks); | 254 | conf = linear_conf(mddev, mddev->raid_disks); |
254 | 255 | ||
255 | if (!conf) | 256 | if (!conf) |
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 42ee1a2dc144..4f4d1f383842 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
@@ -417,6 +417,7 @@ static int multipath_run (mddev_t *mddev) | |||
417 | * bookkeeping area. [whatever we allocate in multipath_run(), | 417 | * bookkeeping area. [whatever we allocate in multipath_run(), |
418 | * should be freed in multipath_stop()] | 418 | * should be freed in multipath_stop()] |
419 | */ | 419 | */ |
420 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | ||
420 | 421 | ||
421 | conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL); | 422 | conf = kzalloc(sizeof(multipath_conf_t), GFP_KERNEL); |
422 | mddev->private = conf; | 423 | mddev->private = conf; |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index 818b48284096..914c04ddec7c 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
@@ -280,6 +280,7 @@ static int raid0_run (mddev_t *mddev) | |||
280 | (mddev->chunk_size>>1)-1); | 280 | (mddev->chunk_size>>1)-1); |
281 | blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9); | 281 | blk_queue_max_sectors(mddev->queue, mddev->chunk_size >> 9); |
282 | blk_queue_segment_boundary(mddev->queue, (mddev->chunk_size>>1) - 1); | 282 | blk_queue_segment_boundary(mddev->queue, (mddev->chunk_size>>1) - 1); |
283 | mddev->queue->queue_lock = &mddev->queue->__queue_lock; | ||
283 | 284 | ||
284 | conf = kmalloc(sizeof (raid0_conf_t), GFP_KERNEL); | 285 | conf = kmalloc(sizeof (raid0_conf_t), GFP_KERNEL); |
285 | if (!conf) | 286 | if (!conf) |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 6778b7cb39bd..ac409b7d83f5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
@@ -1935,6 +1935,9 @@ static int run(mddev_t *mddev) | |||
1935 | if (!conf->r1bio_pool) | 1935 | if (!conf->r1bio_pool) |
1936 | goto out_no_mem; | 1936 | goto out_no_mem; |
1937 | 1937 | ||
1938 | spin_lock_init(&conf->device_lock); | ||
1939 | mddev->queue->queue_lock = &conf->device_lock; | ||
1940 | |||
1938 | rdev_for_each(rdev, tmp, mddev) { | 1941 | rdev_for_each(rdev, tmp, mddev) { |
1939 | disk_idx = rdev->raid_disk; | 1942 | disk_idx = rdev->raid_disk; |
1940 | if (disk_idx >= mddev->raid_disks | 1943 | if (disk_idx >= mddev->raid_disks |
@@ -1958,7 +1961,6 @@ static int run(mddev_t *mddev) | |||
1958 | } | 1961 | } |
1959 | conf->raid_disks = mddev->raid_disks; | 1962 | conf->raid_disks = mddev->raid_disks; |
1960 | conf->mddev = mddev; | 1963 | conf->mddev = mddev; |
1961 | spin_lock_init(&conf->device_lock); | ||
1962 | INIT_LIST_HEAD(&conf->retry_list); | 1964 | INIT_LIST_HEAD(&conf->retry_list); |
1963 | 1965 | ||
1964 | spin_lock_init(&conf->resync_lock); | 1966 | spin_lock_init(&conf->resync_lock); |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 5938fa962922..8536ede1e712 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
@@ -886,7 +886,7 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
886 | */ | 886 | */ |
887 | raid10_find_phys(conf, r10_bio); | 887 | raid10_find_phys(conf, r10_bio); |
888 | retry_write: | 888 | retry_write: |
889 | blocked_rdev = 0; | 889 | blocked_rdev = NULL; |
890 | rcu_read_lock(); | 890 | rcu_read_lock(); |
891 | for (i = 0; i < conf->copies; i++) { | 891 | for (i = 0; i < conf->copies; i++) { |
892 | int d = r10_bio->devs[i].devnum; | 892 | int d = r10_bio->devs[i].devnum; |
@@ -2082,6 +2082,9 @@ static int run(mddev_t *mddev) | |||
2082 | goto out_free_conf; | 2082 | goto out_free_conf; |
2083 | } | 2083 | } |
2084 | 2084 | ||
2085 | spin_lock_init(&conf->device_lock); | ||
2086 | mddev->queue->queue_lock = &conf->device_lock; | ||
2087 | |||
2085 | rdev_for_each(rdev, tmp, mddev) { | 2088 | rdev_for_each(rdev, tmp, mddev) { |
2086 | disk_idx = rdev->raid_disk; | 2089 | disk_idx = rdev->raid_disk; |
2087 | if (disk_idx >= mddev->raid_disks | 2090 | if (disk_idx >= mddev->raid_disks |
@@ -2103,7 +2106,6 @@ static int run(mddev_t *mddev) | |||
2103 | 2106 | ||
2104 | disk->head_position = 0; | 2107 | disk->head_position = 0; |
2105 | } | 2108 | } |
2106 | spin_lock_init(&conf->device_lock); | ||
2107 | INIT_LIST_HEAD(&conf->retry_list); | 2109 | INIT_LIST_HEAD(&conf->retry_list); |
2108 | 2110 | ||
2109 | spin_lock_init(&conf->resync_lock); | 2111 | spin_lock_init(&conf->resync_lock); |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 087eee0cb809..93fde48c0f42 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -2369,8 +2369,8 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh, | |||
2369 | 2369 | ||
2370 | /* complete a check operation */ | 2370 | /* complete a check operation */ |
2371 | if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) { | 2371 | if (test_and_clear_bit(STRIPE_OP_CHECK, &sh->ops.complete)) { |
2372 | clear_bit(STRIPE_OP_CHECK, &sh->ops.ack); | 2372 | clear_bit(STRIPE_OP_CHECK, &sh->ops.ack); |
2373 | clear_bit(STRIPE_OP_CHECK, &sh->ops.pending); | 2373 | clear_bit(STRIPE_OP_CHECK, &sh->ops.pending); |
2374 | if (s->failed == 0) { | 2374 | if (s->failed == 0) { |
2375 | if (sh->ops.zero_sum_result == 0) | 2375 | if (sh->ops.zero_sum_result == 0) |
2376 | /* parity is correct (on disc, | 2376 | /* parity is correct (on disc, |
@@ -2400,16 +2400,6 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh, | |||
2400 | canceled_check = 1; /* STRIPE_INSYNC is not set */ | 2400 | canceled_check = 1; /* STRIPE_INSYNC is not set */ |
2401 | } | 2401 | } |
2402 | 2402 | ||
2403 | /* check if we can clear a parity disk reconstruct */ | ||
2404 | if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) && | ||
2405 | test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) { | ||
2406 | |||
2407 | clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending); | ||
2408 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); | ||
2409 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack); | ||
2410 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); | ||
2411 | } | ||
2412 | |||
2413 | /* start a new check operation if there are no failures, the stripe is | 2403 | /* start a new check operation if there are no failures, the stripe is |
2414 | * not insync, and a repair is not in flight | 2404 | * not insync, and a repair is not in flight |
2415 | */ | 2405 | */ |
@@ -2424,6 +2414,17 @@ static void handle_parity_checks5(raid5_conf_t *conf, struct stripe_head *sh, | |||
2424 | } | 2414 | } |
2425 | } | 2415 | } |
2426 | 2416 | ||
2417 | /* check if we can clear a parity disk reconstruct */ | ||
2418 | if (test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete) && | ||
2419 | test_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending)) { | ||
2420 | |||
2421 | clear_bit(STRIPE_OP_MOD_REPAIR_PD, &sh->ops.pending); | ||
2422 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.complete); | ||
2423 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.ack); | ||
2424 | clear_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending); | ||
2425 | } | ||
2426 | |||
2427 | |||
2427 | /* Wait for check parity and compute block operations to complete | 2428 | /* Wait for check parity and compute block operations to complete |
2428 | * before write-back. If a failure occurred while the check operation | 2429 | * before write-back. If a failure occurred while the check operation |
2429 | * was in flight we need to cycle this stripe through handle_stripe | 2430 | * was in flight we need to cycle this stripe through handle_stripe |
@@ -4256,6 +4257,7 @@ static int run(mddev_t *mddev) | |||
4256 | goto abort; | 4257 | goto abort; |
4257 | } | 4258 | } |
4258 | spin_lock_init(&conf->device_lock); | 4259 | spin_lock_init(&conf->device_lock); |
4260 | mddev->queue->queue_lock = &conf->device_lock; | ||
4259 | init_waitqueue_head(&conf->wait_for_stripe); | 4261 | init_waitqueue_head(&conf->wait_for_stripe); |
4260 | init_waitqueue_head(&conf->wait_for_overlap); | 4262 | init_waitqueue_head(&conf->wait_for_overlap); |
4261 | INIT_LIST_HEAD(&conf->handle_list); | 4263 | INIT_LIST_HEAD(&conf->handle_list); |
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index ddf57e135c6c..7a7803b5d497 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig | |||
@@ -89,8 +89,7 @@ config DVB_CORE | |||
89 | 89 | ||
90 | config VIDEO_MEDIA | 90 | config VIDEO_MEDIA |
91 | tristate | 91 | tristate |
92 | default DVB_CORE || VIDEO_DEV | 92 | default (DVB_CORE && (VIDEO_DEV = n)) || (VIDEO_DEV && (DVB_CORE = n)) || (DVB_CORE && VIDEO_DEV) |
93 | depends on DVB_CORE || VIDEO_DEV | ||
94 | 93 | ||
95 | comment "Multimedia drivers" | 94 | comment "Multimedia drivers" |
96 | 95 | ||
diff --git a/drivers/media/Makefile b/drivers/media/Makefile index 73f742c7e818..cc11c4c0e7e7 100644 --- a/drivers/media/Makefile +++ b/drivers/media/Makefile | |||
@@ -2,6 +2,8 @@ | |||
2 | # Makefile for the kernel multimedia device drivers. | 2 | # Makefile for the kernel multimedia device drivers. |
3 | # | 3 | # |
4 | 4 | ||
5 | obj-y := common/ | ||
6 | |||
5 | obj-$(CONFIG_VIDEO_MEDIA) += common/ | 7 | obj-$(CONFIG_VIDEO_MEDIA) += common/ |
6 | 8 | ||
7 | # Since hybrid devices are here, should be compiled if DVB and/or V4L | 9 | # Since hybrid devices are here, should be compiled if DVB and/or V4L |
diff --git a/drivers/media/common/tuners/Kconfig b/drivers/media/common/tuners/Kconfig index 5be85ff53e12..d6206540476b 100644 --- a/drivers/media/common/tuners/Kconfig +++ b/drivers/media/common/tuners/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config MEDIA_ATTACH | 1 | config MEDIA_ATTACH |
2 | bool "Load and attach frontend and tuner driver modules as needed" | 2 | bool "Load and attach frontend and tuner driver modules as needed" |
3 | depends on DVB_CORE | 3 | depends on VIDEO_MEDIA |
4 | depends on MODULES | 4 | depends on MODULES |
5 | help | 5 | help |
6 | Remove the static dependency of DVB card drivers on all | 6 | Remove the static dependency of DVB card drivers on all |
@@ -19,10 +19,10 @@ config MEDIA_ATTACH | |||
19 | 19 | ||
20 | config MEDIA_TUNER | 20 | config MEDIA_TUNER |
21 | tristate | 21 | tristate |
22 | default DVB_CORE || VIDEO_DEV | 22 | default VIDEO_MEDIA && I2C |
23 | depends on DVB_CORE || VIDEO_DEV | 23 | depends on VIDEO_MEDIA && I2C |
24 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMIZE | 24 | select MEDIA_TUNER_XC2028 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG |
25 | select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMIZE | 25 | select MEDIA_TUNER_XC5000 if !MEDIA_TUNER_CUSTOMIZE && HOTPLUG |
26 | select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMIZE | 26 | select MEDIA_TUNER_MT20XX if !MEDIA_TUNER_CUSTOMIZE |
27 | select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMIZE | 27 | select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMIZE |
28 | select MEDIA_TUNER_TEA5761 if !MEDIA_TUNER_CUSTOMIZE | 28 | select MEDIA_TUNER_TEA5761 if !MEDIA_TUNER_CUSTOMIZE |
@@ -46,7 +46,7 @@ if MEDIA_TUNER_CUSTOMIZE | |||
46 | 46 | ||
47 | config MEDIA_TUNER_SIMPLE | 47 | config MEDIA_TUNER_SIMPLE |
48 | tristate "Simple tuner support" | 48 | tristate "Simple tuner support" |
49 | depends on I2C | 49 | depends on VIDEO_MEDIA && I2C |
50 | select MEDIA_TUNER_TDA9887 | 50 | select MEDIA_TUNER_TDA9887 |
51 | default m if MEDIA_TUNER_CUSTOMIZE | 51 | default m if MEDIA_TUNER_CUSTOMIZE |
52 | help | 52 | help |
@@ -54,7 +54,7 @@ config MEDIA_TUNER_SIMPLE | |||
54 | 54 | ||
55 | config MEDIA_TUNER_TDA8290 | 55 | config MEDIA_TUNER_TDA8290 |
56 | tristate "TDA 8290/8295 + 8275(a)/18271 tuner combo" | 56 | tristate "TDA 8290/8295 + 8275(a)/18271 tuner combo" |
57 | depends on I2C | 57 | depends on VIDEO_MEDIA && I2C |
58 | select MEDIA_TUNER_TDA827X | 58 | select MEDIA_TUNER_TDA827X |
59 | select MEDIA_TUNER_TDA18271 | 59 | select MEDIA_TUNER_TDA18271 |
60 | default m if MEDIA_TUNER_CUSTOMIZE | 60 | default m if MEDIA_TUNER_CUSTOMIZE |
@@ -63,21 +63,21 @@ config MEDIA_TUNER_TDA8290 | |||
63 | 63 | ||
64 | config MEDIA_TUNER_TDA827X | 64 | config MEDIA_TUNER_TDA827X |
65 | tristate "Philips TDA827X silicon tuner" | 65 | tristate "Philips TDA827X silicon tuner" |
66 | depends on DVB_CORE && I2C | 66 | depends on VIDEO_MEDIA && I2C |
67 | default m if DVB_FE_CUSTOMISE | 67 | default m if DVB_FE_CUSTOMISE |
68 | help | 68 | help |
69 | A DVB-T silicon tuner module. Say Y when you want to support this tuner. | 69 | A DVB-T silicon tuner module. Say Y when you want to support this tuner. |
70 | 70 | ||
71 | config MEDIA_TUNER_TDA18271 | 71 | config MEDIA_TUNER_TDA18271 |
72 | tristate "NXP TDA18271 silicon tuner" | 72 | tristate "NXP TDA18271 silicon tuner" |
73 | depends on I2C | 73 | depends on VIDEO_MEDIA && I2C |
74 | default m if DVB_FE_CUSTOMISE | 74 | default m if DVB_FE_CUSTOMISE |
75 | help | 75 | help |
76 | A silicon tuner module. Say Y when you want to support this tuner. | 76 | A silicon tuner module. Say Y when you want to support this tuner. |
77 | 77 | ||
78 | config MEDIA_TUNER_TDA9887 | 78 | config MEDIA_TUNER_TDA9887 |
79 | tristate "TDA 9885/6/7 analog IF demodulator" | 79 | tristate "TDA 9885/6/7 analog IF demodulator" |
80 | depends on I2C | 80 | depends on VIDEO_MEDIA && I2C |
81 | default m if MEDIA_TUNER_CUSTOMIZE | 81 | default m if MEDIA_TUNER_CUSTOMIZE |
82 | help | 82 | help |
83 | Say Y here to include support for Philips TDA9885/6/7 | 83 | Say Y here to include support for Philips TDA9885/6/7 |
@@ -85,67 +85,79 @@ config MEDIA_TUNER_TDA9887 | |||
85 | 85 | ||
86 | config MEDIA_TUNER_TEA5761 | 86 | config MEDIA_TUNER_TEA5761 |
87 | tristate "TEA 5761 radio tuner (EXPERIMENTAL)" | 87 | tristate "TEA 5761 radio tuner (EXPERIMENTAL)" |
88 | depends on I2C && EXPERIMENTAL | 88 | depends on VIDEO_MEDIA && I2C |
89 | depends on EXPERIMENTAL | ||
89 | default m if MEDIA_TUNER_CUSTOMIZE | 90 | default m if MEDIA_TUNER_CUSTOMIZE |
90 | help | 91 | help |
91 | Say Y here to include support for the Philips TEA5761 radio tuner. | 92 | Say Y here to include support for the Philips TEA5761 radio tuner. |
92 | 93 | ||
93 | config MEDIA_TUNER_TEA5767 | 94 | config MEDIA_TUNER_TEA5767 |
94 | tristate "TEA 5767 radio tuner" | 95 | tristate "TEA 5767 radio tuner" |
95 | depends on I2C | 96 | depends on VIDEO_MEDIA && I2C |
96 | default m if MEDIA_TUNER_CUSTOMIZE | 97 | default m if MEDIA_TUNER_CUSTOMIZE |
97 | help | 98 | help |
98 | Say Y here to include support for the Philips TEA5767 radio tuner. | 99 | Say Y here to include support for the Philips TEA5767 radio tuner. |
99 | 100 | ||
100 | config MEDIA_TUNER_MT20XX | 101 | config MEDIA_TUNER_MT20XX |
101 | tristate "Microtune 2032 / 2050 tuners" | 102 | tristate "Microtune 2032 / 2050 tuners" |
102 | depends on I2C | 103 | depends on VIDEO_MEDIA && I2C |
103 | default m if MEDIA_TUNER_CUSTOMIZE | 104 | default m if MEDIA_TUNER_CUSTOMIZE |
104 | help | 105 | help |
105 | Say Y here to include support for the MT2032 / MT2050 tuner. | 106 | Say Y here to include support for the MT2032 / MT2050 tuner. |
106 | 107 | ||
107 | config MEDIA_TUNER_MT2060 | 108 | config MEDIA_TUNER_MT2060 |
108 | tristate "Microtune MT2060 silicon IF tuner" | 109 | tristate "Microtune MT2060 silicon IF tuner" |
109 | depends on I2C | 110 | depends on VIDEO_MEDIA && I2C |
110 | default m if DVB_FE_CUSTOMISE | 111 | default m if DVB_FE_CUSTOMISE |
111 | help | 112 | help |
112 | A driver for the silicon IF tuner MT2060 from Microtune. | 113 | A driver for the silicon IF tuner MT2060 from Microtune. |
113 | 114 | ||
114 | config MEDIA_TUNER_MT2266 | 115 | config MEDIA_TUNER_MT2266 |
115 | tristate "Microtune MT2266 silicon tuner" | 116 | tristate "Microtune MT2266 silicon tuner" |
116 | depends on I2C | 117 | depends on VIDEO_MEDIA && I2C |
117 | default m if DVB_FE_CUSTOMISE | 118 | default m if DVB_FE_CUSTOMISE |
118 | help | 119 | help |
119 | A driver for the silicon baseband tuner MT2266 from Microtune. | 120 | A driver for the silicon baseband tuner MT2266 from Microtune. |
120 | 121 | ||
121 | config MEDIA_TUNER_MT2131 | 122 | config MEDIA_TUNER_MT2131 |
122 | tristate "Microtune MT2131 silicon tuner" | 123 | tristate "Microtune MT2131 silicon tuner" |
123 | depends on I2C | 124 | depends on VIDEO_MEDIA && I2C |
124 | default m if DVB_FE_CUSTOMISE | 125 | default m if DVB_FE_CUSTOMISE |
125 | help | 126 | help |
126 | A driver for the silicon baseband tuner MT2131 from Microtune. | 127 | A driver for the silicon baseband tuner MT2131 from Microtune. |
127 | 128 | ||
128 | config MEDIA_TUNER_QT1010 | 129 | config MEDIA_TUNER_QT1010 |
129 | tristate "Quantek QT1010 silicon tuner" | 130 | tristate "Quantek QT1010 silicon tuner" |
130 | depends on DVB_CORE && I2C | 131 | depends on VIDEO_MEDIA && I2C |
131 | default m if DVB_FE_CUSTOMISE | 132 | default m if DVB_FE_CUSTOMISE |
132 | help | 133 | help |
133 | A driver for the silicon tuner QT1010 from Quantek. | 134 | A driver for the silicon tuner QT1010 from Quantek. |
134 | 135 | ||
135 | config MEDIA_TUNER_XC2028 | 136 | config MEDIA_TUNER_XC2028 |
136 | tristate "XCeive xc2028/xc3028 tuners" | 137 | tristate "XCeive xc2028/xc3028 tuners" |
137 | depends on I2C && FW_LOADER | 138 | depends on VIDEO_MEDIA && I2C |
139 | depends on HOTPLUG | ||
140 | select FW_LOADER | ||
138 | default m if MEDIA_TUNER_CUSTOMIZE | 141 | default m if MEDIA_TUNER_CUSTOMIZE |
139 | help | 142 | help |
140 | Say Y here to include support for the xc2028/xc3028 tuners. | 143 | Say Y here to include support for the xc2028/xc3028 tuners. |
141 | 144 | ||
142 | config MEDIA_TUNER_XC5000 | 145 | config MEDIA_TUNER_XC5000 |
143 | tristate "Xceive XC5000 silicon tuner" | 146 | tristate "Xceive XC5000 silicon tuner" |
144 | depends on I2C | 147 | depends on VIDEO_MEDIA && I2C |
148 | depends on HOTPLUG | ||
149 | select FW_LOADER | ||
145 | default m if DVB_FE_CUSTOMISE | 150 | default m if DVB_FE_CUSTOMISE |
146 | help | 151 | help |
147 | A driver for the silicon tuner XC5000 from Xceive. | 152 | A driver for the silicon tuner XC5000 from Xceive. |
148 | This device is only used inside a SiP called togther with a | 153 | This device is only used inside a SiP called togther with a |
149 | demodulator for now. | 154 | demodulator for now. |
150 | 155 | ||
156 | config MEDIA_TUNER_MXL5005S | ||
157 | tristate "MaxLinear MSL5005S silicon tuner" | ||
158 | depends on VIDEO_MEDIA && I2C | ||
159 | default m if DVB_FE_CUSTOMISE | ||
160 | help | ||
161 | A driver for the silicon tuner MXL5005S from MaxLinear. | ||
162 | |||
151 | endif # MEDIA_TUNER_CUSTOMIZE | 163 | endif # MEDIA_TUNER_CUSTOMIZE |
diff --git a/drivers/media/common/tuners/Makefile b/drivers/media/common/tuners/Makefile index 236d9932fd92..55f7e6706297 100644 --- a/drivers/media/common/tuners/Makefile +++ b/drivers/media/common/tuners/Makefile | |||
@@ -20,6 +20,7 @@ obj-$(CONFIG_MEDIA_TUNER_MT2060) += mt2060.o | |||
20 | obj-$(CONFIG_MEDIA_TUNER_MT2266) += mt2266.o | 20 | obj-$(CONFIG_MEDIA_TUNER_MT2266) += mt2266.o |
21 | obj-$(CONFIG_MEDIA_TUNER_QT1010) += qt1010.o | 21 | obj-$(CONFIG_MEDIA_TUNER_QT1010) += qt1010.o |
22 | obj-$(CONFIG_MEDIA_TUNER_MT2131) += mt2131.o | 22 | obj-$(CONFIG_MEDIA_TUNER_MT2131) += mt2131.o |
23 | obj-$(CONFIG_MEDIA_TUNER_MXL5005S) += mxl5005s.o | ||
23 | 24 | ||
24 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core | 25 | EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core |
25 | EXTRA_CFLAGS += -Idrivers/media/dvb/frontends | 26 | EXTRA_CFLAGS += -Idrivers/media/dvb/frontends |
diff --git a/drivers/media/common/tuners/mxl5005s.c b/drivers/media/common/tuners/mxl5005s.c new file mode 100644 index 000000000000..5d05b5390f66 --- /dev/null +++ b/drivers/media/common/tuners/mxl5005s.c | |||
@@ -0,0 +1,4110 @@ | |||
1 | /* | ||
2 | MaxLinear MXL5005S VSB/QAM/DVBT tuner driver | ||
3 | |||
4 | Copyright (C) 2008 MaxLinear | ||
5 | Copyright (C) 2006 Steven Toth <stoth@hauppauge.com> | ||
6 | Functions: | ||
7 | mxl5005s_reset() | ||
8 | mxl5005s_writereg() | ||
9 | mxl5005s_writeregs() | ||
10 | mxl5005s_init() | ||
11 | mxl5005s_reconfigure() | ||
12 | mxl5005s_AssignTunerMode() | ||
13 | mxl5005s_set_params() | ||
14 | mxl5005s_get_frequency() | ||
15 | mxl5005s_get_bandwidth() | ||
16 | mxl5005s_release() | ||
17 | mxl5005s_attach() | ||
18 | |||
19 | Copyright (C) 2008 Realtek | ||
20 | Copyright (C) 2008 Jan Hoogenraad | ||
21 | Functions: | ||
22 | mxl5005s_SetRfFreqHz() | ||
23 | |||
24 | This program is free software; you can redistribute it and/or modify | ||
25 | it under the terms of the GNU General Public License as published by | ||
26 | the Free Software Foundation; either version 2 of the License, or | ||
27 | (at your option) any later version. | ||
28 | |||
29 | This program is distributed in the hope that it will be useful, | ||
30 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
31 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
32 | GNU General Public License for more details. | ||
33 | |||
34 | You should have received a copy of the GNU General Public License | ||
35 | along with this program; if not, write to the Free Software | ||
36 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
37 | |||
38 | */ | ||
39 | |||
40 | /* | ||
41 | History of this driver (Steven Toth): | ||
42 | I was given a public release of a linux driver that included | ||
43 | support for the MaxLinear MXL5005S silicon tuner. Analysis of | ||
44 | the tuner driver showed clearly three things. | ||
45 | |||
46 | 1. The tuner driver didn't support the LinuxTV tuner API | ||
47 | so the code Realtek added had to be removed. | ||
48 | |||
49 | 2. A significant amount of the driver is reference driver code | ||
50 | from MaxLinear, I felt it was important to identify and | ||
51 | preserve this. | ||
52 | |||
53 | 3. New code has to be added to interface correctly with the | ||
54 | LinuxTV API, as a regular kernel module. | ||
55 | |||
56 | Other than the reference driver enum's, I've clearly marked | ||
57 | sections of the code and retained the copyright of the | ||
58 | respective owners. | ||
59 | */ | ||
60 | #include <linux/kernel.h> | ||
61 | #include <linux/init.h> | ||
62 | #include <linux/module.h> | ||
63 | #include <linux/string.h> | ||
64 | #include <linux/slab.h> | ||
65 | #include <linux/delay.h> | ||
66 | #include "dvb_frontend.h" | ||
67 | #include "mxl5005s.h" | ||
68 | |||
69 | static int debug; | ||
70 | |||
71 | #define dprintk(level, arg...) do { \ | ||
72 | if (level <= debug) \ | ||
73 | printk(arg); \ | ||
74 | } while (0) | ||
75 | |||
76 | #define TUNER_REGS_NUM 104 | ||
77 | #define INITCTRL_NUM 40 | ||
78 | |||
79 | #ifdef _MXL_PRODUCTION | ||
80 | #define CHCTRL_NUM 39 | ||
81 | #else | ||
82 | #define CHCTRL_NUM 36 | ||
83 | #endif | ||
84 | |||
85 | #define MXLCTRL_NUM 189 | ||
86 | #define MASTER_CONTROL_ADDR 9 | ||
87 | |||
88 | /* Enumeration of Master Control Register State */ | ||
89 | enum master_control_state { | ||
90 | MC_LOAD_START = 1, | ||
91 | MC_POWER_DOWN, | ||
92 | MC_SYNTH_RESET, | ||
93 | MC_SEQ_OFF | ||
94 | }; | ||
95 | |||
96 | /* Enumeration of MXL5005 Tuner Modulation Type */ | ||
97 | enum { | ||
98 | MXL_DEFAULT_MODULATION = 0, | ||
99 | MXL_DVBT, | ||
100 | MXL_ATSC, | ||
101 | MXL_QAM, | ||
102 | MXL_ANALOG_CABLE, | ||
103 | MXL_ANALOG_OTA | ||
104 | } tuner_modu_type; | ||
105 | |||
106 | /* MXL5005 Tuner Register Struct */ | ||
107 | struct TunerReg { | ||
108 | u16 Reg_Num; /* Tuner Register Address */ | ||
109 | u16 Reg_Val; /* Current sw programmed value waiting to be writen */ | ||
110 | }; | ||
111 | |||
112 | enum { | ||
113 | /* Initialization Control Names */ | ||
114 | DN_IQTN_AMP_CUT = 1, /* 1 */ | ||
115 | BB_MODE, /* 2 */ | ||
116 | BB_BUF, /* 3 */ | ||
117 | BB_BUF_OA, /* 4 */ | ||
118 | BB_ALPF_BANDSELECT, /* 5 */ | ||
119 | BB_IQSWAP, /* 6 */ | ||
120 | BB_DLPF_BANDSEL, /* 7 */ | ||
121 | RFSYN_CHP_GAIN, /* 8 */ | ||
122 | RFSYN_EN_CHP_HIGAIN, /* 9 */ | ||
123 | AGC_IF, /* 10 */ | ||
124 | AGC_RF, /* 11 */ | ||
125 | IF_DIVVAL, /* 12 */ | ||
126 | IF_VCO_BIAS, /* 13 */ | ||
127 | CHCAL_INT_MOD_IF, /* 14 */ | ||
128 | CHCAL_FRAC_MOD_IF, /* 15 */ | ||
129 | DRV_RES_SEL, /* 16 */ | ||
130 | I_DRIVER, /* 17 */ | ||
131 | EN_AAF, /* 18 */ | ||
132 | EN_3P, /* 19 */ | ||
133 | EN_AUX_3P, /* 20 */ | ||
134 | SEL_AAF_BAND, /* 21 */ | ||
135 | SEQ_ENCLK16_CLK_OUT, /* 22 */ | ||
136 | SEQ_SEL4_16B, /* 23 */ | ||
137 | XTAL_CAPSELECT, /* 24 */ | ||
138 | IF_SEL_DBL, /* 25 */ | ||
139 | RFSYN_R_DIV, /* 26 */ | ||
140 | SEQ_EXTSYNTHCALIF, /* 27 */ | ||
141 | SEQ_EXTDCCAL, /* 28 */ | ||
142 | AGC_EN_RSSI, /* 29 */ | ||
143 | RFA_ENCLKRFAGC, /* 30 */ | ||
144 | RFA_RSSI_REFH, /* 31 */ | ||
145 | RFA_RSSI_REF, /* 32 */ | ||
146 | RFA_RSSI_REFL, /* 33 */ | ||
147 | RFA_FLR, /* 34 */ | ||
148 | RFA_CEIL, /* 35 */ | ||
149 | SEQ_EXTIQFSMPULSE, /* 36 */ | ||
150 | OVERRIDE_1, /* 37 */ | ||
151 | BB_INITSTATE_DLPF_TUNE, /* 38 */ | ||
152 | TG_R_DIV, /* 39 */ | ||
153 | EN_CHP_LIN_B, /* 40 */ | ||
154 | |||
155 | /* Channel Change Control Names */ | ||
156 | DN_POLY = 51, /* 51 */ | ||
157 | DN_RFGAIN, /* 52 */ | ||
158 | DN_CAP_RFLPF, /* 53 */ | ||
159 | DN_EN_VHFUHFBAR, /* 54 */ | ||
160 | DN_GAIN_ADJUST, /* 55 */ | ||
161 | DN_IQTNBUF_AMP, /* 56 */ | ||
162 | DN_IQTNGNBFBIAS_BST, /* 57 */ | ||
163 | RFSYN_EN_OUTMUX, /* 58 */ | ||
164 | RFSYN_SEL_VCO_OUT, /* 59 */ | ||
165 | RFSYN_SEL_VCO_HI, /* 60 */ | ||
166 | RFSYN_SEL_DIVM, /* 61 */ | ||
167 | RFSYN_RF_DIV_BIAS, /* 62 */ | ||
168 | DN_SEL_FREQ, /* 63 */ | ||
169 | RFSYN_VCO_BIAS, /* 64 */ | ||
170 | CHCAL_INT_MOD_RF, /* 65 */ | ||
171 | CHCAL_FRAC_MOD_RF, /* 66 */ | ||
172 | RFSYN_LPF_R, /* 67 */ | ||
173 | CHCAL_EN_INT_RF, /* 68 */ | ||
174 | TG_LO_DIVVAL, /* 69 */ | ||
175 | TG_LO_SELVAL, /* 70 */ | ||
176 | TG_DIV_VAL, /* 71 */ | ||
177 | TG_VCO_BIAS, /* 72 */ | ||
178 | SEQ_EXTPOWERUP, /* 73 */ | ||
179 | OVERRIDE_2, /* 74 */ | ||
180 | OVERRIDE_3, /* 75 */ | ||
181 | OVERRIDE_4, /* 76 */ | ||
182 | SEQ_FSM_PULSE, /* 77 */ | ||
183 | GPIO_4B, /* 78 */ | ||
184 | GPIO_3B, /* 79 */ | ||
185 | GPIO_4, /* 80 */ | ||
186 | GPIO_3, /* 81 */ | ||
187 | GPIO_1B, /* 82 */ | ||
188 | DAC_A_ENABLE, /* 83 */ | ||
189 | DAC_B_ENABLE, /* 84 */ | ||
190 | DAC_DIN_A, /* 85 */ | ||
191 | DAC_DIN_B, /* 86 */ | ||
192 | #ifdef _MXL_PRODUCTION | ||
193 | RFSYN_EN_DIV, /* 87 */ | ||
194 | RFSYN_DIVM, /* 88 */ | ||
195 | DN_BYPASS_AGC_I2C /* 89 */ | ||
196 | #endif | ||
197 | } MXL5005_ControlName; | ||
198 | |||
199 | /* | ||
200 | * The following context is source code provided by MaxLinear. | ||
201 | * MaxLinear source code - Common_MXL.h (?) | ||
202 | */ | ||
203 | |||
204 | /* Constants */ | ||
205 | #define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104 | ||
206 | #define MXL5005S_LATCH_BYTE 0xfe | ||
207 | |||
208 | /* Register address, MSB, and LSB */ | ||
209 | #define MXL5005S_BB_IQSWAP_ADDR 59 | ||
210 | #define MXL5005S_BB_IQSWAP_MSB 0 | ||
211 | #define MXL5005S_BB_IQSWAP_LSB 0 | ||
212 | |||
213 | #define MXL5005S_BB_DLPF_BANDSEL_ADDR 53 | ||
214 | #define MXL5005S_BB_DLPF_BANDSEL_MSB 4 | ||
215 | #define MXL5005S_BB_DLPF_BANDSEL_LSB 3 | ||
216 | |||
217 | /* Standard modes */ | ||
218 | enum { | ||
219 | MXL5005S_STANDARD_DVBT, | ||
220 | MXL5005S_STANDARD_ATSC, | ||
221 | }; | ||
222 | #define MXL5005S_STANDARD_MODE_NUM 2 | ||
223 | |||
224 | /* Bandwidth modes */ | ||
225 | enum { | ||
226 | MXL5005S_BANDWIDTH_6MHZ = 6000000, | ||
227 | MXL5005S_BANDWIDTH_7MHZ = 7000000, | ||
228 | MXL5005S_BANDWIDTH_8MHZ = 8000000, | ||
229 | }; | ||
230 | #define MXL5005S_BANDWIDTH_MODE_NUM 3 | ||
231 | |||
232 | /* MXL5005 Tuner Control Struct */ | ||
233 | struct TunerControl { | ||
234 | u16 Ctrl_Num; /* Control Number */ | ||
235 | u16 size; /* Number of bits to represent Value */ | ||
236 | u16 addr[25]; /* Array of Tuner Register Address for each bit pos */ | ||
237 | u16 bit[25]; /* Array of bit pos in Reg Addr for each bit pos */ | ||
238 | u16 val[25]; /* Binary representation of Value */ | ||
239 | }; | ||
240 | |||
241 | /* MXL5005 Tuner Struct */ | ||
242 | struct mxl5005s_state { | ||
243 | u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */ | ||
244 | u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */ | ||
245 | u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */ | ||
246 | u32 IF_OUT; /* Desired IF Out Frequency */ | ||
247 | u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */ | ||
248 | u32 RF_IN; /* RF Input Frequency */ | ||
249 | u32 Fxtal; /* XTAL Frequency */ | ||
250 | u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */ | ||
251 | u16 TOP; /* Value: take over point */ | ||
252 | u8 CLOCK_OUT; /* 0: turn off clk out; 1: turn on clock out */ | ||
253 | u8 DIV_OUT; /* 4MHz or 16MHz */ | ||
254 | u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */ | ||
255 | u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */ | ||
256 | |||
257 | /* Modulation Type; */ | ||
258 | /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */ | ||
259 | u8 Mod_Type; | ||
260 | |||
261 | /* Tracking Filter Type */ | ||
262 | /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */ | ||
263 | u8 TF_Type; | ||
264 | |||
265 | /* Calculated Settings */ | ||
266 | u32 RF_LO; /* Synth RF LO Frequency */ | ||
267 | u32 IF_LO; /* Synth IF LO Frequency */ | ||
268 | u32 TG_LO; /* Synth TG_LO Frequency */ | ||
269 | |||
270 | /* Pointers to ControlName Arrays */ | ||
271 | u16 Init_Ctrl_Num; /* Number of INIT Control Names */ | ||
272 | struct TunerControl | ||
273 | Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */ | ||
274 | |||
275 | u16 CH_Ctrl_Num; /* Number of CH Control Names */ | ||
276 | struct TunerControl | ||
277 | CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */ | ||
278 | |||
279 | u16 MXL_Ctrl_Num; /* Number of MXL Control Names */ | ||
280 | struct TunerControl | ||
281 | MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */ | ||
282 | |||
283 | /* Pointer to Tuner Register Array */ | ||
284 | u16 TunerRegs_Num; /* Number of Tuner Registers */ | ||
285 | struct TunerReg | ||
286 | TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */ | ||
287 | |||
288 | /* Linux driver framework specific */ | ||
289 | struct mxl5005s_config *config; | ||
290 | struct dvb_frontend *frontend; | ||
291 | struct i2c_adapter *i2c; | ||
292 | |||
293 | /* Cache values */ | ||
294 | u32 current_mode; | ||
295 | |||
296 | }; | ||
297 | |||
298 | static u16 MXL_GetMasterControl(u8 *MasterReg, int state); | ||
299 | static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value); | ||
300 | static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value); | ||
301 | static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, | ||
302 | u8 bitVal); | ||
303 | static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, | ||
304 | u8 *RegVal, int *count); | ||
305 | static u32 MXL_Ceiling(u32 value, u32 resolution); | ||
306 | static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal); | ||
307 | static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, | ||
308 | u32 value, u16 controlGroup); | ||
309 | static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val); | ||
310 | static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum, | ||
311 | u8 *RegVal, int *count); | ||
312 | static u32 MXL_GetXtalInt(u32 Xtal_Freq); | ||
313 | static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq); | ||
314 | static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe); | ||
315 | static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe); | ||
316 | static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, | ||
317 | u8 *RegVal, int *count); | ||
318 | static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable, | ||
319 | u8 *datatable, u8 len); | ||
320 | static u16 MXL_IFSynthInit(struct dvb_frontend *fe); | ||
321 | static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type, | ||
322 | u32 bandwidth); | ||
323 | static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, | ||
324 | u32 bandwidth); | ||
325 | |||
326 | /* ---------------------------------------------------------------- | ||
327 | * Begin: Custom code salvaged from the Realtek driver. | ||
328 | * Copyright (C) 2008 Realtek | ||
329 | * Copyright (C) 2008 Jan Hoogenraad | ||
330 | * This code is placed under the terms of the GNU General Public License | ||
331 | * | ||
332 | * Released by Realtek under GPLv2. | ||
333 | * Thanks to Realtek for a lot of support we received ! | ||
334 | * | ||
335 | * Revision: 080314 - original version | ||
336 | */ | ||
337 | |||
338 | static int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz) | ||
339 | { | ||
340 | struct mxl5005s_state *state = fe->tuner_priv; | ||
341 | unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX]; | ||
342 | unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX]; | ||
343 | int TableLen; | ||
344 | |||
345 | u32 IfDivval = 0; | ||
346 | unsigned char MasterControlByte; | ||
347 | |||
348 | dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz); | ||
349 | |||
350 | /* Set MxL5005S tuner RF frequency according to example code. */ | ||
351 | |||
352 | /* Tuner RF frequency setting stage 0 */ | ||
353 | MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET); | ||
354 | AddrTable[0] = MASTER_CONTROL_ADDR; | ||
355 | ByteTable[0] |= state->config->AgcMasterByte; | ||
356 | |||
357 | mxl5005s_writeregs(fe, AddrTable, ByteTable, 1); | ||
358 | |||
359 | /* Tuner RF frequency setting stage 1 */ | ||
360 | MXL_TuneRF(fe, RfFreqHz); | ||
361 | |||
362 | MXL_ControlRead(fe, IF_DIVVAL, &IfDivval); | ||
363 | |||
364 | MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0); | ||
365 | MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1); | ||
366 | MXL_ControlWrite(fe, IF_DIVVAL, 8); | ||
367 | MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen); | ||
368 | |||
369 | MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START); | ||
370 | AddrTable[TableLen] = MASTER_CONTROL_ADDR ; | ||
371 | ByteTable[TableLen] = MasterControlByte | | ||
372 | state->config->AgcMasterByte; | ||
373 | TableLen += 1; | ||
374 | |||
375 | mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen); | ||
376 | |||
377 | /* Wait 30 ms. */ | ||
378 | msleep(150); | ||
379 | |||
380 | /* Tuner RF frequency setting stage 2 */ | ||
381 | MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1); | ||
382 | MXL_ControlWrite(fe, IF_DIVVAL, IfDivval); | ||
383 | MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen); | ||
384 | |||
385 | MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START); | ||
386 | AddrTable[TableLen] = MASTER_CONTROL_ADDR ; | ||
387 | ByteTable[TableLen] = MasterControlByte | | ||
388 | state->config->AgcMasterByte ; | ||
389 | TableLen += 1; | ||
390 | |||
391 | mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen); | ||
392 | |||
393 | msleep(100); | ||
394 | |||
395 | return 0; | ||
396 | } | ||
397 | /* End: Custom code taken from the Realtek driver */ | ||
398 | |||
399 | /* ---------------------------------------------------------------- | ||
400 | * Begin: Reference driver code found in the Realtek driver. | ||
401 | * Copyright (C) 2008 MaxLinear | ||
402 | */ | ||
403 | static u16 MXL5005_RegisterInit(struct dvb_frontend *fe) | ||
404 | { | ||
405 | struct mxl5005s_state *state = fe->tuner_priv; | ||
406 | state->TunerRegs_Num = TUNER_REGS_NUM ; | ||
407 | |||
408 | state->TunerRegs[0].Reg_Num = 9 ; | ||
409 | state->TunerRegs[0].Reg_Val = 0x40 ; | ||
410 | |||
411 | state->TunerRegs[1].Reg_Num = 11 ; | ||
412 | state->TunerRegs[1].Reg_Val = 0x19 ; | ||
413 | |||
414 | state->TunerRegs[2].Reg_Num = 12 ; | ||
415 | state->TunerRegs[2].Reg_Val = 0x60 ; | ||
416 | |||
417 | state->TunerRegs[3].Reg_Num = 13 ; | ||
418 | state->TunerRegs[3].Reg_Val = 0x00 ; | ||
419 | |||
420 | state->TunerRegs[4].Reg_Num = 14 ; | ||
421 | state->TunerRegs[4].Reg_Val = 0x00 ; | ||
422 | |||
423 | state->TunerRegs[5].Reg_Num = 15 ; | ||
424 | state->TunerRegs[5].Reg_Val = 0xC0 ; | ||
425 | |||
426 | state->TunerRegs[6].Reg_Num = 16 ; | ||
427 | state->TunerRegs[6].Reg_Val = 0x00 ; | ||
428 | |||
429 | state->TunerRegs[7].Reg_Num = 17 ; | ||
430 | state->TunerRegs[7].Reg_Val = 0x00 ; | ||
431 | |||
432 | state->TunerRegs[8].Reg_Num = 18 ; | ||
433 | state->TunerRegs[8].Reg_Val = 0x00 ; | ||
434 | |||
435 | state->TunerRegs[9].Reg_Num = 19 ; | ||
436 | state->TunerRegs[9].Reg_Val = 0x34 ; | ||
437 | |||
438 | state->TunerRegs[10].Reg_Num = 21 ; | ||
439 | state->TunerRegs[10].Reg_Val = 0x00 ; | ||
440 | |||
441 | state->TunerRegs[11].Reg_Num = 22 ; | ||
442 | state->TunerRegs[11].Reg_Val = 0x6B ; | ||
443 | |||
444 | state->TunerRegs[12].Reg_Num = 23 ; | ||
445 | state->TunerRegs[12].Reg_Val = 0x35 ; | ||
446 | |||
447 | state->TunerRegs[13].Reg_Num = 24 ; | ||
448 | state->TunerRegs[13].Reg_Val = 0x70 ; | ||
449 | |||
450 | state->TunerRegs[14].Reg_Num = 25 ; | ||
451 | state->TunerRegs[14].Reg_Val = 0x3E ; | ||
452 | |||
453 | state->TunerRegs[15].Reg_Num = 26 ; | ||
454 | state->TunerRegs[15].Reg_Val = 0x82 ; | ||
455 | |||
456 | state->TunerRegs[16].Reg_Num = 31 ; | ||
457 | state->TunerRegs[16].Reg_Val = 0x00 ; | ||
458 | |||
459 | state->TunerRegs[17].Reg_Num = 32 ; | ||
460 | state->TunerRegs[17].Reg_Val = 0x40 ; | ||
461 | |||
462 | state->TunerRegs[18].Reg_Num = 33 ; | ||
463 | state->TunerRegs[18].Reg_Val = 0x53 ; | ||
464 | |||
465 | state->TunerRegs[19].Reg_Num = 34 ; | ||
466 | state->TunerRegs[19].Reg_Val = 0x81 ; | ||
467 | |||
468 | state->TunerRegs[20].Reg_Num = 35 ; | ||
469 | state->TunerRegs[20].Reg_Val = 0xC9 ; | ||
470 | |||
471 | state->TunerRegs[21].Reg_Num = 36 ; | ||
472 | state->TunerRegs[21].Reg_Val = 0x01 ; | ||
473 | |||
474 | state->TunerRegs[22].Reg_Num = 37 ; | ||
475 | state->TunerRegs[22].Reg_Val = 0x00 ; | ||
476 | |||
477 | state->TunerRegs[23].Reg_Num = 41 ; | ||
478 | state->TunerRegs[23].Reg_Val = 0x00 ; | ||
479 | |||
480 | state->TunerRegs[24].Reg_Num = 42 ; | ||
481 | state->TunerRegs[24].Reg_Val = 0xF8 ; | ||
482 | |||
483 | state->TunerRegs[25].Reg_Num = 43 ; | ||
484 | state->TunerRegs[25].Reg_Val = 0x43 ; | ||
485 | |||
486 | state->TunerRegs[26].Reg_Num = 44 ; | ||
487 | state->TunerRegs[26].Reg_Val = 0x20 ; | ||
488 | |||
489 | state->TunerRegs[27].Reg_Num = 45 ; | ||
490 | state->TunerRegs[27].Reg_Val = 0x80 ; | ||
491 | |||
492 | state->TunerRegs[28].Reg_Num = 46 ; | ||
493 | state->TunerRegs[28].Reg_Val = 0x88 ; | ||
494 | |||
495 | state->TunerRegs[29].Reg_Num = 47 ; | ||
496 | state->TunerRegs[29].Reg_Val = 0x86 ; | ||
497 | |||
498 | state->TunerRegs[30].Reg_Num = 48 ; | ||
499 | state->TunerRegs[30].Reg_Val = 0x00 ; | ||
500 | |||
501 | state->TunerRegs[31].Reg_Num = 49 ; | ||
502 | state->TunerRegs[31].Reg_Val = 0x00 ; | ||
503 | |||
504 | state->TunerRegs[32].Reg_Num = 53 ; | ||
505 | state->TunerRegs[32].Reg_Val = 0x94 ; | ||
506 | |||
507 | state->TunerRegs[33].Reg_Num = 54 ; | ||
508 | state->TunerRegs[33].Reg_Val = 0xFA ; | ||
509 | |||
510 | state->TunerRegs[34].Reg_Num = 55 ; | ||
511 | state->TunerRegs[34].Reg_Val = 0x92 ; | ||
512 | |||
513 | state->TunerRegs[35].Reg_Num = 56 ; | ||
514 | state->TunerRegs[35].Reg_Val = 0x80 ; | ||
515 | |||
516 | state->TunerRegs[36].Reg_Num = 57 ; | ||
517 | state->TunerRegs[36].Reg_Val = 0x41 ; | ||
518 | |||
519 | state->TunerRegs[37].Reg_Num = 58 ; | ||
520 | state->TunerRegs[37].Reg_Val = 0xDB ; | ||
521 | |||
522 | state->TunerRegs[38].Reg_Num = 59 ; | ||
523 | state->TunerRegs[38].Reg_Val = 0x00 ; | ||
524 | |||
525 | state->TunerRegs[39].Reg_Num = 60 ; | ||
526 | state->TunerRegs[39].Reg_Val = 0x00 ; | ||
527 | |||
528 | state->TunerRegs[40].Reg_Num = 61 ; | ||
529 | state->TunerRegs[40].Reg_Val = 0x00 ; | ||
530 | |||
531 | state->TunerRegs[41].Reg_Num = 62 ; | ||
532 | state->TunerRegs[41].Reg_Val = 0x00 ; | ||
533 | |||
534 | state->TunerRegs[42].Reg_Num = 65 ; | ||
535 | state->TunerRegs[42].Reg_Val = 0xF8 ; | ||
536 | |||
537 | state->TunerRegs[43].Reg_Num = 66 ; | ||
538 | state->TunerRegs[43].Reg_Val = 0xE4 ; | ||
539 | |||
540 | state->TunerRegs[44].Reg_Num = 67 ; | ||
541 | state->TunerRegs[44].Reg_Val = 0x90 ; | ||
542 | |||
543 | state->TunerRegs[45].Reg_Num = 68 ; | ||
544 | state->TunerRegs[45].Reg_Val = 0xC0 ; | ||
545 | |||
546 | state->TunerRegs[46].Reg_Num = 69 ; | ||
547 | state->TunerRegs[46].Reg_Val = 0x01 ; | ||
548 | |||
549 | state->TunerRegs[47].Reg_Num = 70 ; | ||
550 | state->TunerRegs[47].Reg_Val = 0x50 ; | ||
551 | |||
552 | state->TunerRegs[48].Reg_Num = 71 ; | ||
553 | state->TunerRegs[48].Reg_Val = 0x06 ; | ||
554 | |||
555 | state->TunerRegs[49].Reg_Num = 72 ; | ||
556 | state->TunerRegs[49].Reg_Val = 0x00 ; | ||
557 | |||
558 | state->TunerRegs[50].Reg_Num = 73 ; | ||
559 | state->TunerRegs[50].Reg_Val = 0x20 ; | ||
560 | |||
561 | state->TunerRegs[51].Reg_Num = 76 ; | ||
562 | state->TunerRegs[51].Reg_Val = 0xBB ; | ||
563 | |||
564 | state->TunerRegs[52].Reg_Num = 77 ; | ||
565 | state->TunerRegs[52].Reg_Val = 0x13 ; | ||
566 | |||
567 | state->TunerRegs[53].Reg_Num = 81 ; | ||
568 | state->TunerRegs[53].Reg_Val = 0x04 ; | ||
569 | |||
570 | state->TunerRegs[54].Reg_Num = 82 ; | ||
571 | state->TunerRegs[54].Reg_Val = 0x75 ; | ||
572 | |||
573 | state->TunerRegs[55].Reg_Num = 83 ; | ||
574 | state->TunerRegs[55].Reg_Val = 0x00 ; | ||
575 | |||
576 | state->TunerRegs[56].Reg_Num = 84 ; | ||
577 | state->TunerRegs[56].Reg_Val = 0x00 ; | ||
578 | |||
579 | state->TunerRegs[57].Reg_Num = 85 ; | ||
580 | state->TunerRegs[57].Reg_Val = 0x00 ; | ||
581 | |||
582 | state->TunerRegs[58].Reg_Num = 91 ; | ||
583 | state->TunerRegs[58].Reg_Val = 0x70 ; | ||
584 | |||
585 | state->TunerRegs[59].Reg_Num = 92 ; | ||
586 | state->TunerRegs[59].Reg_Val = 0x00 ; | ||
587 | |||
588 | state->TunerRegs[60].Reg_Num = 93 ; | ||
589 | state->TunerRegs[60].Reg_Val = 0x00 ; | ||
590 | |||
591 | state->TunerRegs[61].Reg_Num = 94 ; | ||
592 | state->TunerRegs[61].Reg_Val = 0x00 ; | ||
593 | |||
594 | state->TunerRegs[62].Reg_Num = 95 ; | ||
595 | state->TunerRegs[62].Reg_Val = 0x0C ; | ||
596 | |||
597 | state->TunerRegs[63].Reg_Num = 96 ; | ||
598 | state->TunerRegs[63].Reg_Val = 0x00 ; | ||
599 | |||
600 | state->TunerRegs[64].Reg_Num = 97 ; | ||
601 | state->TunerRegs[64].Reg_Val = 0x00 ; | ||
602 | |||
603 | state->TunerRegs[65].Reg_Num = 98 ; | ||
604 | state->TunerRegs[65].Reg_Val = 0xE2 ; | ||
605 | |||
606 | state->TunerRegs[66].Reg_Num = 99 ; | ||
607 | state->TunerRegs[66].Reg_Val = 0x00 ; | ||
608 | |||
609 | state->TunerRegs[67].Reg_Num = 100 ; | ||
610 | state->TunerRegs[67].Reg_Val = 0x00 ; | ||
611 | |||
612 | state->TunerRegs[68].Reg_Num = 101 ; | ||
613 | state->TunerRegs[68].Reg_Val = 0x12 ; | ||
614 | |||
615 | state->TunerRegs[69].Reg_Num = 102 ; | ||
616 | state->TunerRegs[69].Reg_Val = 0x80 ; | ||
617 | |||
618 | state->TunerRegs[70].Reg_Num = 103 ; | ||
619 | state->TunerRegs[70].Reg_Val = 0x32 ; | ||
620 | |||
621 | state->TunerRegs[71].Reg_Num = 104 ; | ||
622 | state->TunerRegs[71].Reg_Val = 0xB4 ; | ||
623 | |||
624 | state->TunerRegs[72].Reg_Num = 105 ; | ||
625 | state->TunerRegs[72].Reg_Val = 0x60 ; | ||
626 | |||
627 | state->TunerRegs[73].Reg_Num = 106 ; | ||
628 | state->TunerRegs[73].Reg_Val = 0x83 ; | ||
629 | |||
630 | state->TunerRegs[74].Reg_Num = 107 ; | ||
631 | state->TunerRegs[74].Reg_Val = 0x84 ; | ||
632 | |||
633 | state->TunerRegs[75].Reg_Num = 108 ; | ||
634 | state->TunerRegs[75].Reg_Val = 0x9C ; | ||
635 | |||
636 | state->TunerRegs[76].Reg_Num = 109 ; | ||
637 | state->TunerRegs[76].Reg_Val = 0x02 ; | ||
638 | |||
639 | state->TunerRegs[77].Reg_Num = 110 ; | ||
640 | state->TunerRegs[77].Reg_Val = 0x81 ; | ||
641 | |||
642 | state->TunerRegs[78].Reg_Num = 111 ; | ||
643 | state->TunerRegs[78].Reg_Val = 0xC0 ; | ||
644 | |||
645 | state->TunerRegs[79].Reg_Num = 112 ; | ||
646 | state->TunerRegs[79].Reg_Val = 0x10 ; | ||
647 | |||
648 | state->TunerRegs[80].Reg_Num = 131 ; | ||
649 | state->TunerRegs[80].Reg_Val = 0x8A ; | ||
650 | |||
651 | state->TunerRegs[81].Reg_Num = 132 ; | ||
652 | state->TunerRegs[81].Reg_Val = 0x10 ; | ||
653 | |||
654 | state->TunerRegs[82].Reg_Num = 133 ; | ||
655 | state->TunerRegs[82].Reg_Val = 0x24 ; | ||
656 | |||
657 | state->TunerRegs[83].Reg_Num = 134 ; | ||
658 | state->TunerRegs[83].Reg_Val = 0x00 ; | ||
659 | |||
660 | state->TunerRegs[84].Reg_Num = 135 ; | ||
661 | state->TunerRegs[84].Reg_Val = 0x00 ; | ||
662 | |||
663 | state->TunerRegs[85].Reg_Num = 136 ; | ||
664 | state->TunerRegs[85].Reg_Val = 0x7E ; | ||
665 | |||
666 | state->TunerRegs[86].Reg_Num = 137 ; | ||
667 | state->TunerRegs[86].Reg_Val = 0x40 ; | ||
668 | |||
669 | state->TunerRegs[87].Reg_Num = 138 ; | ||
670 | state->TunerRegs[87].Reg_Val = 0x38 ; | ||
671 | |||
672 | state->TunerRegs[88].Reg_Num = 146 ; | ||
673 | state->TunerRegs[88].Reg_Val = 0xF6 ; | ||
674 | |||
675 | state->TunerRegs[89].Reg_Num = 147 ; | ||
676 | state->TunerRegs[89].Reg_Val = 0x1A ; | ||
677 | |||
678 | state->TunerRegs[90].Reg_Num = 148 ; | ||
679 | state->TunerRegs[90].Reg_Val = 0x62 ; | ||
680 | |||
681 | state->TunerRegs[91].Reg_Num = 149 ; | ||
682 | state->TunerRegs[91].Reg_Val = 0x33 ; | ||
683 | |||
684 | state->TunerRegs[92].Reg_Num = 150 ; | ||
685 | state->TunerRegs[92].Reg_Val = 0x80 ; | ||
686 | |||
687 | state->TunerRegs[93].Reg_Num = 156 ; | ||
688 | state->TunerRegs[93].Reg_Val = 0x56 ; | ||
689 | |||
690 | state->TunerRegs[94].Reg_Num = 157 ; | ||
691 | state->TunerRegs[94].Reg_Val = 0x17 ; | ||
692 | |||
693 | state->TunerRegs[95].Reg_Num = 158 ; | ||
694 | state->TunerRegs[95].Reg_Val = 0xA9 ; | ||
695 | |||
696 | state->TunerRegs[96].Reg_Num = 159 ; | ||
697 | state->TunerRegs[96].Reg_Val = 0x00 ; | ||
698 | |||
699 | state->TunerRegs[97].Reg_Num = 160 ; | ||
700 | state->TunerRegs[97].Reg_Val = 0x00 ; | ||
701 | |||
702 | state->TunerRegs[98].Reg_Num = 161 ; | ||
703 | state->TunerRegs[98].Reg_Val = 0x00 ; | ||
704 | |||
705 | state->TunerRegs[99].Reg_Num = 162 ; | ||
706 | state->TunerRegs[99].Reg_Val = 0x40 ; | ||
707 | |||
708 | state->TunerRegs[100].Reg_Num = 166 ; | ||
709 | state->TunerRegs[100].Reg_Val = 0xAE ; | ||
710 | |||
711 | state->TunerRegs[101].Reg_Num = 167 ; | ||
712 | state->TunerRegs[101].Reg_Val = 0x1B ; | ||
713 | |||
714 | state->TunerRegs[102].Reg_Num = 168 ; | ||
715 | state->TunerRegs[102].Reg_Val = 0xF2 ; | ||
716 | |||
717 | state->TunerRegs[103].Reg_Num = 195 ; | ||
718 | state->TunerRegs[103].Reg_Val = 0x00 ; | ||
719 | |||
720 | return 0 ; | ||
721 | } | ||
722 | |||
723 | static u16 MXL5005_ControlInit(struct dvb_frontend *fe) | ||
724 | { | ||
725 | struct mxl5005s_state *state = fe->tuner_priv; | ||
726 | state->Init_Ctrl_Num = INITCTRL_NUM; | ||
727 | |||
728 | state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ; | ||
729 | state->Init_Ctrl[0].size = 1 ; | ||
730 | state->Init_Ctrl[0].addr[0] = 73; | ||
731 | state->Init_Ctrl[0].bit[0] = 7; | ||
732 | state->Init_Ctrl[0].val[0] = 0; | ||
733 | |||
734 | state->Init_Ctrl[1].Ctrl_Num = BB_MODE ; | ||
735 | state->Init_Ctrl[1].size = 1 ; | ||
736 | state->Init_Ctrl[1].addr[0] = 53; | ||
737 | state->Init_Ctrl[1].bit[0] = 2; | ||
738 | state->Init_Ctrl[1].val[0] = 1; | ||
739 | |||
740 | state->Init_Ctrl[2].Ctrl_Num = BB_BUF ; | ||
741 | state->Init_Ctrl[2].size = 2 ; | ||
742 | state->Init_Ctrl[2].addr[0] = 53; | ||
743 | state->Init_Ctrl[2].bit[0] = 1; | ||
744 | state->Init_Ctrl[2].val[0] = 0; | ||
745 | state->Init_Ctrl[2].addr[1] = 57; | ||
746 | state->Init_Ctrl[2].bit[1] = 0; | ||
747 | state->Init_Ctrl[2].val[1] = 1; | ||
748 | |||
749 | state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ; | ||
750 | state->Init_Ctrl[3].size = 1 ; | ||
751 | state->Init_Ctrl[3].addr[0] = 53; | ||
752 | state->Init_Ctrl[3].bit[0] = 0; | ||
753 | state->Init_Ctrl[3].val[0] = 0; | ||
754 | |||
755 | state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ; | ||
756 | state->Init_Ctrl[4].size = 3 ; | ||
757 | state->Init_Ctrl[4].addr[0] = 53; | ||
758 | state->Init_Ctrl[4].bit[0] = 5; | ||
759 | state->Init_Ctrl[4].val[0] = 0; | ||
760 | state->Init_Ctrl[4].addr[1] = 53; | ||
761 | state->Init_Ctrl[4].bit[1] = 6; | ||
762 | state->Init_Ctrl[4].val[1] = 0; | ||
763 | state->Init_Ctrl[4].addr[2] = 53; | ||
764 | state->Init_Ctrl[4].bit[2] = 7; | ||
765 | state->Init_Ctrl[4].val[2] = 1; | ||
766 | |||
767 | state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ; | ||
768 | state->Init_Ctrl[5].size = 1 ; | ||
769 | state->Init_Ctrl[5].addr[0] = 59; | ||
770 | state->Init_Ctrl[5].bit[0] = 0; | ||
771 | state->Init_Ctrl[5].val[0] = 0; | ||
772 | |||
773 | state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ; | ||
774 | state->Init_Ctrl[6].size = 2 ; | ||
775 | state->Init_Ctrl[6].addr[0] = 53; | ||
776 | state->Init_Ctrl[6].bit[0] = 3; | ||
777 | state->Init_Ctrl[6].val[0] = 0; | ||
778 | state->Init_Ctrl[6].addr[1] = 53; | ||
779 | state->Init_Ctrl[6].bit[1] = 4; | ||
780 | state->Init_Ctrl[6].val[1] = 1; | ||
781 | |||
782 | state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ; | ||
783 | state->Init_Ctrl[7].size = 4 ; | ||
784 | state->Init_Ctrl[7].addr[0] = 22; | ||
785 | state->Init_Ctrl[7].bit[0] = 4; | ||
786 | state->Init_Ctrl[7].val[0] = 0; | ||
787 | state->Init_Ctrl[7].addr[1] = 22; | ||
788 | state->Init_Ctrl[7].bit[1] = 5; | ||
789 | state->Init_Ctrl[7].val[1] = 1; | ||
790 | state->Init_Ctrl[7].addr[2] = 22; | ||
791 | state->Init_Ctrl[7].bit[2] = 6; | ||
792 | state->Init_Ctrl[7].val[2] = 1; | ||
793 | state->Init_Ctrl[7].addr[3] = 22; | ||
794 | state->Init_Ctrl[7].bit[3] = 7; | ||
795 | state->Init_Ctrl[7].val[3] = 0; | ||
796 | |||
797 | state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ; | ||
798 | state->Init_Ctrl[8].size = 1 ; | ||
799 | state->Init_Ctrl[8].addr[0] = 22; | ||
800 | state->Init_Ctrl[8].bit[0] = 2; | ||
801 | state->Init_Ctrl[8].val[0] = 0; | ||
802 | |||
803 | state->Init_Ctrl[9].Ctrl_Num = AGC_IF ; | ||
804 | state->Init_Ctrl[9].size = 4 ; | ||
805 | state->Init_Ctrl[9].addr[0] = 76; | ||
806 | state->Init_Ctrl[9].bit[0] = 0; | ||
807 | state->Init_Ctrl[9].val[0] = 1; | ||
808 | state->Init_Ctrl[9].addr[1] = 76; | ||
809 | state->Init_Ctrl[9].bit[1] = 1; | ||
810 | state->Init_Ctrl[9].val[1] = 1; | ||
811 | state->Init_Ctrl[9].addr[2] = 76; | ||
812 | state->Init_Ctrl[9].bit[2] = 2; | ||
813 | state->Init_Ctrl[9].val[2] = 0; | ||
814 | state->Init_Ctrl[9].addr[3] = 76; | ||
815 | state->Init_Ctrl[9].bit[3] = 3; | ||
816 | state->Init_Ctrl[9].val[3] = 1; | ||
817 | |||
818 | state->Init_Ctrl[10].Ctrl_Num = AGC_RF ; | ||
819 | state->Init_Ctrl[10].size = 4 ; | ||
820 | state->Init_Ctrl[10].addr[0] = 76; | ||
821 | state->Init_Ctrl[10].bit[0] = 4; | ||
822 | state->Init_Ctrl[10].val[0] = 1; | ||
823 | state->Init_Ctrl[10].addr[1] = 76; | ||
824 | state->Init_Ctrl[10].bit[1] = 5; | ||
825 | state->Init_Ctrl[10].val[1] = 1; | ||
826 | state->Init_Ctrl[10].addr[2] = 76; | ||
827 | state->Init_Ctrl[10].bit[2] = 6; | ||
828 | state->Init_Ctrl[10].val[2] = 0; | ||
829 | state->Init_Ctrl[10].addr[3] = 76; | ||
830 | state->Init_Ctrl[10].bit[3] = 7; | ||
831 | state->Init_Ctrl[10].val[3] = 1; | ||
832 | |||
833 | state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ; | ||
834 | state->Init_Ctrl[11].size = 5 ; | ||
835 | state->Init_Ctrl[11].addr[0] = 43; | ||
836 | state->Init_Ctrl[11].bit[0] = 3; | ||
837 | state->Init_Ctrl[11].val[0] = 0; | ||
838 | state->Init_Ctrl[11].addr[1] = 43; | ||
839 | state->Init_Ctrl[11].bit[1] = 4; | ||
840 | state->Init_Ctrl[11].val[1] = 0; | ||
841 | state->Init_Ctrl[11].addr[2] = 43; | ||
842 | state->Init_Ctrl[11].bit[2] = 5; | ||
843 | state->Init_Ctrl[11].val[2] = 0; | ||
844 | state->Init_Ctrl[11].addr[3] = 43; | ||
845 | state->Init_Ctrl[11].bit[3] = 6; | ||
846 | state->Init_Ctrl[11].val[3] = 1; | ||
847 | state->Init_Ctrl[11].addr[4] = 43; | ||
848 | state->Init_Ctrl[11].bit[4] = 7; | ||
849 | state->Init_Ctrl[11].val[4] = 0; | ||
850 | |||
851 | state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ; | ||
852 | state->Init_Ctrl[12].size = 6 ; | ||
853 | state->Init_Ctrl[12].addr[0] = 44; | ||
854 | state->Init_Ctrl[12].bit[0] = 2; | ||
855 | state->Init_Ctrl[12].val[0] = 0; | ||
856 | state->Init_Ctrl[12].addr[1] = 44; | ||
857 | state->Init_Ctrl[12].bit[1] = 3; | ||
858 | state->Init_Ctrl[12].val[1] = 0; | ||
859 | state->Init_Ctrl[12].addr[2] = 44; | ||
860 | state->Init_Ctrl[12].bit[2] = 4; | ||
861 | state->Init_Ctrl[12].val[2] = 0; | ||
862 | state->Init_Ctrl[12].addr[3] = 44; | ||
863 | state->Init_Ctrl[12].bit[3] = 5; | ||
864 | state->Init_Ctrl[12].val[3] = 1; | ||
865 | state->Init_Ctrl[12].addr[4] = 44; | ||
866 | state->Init_Ctrl[12].bit[4] = 6; | ||
867 | state->Init_Ctrl[12].val[4] = 0; | ||
868 | state->Init_Ctrl[12].addr[5] = 44; | ||
869 | state->Init_Ctrl[12].bit[5] = 7; | ||
870 | state->Init_Ctrl[12].val[5] = 0; | ||
871 | |||
872 | state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ; | ||
873 | state->Init_Ctrl[13].size = 7 ; | ||
874 | state->Init_Ctrl[13].addr[0] = 11; | ||
875 | state->Init_Ctrl[13].bit[0] = 0; | ||
876 | state->Init_Ctrl[13].val[0] = 1; | ||
877 | state->Init_Ctrl[13].addr[1] = 11; | ||
878 | state->Init_Ctrl[13].bit[1] = 1; | ||
879 | state->Init_Ctrl[13].val[1] = 0; | ||
880 | state->Init_Ctrl[13].addr[2] = 11; | ||
881 | state->Init_Ctrl[13].bit[2] = 2; | ||
882 | state->Init_Ctrl[13].val[2] = 0; | ||
883 | state->Init_Ctrl[13].addr[3] = 11; | ||
884 | state->Init_Ctrl[13].bit[3] = 3; | ||
885 | state->Init_Ctrl[13].val[3] = 1; | ||
886 | state->Init_Ctrl[13].addr[4] = 11; | ||
887 | state->Init_Ctrl[13].bit[4] = 4; | ||
888 | state->Init_Ctrl[13].val[4] = 1; | ||
889 | state->Init_Ctrl[13].addr[5] = 11; | ||
890 | state->Init_Ctrl[13].bit[5] = 5; | ||
891 | state->Init_Ctrl[13].val[5] = 0; | ||
892 | state->Init_Ctrl[13].addr[6] = 11; | ||
893 | state->Init_Ctrl[13].bit[6] = 6; | ||
894 | state->Init_Ctrl[13].val[6] = 0; | ||
895 | |||
896 | state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ; | ||
897 | state->Init_Ctrl[14].size = 16 ; | ||
898 | state->Init_Ctrl[14].addr[0] = 13; | ||
899 | state->Init_Ctrl[14].bit[0] = 0; | ||
900 | state->Init_Ctrl[14].val[0] = 0; | ||
901 | state->Init_Ctrl[14].addr[1] = 13; | ||
902 | state->Init_Ctrl[14].bit[1] = 1; | ||
903 | state->Init_Ctrl[14].val[1] = 0; | ||
904 | state->Init_Ctrl[14].addr[2] = 13; | ||
905 | state->Init_Ctrl[14].bit[2] = 2; | ||
906 | state->Init_Ctrl[14].val[2] = 0; | ||
907 | state->Init_Ctrl[14].addr[3] = 13; | ||
908 | state->Init_Ctrl[14].bit[3] = 3; | ||
909 | state->Init_Ctrl[14].val[3] = 0; | ||
910 | state->Init_Ctrl[14].addr[4] = 13; | ||
911 | state->Init_Ctrl[14].bit[4] = 4; | ||
912 | state->Init_Ctrl[14].val[4] = 0; | ||
913 | state->Init_Ctrl[14].addr[5] = 13; | ||
914 | state->Init_Ctrl[14].bit[5] = 5; | ||
915 | state->Init_Ctrl[14].val[5] = 0; | ||
916 | state->Init_Ctrl[14].addr[6] = 13; | ||
917 | state->Init_Ctrl[14].bit[6] = 6; | ||
918 | state->Init_Ctrl[14].val[6] = 0; | ||
919 | state->Init_Ctrl[14].addr[7] = 13; | ||
920 | state->Init_Ctrl[14].bit[7] = 7; | ||
921 | state->Init_Ctrl[14].val[7] = 0; | ||
922 | state->Init_Ctrl[14].addr[8] = 12; | ||
923 | state->Init_Ctrl[14].bit[8] = 0; | ||
924 | state->Init_Ctrl[14].val[8] = 0; | ||
925 | state->Init_Ctrl[14].addr[9] = 12; | ||
926 | state->Init_Ctrl[14].bit[9] = 1; | ||
927 | state->Init_Ctrl[14].val[9] = 0; | ||
928 | state->Init_Ctrl[14].addr[10] = 12; | ||
929 | state->Init_Ctrl[14].bit[10] = 2; | ||
930 | state->Init_Ctrl[14].val[10] = 0; | ||
931 | state->Init_Ctrl[14].addr[11] = 12; | ||
932 | state->Init_Ctrl[14].bit[11] = 3; | ||
933 | state->Init_Ctrl[14].val[11] = 0; | ||
934 | state->Init_Ctrl[14].addr[12] = 12; | ||
935 | state->Init_Ctrl[14].bit[12] = 4; | ||
936 | state->Init_Ctrl[14].val[12] = 0; | ||
937 | state->Init_Ctrl[14].addr[13] = 12; | ||
938 | state->Init_Ctrl[14].bit[13] = 5; | ||
939 | state->Init_Ctrl[14].val[13] = 1; | ||
940 | state->Init_Ctrl[14].addr[14] = 12; | ||
941 | state->Init_Ctrl[14].bit[14] = 6; | ||
942 | state->Init_Ctrl[14].val[14] = 1; | ||
943 | state->Init_Ctrl[14].addr[15] = 12; | ||
944 | state->Init_Ctrl[14].bit[15] = 7; | ||
945 | state->Init_Ctrl[14].val[15] = 0; | ||
946 | |||
947 | state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ; | ||
948 | state->Init_Ctrl[15].size = 3 ; | ||
949 | state->Init_Ctrl[15].addr[0] = 147; | ||
950 | state->Init_Ctrl[15].bit[0] = 2; | ||
951 | state->Init_Ctrl[15].val[0] = 0; | ||
952 | state->Init_Ctrl[15].addr[1] = 147; | ||
953 | state->Init_Ctrl[15].bit[1] = 3; | ||
954 | state->Init_Ctrl[15].val[1] = 1; | ||
955 | state->Init_Ctrl[15].addr[2] = 147; | ||
956 | state->Init_Ctrl[15].bit[2] = 4; | ||
957 | state->Init_Ctrl[15].val[2] = 1; | ||
958 | |||
959 | state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ; | ||
960 | state->Init_Ctrl[16].size = 2 ; | ||
961 | state->Init_Ctrl[16].addr[0] = 147; | ||
962 | state->Init_Ctrl[16].bit[0] = 0; | ||
963 | state->Init_Ctrl[16].val[0] = 0; | ||
964 | state->Init_Ctrl[16].addr[1] = 147; | ||
965 | state->Init_Ctrl[16].bit[1] = 1; | ||
966 | state->Init_Ctrl[16].val[1] = 1; | ||
967 | |||
968 | state->Init_Ctrl[17].Ctrl_Num = EN_AAF ; | ||
969 | state->Init_Ctrl[17].size = 1 ; | ||
970 | state->Init_Ctrl[17].addr[0] = 147; | ||
971 | state->Init_Ctrl[17].bit[0] = 7; | ||
972 | state->Init_Ctrl[17].val[0] = 0; | ||
973 | |||
974 | state->Init_Ctrl[18].Ctrl_Num = EN_3P ; | ||
975 | state->Init_Ctrl[18].size = 1 ; | ||
976 | state->Init_Ctrl[18].addr[0] = 147; | ||
977 | state->Init_Ctrl[18].bit[0] = 6; | ||
978 | state->Init_Ctrl[18].val[0] = 0; | ||
979 | |||
980 | state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ; | ||
981 | state->Init_Ctrl[19].size = 1 ; | ||
982 | state->Init_Ctrl[19].addr[0] = 156; | ||
983 | state->Init_Ctrl[19].bit[0] = 0; | ||
984 | state->Init_Ctrl[19].val[0] = 0; | ||
985 | |||
986 | state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ; | ||
987 | state->Init_Ctrl[20].size = 1 ; | ||
988 | state->Init_Ctrl[20].addr[0] = 147; | ||
989 | state->Init_Ctrl[20].bit[0] = 5; | ||
990 | state->Init_Ctrl[20].val[0] = 0; | ||
991 | |||
992 | state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ; | ||
993 | state->Init_Ctrl[21].size = 1 ; | ||
994 | state->Init_Ctrl[21].addr[0] = 137; | ||
995 | state->Init_Ctrl[21].bit[0] = 4; | ||
996 | state->Init_Ctrl[21].val[0] = 0; | ||
997 | |||
998 | state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ; | ||
999 | state->Init_Ctrl[22].size = 1 ; | ||
1000 | state->Init_Ctrl[22].addr[0] = 137; | ||
1001 | state->Init_Ctrl[22].bit[0] = 7; | ||
1002 | state->Init_Ctrl[22].val[0] = 0; | ||
1003 | |||
1004 | state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ; | ||
1005 | state->Init_Ctrl[23].size = 1 ; | ||
1006 | state->Init_Ctrl[23].addr[0] = 91; | ||
1007 | state->Init_Ctrl[23].bit[0] = 5; | ||
1008 | state->Init_Ctrl[23].val[0] = 1; | ||
1009 | |||
1010 | state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ; | ||
1011 | state->Init_Ctrl[24].size = 1 ; | ||
1012 | state->Init_Ctrl[24].addr[0] = 43; | ||
1013 | state->Init_Ctrl[24].bit[0] = 0; | ||
1014 | state->Init_Ctrl[24].val[0] = 1; | ||
1015 | |||
1016 | state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ; | ||
1017 | state->Init_Ctrl[25].size = 2 ; | ||
1018 | state->Init_Ctrl[25].addr[0] = 22; | ||
1019 | state->Init_Ctrl[25].bit[0] = 0; | ||
1020 | state->Init_Ctrl[25].val[0] = 1; | ||
1021 | state->Init_Ctrl[25].addr[1] = 22; | ||
1022 | state->Init_Ctrl[25].bit[1] = 1; | ||
1023 | state->Init_Ctrl[25].val[1] = 1; | ||
1024 | |||
1025 | state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ; | ||
1026 | state->Init_Ctrl[26].size = 1 ; | ||
1027 | state->Init_Ctrl[26].addr[0] = 134; | ||
1028 | state->Init_Ctrl[26].bit[0] = 2; | ||
1029 | state->Init_Ctrl[26].val[0] = 0; | ||
1030 | |||
1031 | state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ; | ||
1032 | state->Init_Ctrl[27].size = 1 ; | ||
1033 | state->Init_Ctrl[27].addr[0] = 137; | ||
1034 | state->Init_Ctrl[27].bit[0] = 3; | ||
1035 | state->Init_Ctrl[27].val[0] = 0; | ||
1036 | |||
1037 | state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ; | ||
1038 | state->Init_Ctrl[28].size = 1 ; | ||
1039 | state->Init_Ctrl[28].addr[0] = 77; | ||
1040 | state->Init_Ctrl[28].bit[0] = 7; | ||
1041 | state->Init_Ctrl[28].val[0] = 0; | ||
1042 | |||
1043 | state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ; | ||
1044 | state->Init_Ctrl[29].size = 1 ; | ||
1045 | state->Init_Ctrl[29].addr[0] = 166; | ||
1046 | state->Init_Ctrl[29].bit[0] = 7; | ||
1047 | state->Init_Ctrl[29].val[0] = 1; | ||
1048 | |||
1049 | state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ; | ||
1050 | state->Init_Ctrl[30].size = 3 ; | ||
1051 | state->Init_Ctrl[30].addr[0] = 166; | ||
1052 | state->Init_Ctrl[30].bit[0] = 0; | ||
1053 | state->Init_Ctrl[30].val[0] = 0; | ||
1054 | state->Init_Ctrl[30].addr[1] = 166; | ||
1055 | state->Init_Ctrl[30].bit[1] = 1; | ||
1056 | state->Init_Ctrl[30].val[1] = 1; | ||
1057 | state->Init_Ctrl[30].addr[2] = 166; | ||
1058 | state->Init_Ctrl[30].bit[2] = 2; | ||
1059 | state->Init_Ctrl[30].val[2] = 1; | ||
1060 | |||
1061 | state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ; | ||
1062 | state->Init_Ctrl[31].size = 3 ; | ||
1063 | state->Init_Ctrl[31].addr[0] = 166; | ||
1064 | state->Init_Ctrl[31].bit[0] = 3; | ||
1065 | state->Init_Ctrl[31].val[0] = 1; | ||
1066 | state->Init_Ctrl[31].addr[1] = 166; | ||
1067 | state->Init_Ctrl[31].bit[1] = 4; | ||
1068 | state->Init_Ctrl[31].val[1] = 0; | ||
1069 | state->Init_Ctrl[31].addr[2] = 166; | ||
1070 | state->Init_Ctrl[31].bit[2] = 5; | ||
1071 | state->Init_Ctrl[31].val[2] = 1; | ||
1072 | |||
1073 | state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ; | ||
1074 | state->Init_Ctrl[32].size = 3 ; | ||
1075 | state->Init_Ctrl[32].addr[0] = 167; | ||
1076 | state->Init_Ctrl[32].bit[0] = 0; | ||
1077 | state->Init_Ctrl[32].val[0] = 1; | ||
1078 | state->Init_Ctrl[32].addr[1] = 167; | ||
1079 | state->Init_Ctrl[32].bit[1] = 1; | ||
1080 | state->Init_Ctrl[32].val[1] = 1; | ||
1081 | state->Init_Ctrl[32].addr[2] = 167; | ||
1082 | state->Init_Ctrl[32].bit[2] = 2; | ||
1083 | state->Init_Ctrl[32].val[2] = 0; | ||
1084 | |||
1085 | state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ; | ||
1086 | state->Init_Ctrl[33].size = 4 ; | ||
1087 | state->Init_Ctrl[33].addr[0] = 168; | ||
1088 | state->Init_Ctrl[33].bit[0] = 0; | ||
1089 | state->Init_Ctrl[33].val[0] = 0; | ||
1090 | state->Init_Ctrl[33].addr[1] = 168; | ||
1091 | state->Init_Ctrl[33].bit[1] = 1; | ||
1092 | state->Init_Ctrl[33].val[1] = 1; | ||
1093 | state->Init_Ctrl[33].addr[2] = 168; | ||
1094 | state->Init_Ctrl[33].bit[2] = 2; | ||
1095 | state->Init_Ctrl[33].val[2] = 0; | ||
1096 | state->Init_Ctrl[33].addr[3] = 168; | ||
1097 | state->Init_Ctrl[33].bit[3] = 3; | ||
1098 | state->Init_Ctrl[33].val[3] = 0; | ||
1099 | |||
1100 | state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ; | ||
1101 | state->Init_Ctrl[34].size = 4 ; | ||
1102 | state->Init_Ctrl[34].addr[0] = 168; | ||
1103 | state->Init_Ctrl[34].bit[0] = 4; | ||
1104 | state->Init_Ctrl[34].val[0] = 1; | ||
1105 | state->Init_Ctrl[34].addr[1] = 168; | ||
1106 | state->Init_Ctrl[34].bit[1] = 5; | ||
1107 | state->Init_Ctrl[34].val[1] = 1; | ||
1108 | state->Init_Ctrl[34].addr[2] = 168; | ||
1109 | state->Init_Ctrl[34].bit[2] = 6; | ||
1110 | state->Init_Ctrl[34].val[2] = 1; | ||
1111 | state->Init_Ctrl[34].addr[3] = 168; | ||
1112 | state->Init_Ctrl[34].bit[3] = 7; | ||
1113 | state->Init_Ctrl[34].val[3] = 1; | ||
1114 | |||
1115 | state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ; | ||
1116 | state->Init_Ctrl[35].size = 1 ; | ||
1117 | state->Init_Ctrl[35].addr[0] = 135; | ||
1118 | state->Init_Ctrl[35].bit[0] = 0; | ||
1119 | state->Init_Ctrl[35].val[0] = 0; | ||
1120 | |||
1121 | state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ; | ||
1122 | state->Init_Ctrl[36].size = 1 ; | ||
1123 | state->Init_Ctrl[36].addr[0] = 56; | ||
1124 | state->Init_Ctrl[36].bit[0] = 3; | ||
1125 | state->Init_Ctrl[36].val[0] = 0; | ||
1126 | |||
1127 | state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ; | ||
1128 | state->Init_Ctrl[37].size = 7 ; | ||
1129 | state->Init_Ctrl[37].addr[0] = 59; | ||
1130 | state->Init_Ctrl[37].bit[0] = 1; | ||
1131 | state->Init_Ctrl[37].val[0] = 0; | ||
1132 | state->Init_Ctrl[37].addr[1] = 59; | ||
1133 | state->Init_Ctrl[37].bit[1] = 2; | ||
1134 | state->Init_Ctrl[37].val[1] = 0; | ||
1135 | state->Init_Ctrl[37].addr[2] = 59; | ||
1136 | state->Init_Ctrl[37].bit[2] = 3; | ||
1137 | state->Init_Ctrl[37].val[2] = 0; | ||
1138 | state->Init_Ctrl[37].addr[3] = 59; | ||
1139 | state->Init_Ctrl[37].bit[3] = 4; | ||
1140 | state->Init_Ctrl[37].val[3] = 0; | ||
1141 | state->Init_Ctrl[37].addr[4] = 59; | ||
1142 | state->Init_Ctrl[37].bit[4] = 5; | ||
1143 | state->Init_Ctrl[37].val[4] = 0; | ||
1144 | state->Init_Ctrl[37].addr[5] = 59; | ||
1145 | state->Init_Ctrl[37].bit[5] = 6; | ||
1146 | state->Init_Ctrl[37].val[5] = 0; | ||
1147 | state->Init_Ctrl[37].addr[6] = 59; | ||
1148 | state->Init_Ctrl[37].bit[6] = 7; | ||
1149 | state->Init_Ctrl[37].val[6] = 0; | ||
1150 | |||
1151 | state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ; | ||
1152 | state->Init_Ctrl[38].size = 6 ; | ||
1153 | state->Init_Ctrl[38].addr[0] = 32; | ||
1154 | state->Init_Ctrl[38].bit[0] = 2; | ||
1155 | state->Init_Ctrl[38].val[0] = 0; | ||
1156 | state->Init_Ctrl[38].addr[1] = 32; | ||
1157 | state->Init_Ctrl[38].bit[1] = 3; | ||
1158 | state->Init_Ctrl[38].val[1] = 0; | ||
1159 | state->Init_Ctrl[38].addr[2] = 32; | ||
1160 | state->Init_Ctrl[38].bit[2] = 4; | ||
1161 | state->Init_Ctrl[38].val[2] = 0; | ||
1162 | state->Init_Ctrl[38].addr[3] = 32; | ||
1163 | state->Init_Ctrl[38].bit[3] = 5; | ||
1164 | state->Init_Ctrl[38].val[3] = 0; | ||
1165 | state->Init_Ctrl[38].addr[4] = 32; | ||
1166 | state->Init_Ctrl[38].bit[4] = 6; | ||
1167 | state->Init_Ctrl[38].val[4] = 1; | ||
1168 | state->Init_Ctrl[38].addr[5] = 32; | ||
1169 | state->Init_Ctrl[38].bit[5] = 7; | ||
1170 | state->Init_Ctrl[38].val[5] = 0; | ||
1171 | |||
1172 | state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ; | ||
1173 | state->Init_Ctrl[39].size = 1 ; | ||
1174 | state->Init_Ctrl[39].addr[0] = 25; | ||
1175 | state->Init_Ctrl[39].bit[0] = 3; | ||
1176 | state->Init_Ctrl[39].val[0] = 1; | ||
1177 | |||
1178 | |||
1179 | state->CH_Ctrl_Num = CHCTRL_NUM ; | ||
1180 | |||
1181 | state->CH_Ctrl[0].Ctrl_Num = DN_POLY ; | ||
1182 | state->CH_Ctrl[0].size = 2 ; | ||
1183 | state->CH_Ctrl[0].addr[0] = 68; | ||
1184 | state->CH_Ctrl[0].bit[0] = 6; | ||
1185 | state->CH_Ctrl[0].val[0] = 1; | ||
1186 | state->CH_Ctrl[0].addr[1] = 68; | ||
1187 | state->CH_Ctrl[0].bit[1] = 7; | ||
1188 | state->CH_Ctrl[0].val[1] = 1; | ||
1189 | |||
1190 | state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ; | ||
1191 | state->CH_Ctrl[1].size = 2 ; | ||
1192 | state->CH_Ctrl[1].addr[0] = 70; | ||
1193 | state->CH_Ctrl[1].bit[0] = 6; | ||
1194 | state->CH_Ctrl[1].val[0] = 1; | ||
1195 | state->CH_Ctrl[1].addr[1] = 70; | ||
1196 | state->CH_Ctrl[1].bit[1] = 7; | ||
1197 | state->CH_Ctrl[1].val[1] = 0; | ||
1198 | |||
1199 | state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ; | ||
1200 | state->CH_Ctrl[2].size = 9 ; | ||
1201 | state->CH_Ctrl[2].addr[0] = 69; | ||
1202 | state->CH_Ctrl[2].bit[0] = 5; | ||
1203 | state->CH_Ctrl[2].val[0] = 0; | ||
1204 | state->CH_Ctrl[2].addr[1] = 69; | ||
1205 | state->CH_Ctrl[2].bit[1] = 6; | ||
1206 | state->CH_Ctrl[2].val[1] = 0; | ||
1207 | state->CH_Ctrl[2].addr[2] = 69; | ||
1208 | state->CH_Ctrl[2].bit[2] = 7; | ||
1209 | state->CH_Ctrl[2].val[2] = 0; | ||
1210 | state->CH_Ctrl[2].addr[3] = 68; | ||
1211 | state->CH_Ctrl[2].bit[3] = 0; | ||
1212 | state->CH_Ctrl[2].val[3] = 0; | ||
1213 | state->CH_Ctrl[2].addr[4] = 68; | ||
1214 | state->CH_Ctrl[2].bit[4] = 1; | ||
1215 | state->CH_Ctrl[2].val[4] = 0; | ||
1216 | state->CH_Ctrl[2].addr[5] = 68; | ||
1217 | state->CH_Ctrl[2].bit[5] = 2; | ||
1218 | state->CH_Ctrl[2].val[5] = 0; | ||
1219 | state->CH_Ctrl[2].addr[6] = 68; | ||
1220 | state->CH_Ctrl[2].bit[6] = 3; | ||
1221 | state->CH_Ctrl[2].val[6] = 0; | ||
1222 | state->CH_Ctrl[2].addr[7] = 68; | ||
1223 | state->CH_Ctrl[2].bit[7] = 4; | ||
1224 | state->CH_Ctrl[2].val[7] = 0; | ||
1225 | state->CH_Ctrl[2].addr[8] = 68; | ||
1226 | state->CH_Ctrl[2].bit[8] = 5; | ||
1227 | state->CH_Ctrl[2].val[8] = 0; | ||
1228 | |||
1229 | state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ; | ||
1230 | state->CH_Ctrl[3].size = 1 ; | ||
1231 | state->CH_Ctrl[3].addr[0] = 70; | ||
1232 | state->CH_Ctrl[3].bit[0] = 5; | ||
1233 | state->CH_Ctrl[3].val[0] = 0; | ||
1234 | |||
1235 | state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ; | ||
1236 | state->CH_Ctrl[4].size = 3 ; | ||
1237 | state->CH_Ctrl[4].addr[0] = 73; | ||
1238 | state->CH_Ctrl[4].bit[0] = 4; | ||
1239 | state->CH_Ctrl[4].val[0] = 0; | ||
1240 | state->CH_Ctrl[4].addr[1] = 73; | ||
1241 | state->CH_Ctrl[4].bit[1] = 5; | ||
1242 | state->CH_Ctrl[4].val[1] = 1; | ||
1243 | state->CH_Ctrl[4].addr[2] = 73; | ||
1244 | state->CH_Ctrl[4].bit[2] = 6; | ||
1245 | state->CH_Ctrl[4].val[2] = 0; | ||
1246 | |||
1247 | state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ; | ||
1248 | state->CH_Ctrl[5].size = 4 ; | ||
1249 | state->CH_Ctrl[5].addr[0] = 70; | ||
1250 | state->CH_Ctrl[5].bit[0] = 0; | ||
1251 | state->CH_Ctrl[5].val[0] = 0; | ||
1252 | state->CH_Ctrl[5].addr[1] = 70; | ||
1253 | state->CH_Ctrl[5].bit[1] = 1; | ||
1254 | state->CH_Ctrl[5].val[1] = 0; | ||
1255 | state->CH_Ctrl[5].addr[2] = 70; | ||
1256 | state->CH_Ctrl[5].bit[2] = 2; | ||
1257 | state->CH_Ctrl[5].val[2] = 0; | ||
1258 | state->CH_Ctrl[5].addr[3] = 70; | ||
1259 | state->CH_Ctrl[5].bit[3] = 3; | ||
1260 | state->CH_Ctrl[5].val[3] = 0; | ||
1261 | |||
1262 | state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ; | ||
1263 | state->CH_Ctrl[6].size = 1 ; | ||
1264 | state->CH_Ctrl[6].addr[0] = 70; | ||
1265 | state->CH_Ctrl[6].bit[0] = 4; | ||
1266 | state->CH_Ctrl[6].val[0] = 1; | ||
1267 | |||
1268 | state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ; | ||
1269 | state->CH_Ctrl[7].size = 1 ; | ||
1270 | state->CH_Ctrl[7].addr[0] = 111; | ||
1271 | state->CH_Ctrl[7].bit[0] = 4; | ||
1272 | state->CH_Ctrl[7].val[0] = 0; | ||
1273 | |||
1274 | state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ; | ||
1275 | state->CH_Ctrl[8].size = 1 ; | ||
1276 | state->CH_Ctrl[8].addr[0] = 111; | ||
1277 | state->CH_Ctrl[8].bit[0] = 7; | ||
1278 | state->CH_Ctrl[8].val[0] = 1; | ||
1279 | |||
1280 | state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ; | ||
1281 | state->CH_Ctrl[9].size = 1 ; | ||
1282 | state->CH_Ctrl[9].addr[0] = 111; | ||
1283 | state->CH_Ctrl[9].bit[0] = 6; | ||
1284 | state->CH_Ctrl[9].val[0] = 1; | ||
1285 | |||
1286 | state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ; | ||
1287 | state->CH_Ctrl[10].size = 1 ; | ||
1288 | state->CH_Ctrl[10].addr[0] = 111; | ||
1289 | state->CH_Ctrl[10].bit[0] = 5; | ||
1290 | state->CH_Ctrl[10].val[0] = 0; | ||
1291 | |||
1292 | state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ; | ||
1293 | state->CH_Ctrl[11].size = 2 ; | ||
1294 | state->CH_Ctrl[11].addr[0] = 110; | ||
1295 | state->CH_Ctrl[11].bit[0] = 0; | ||
1296 | state->CH_Ctrl[11].val[0] = 1; | ||
1297 | state->CH_Ctrl[11].addr[1] = 110; | ||
1298 | state->CH_Ctrl[11].bit[1] = 1; | ||
1299 | state->CH_Ctrl[11].val[1] = 0; | ||
1300 | |||
1301 | state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ; | ||
1302 | state->CH_Ctrl[12].size = 3 ; | ||
1303 | state->CH_Ctrl[12].addr[0] = 69; | ||
1304 | state->CH_Ctrl[12].bit[0] = 2; | ||
1305 | state->CH_Ctrl[12].val[0] = 0; | ||
1306 | state->CH_Ctrl[12].addr[1] = 69; | ||
1307 | state->CH_Ctrl[12].bit[1] = 3; | ||
1308 | state->CH_Ctrl[12].val[1] = 0; | ||
1309 | state->CH_Ctrl[12].addr[2] = 69; | ||
1310 | state->CH_Ctrl[12].bit[2] = 4; | ||
1311 | state->CH_Ctrl[12].val[2] = 0; | ||
1312 | |||
1313 | state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ; | ||
1314 | state->CH_Ctrl[13].size = 6 ; | ||
1315 | state->CH_Ctrl[13].addr[0] = 110; | ||
1316 | state->CH_Ctrl[13].bit[0] = 2; | ||
1317 | state->CH_Ctrl[13].val[0] = 0; | ||
1318 | state->CH_Ctrl[13].addr[1] = 110; | ||
1319 | state->CH_Ctrl[13].bit[1] = 3; | ||
1320 | state->CH_Ctrl[13].val[1] = 0; | ||
1321 | state->CH_Ctrl[13].addr[2] = 110; | ||
1322 | state->CH_Ctrl[13].bit[2] = 4; | ||
1323 | state->CH_Ctrl[13].val[2] = 0; | ||
1324 | state->CH_Ctrl[13].addr[3] = 110; | ||
1325 | state->CH_Ctrl[13].bit[3] = 5; | ||
1326 | state->CH_Ctrl[13].val[3] = 0; | ||
1327 | state->CH_Ctrl[13].addr[4] = 110; | ||
1328 | state->CH_Ctrl[13].bit[4] = 6; | ||
1329 | state->CH_Ctrl[13].val[4] = 0; | ||
1330 | state->CH_Ctrl[13].addr[5] = 110; | ||
1331 | state->CH_Ctrl[13].bit[5] = 7; | ||
1332 | state->CH_Ctrl[13].val[5] = 1; | ||
1333 | |||
1334 | state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ; | ||
1335 | state->CH_Ctrl[14].size = 7 ; | ||
1336 | state->CH_Ctrl[14].addr[0] = 14; | ||
1337 | state->CH_Ctrl[14].bit[0] = 0; | ||
1338 | state->CH_Ctrl[14].val[0] = 0; | ||
1339 | state->CH_Ctrl[14].addr[1] = 14; | ||
1340 | state->CH_Ctrl[14].bit[1] = 1; | ||
1341 | state->CH_Ctrl[14].val[1] = 0; | ||
1342 | state->CH_Ctrl[14].addr[2] = 14; | ||
1343 | state->CH_Ctrl[14].bit[2] = 2; | ||
1344 | state->CH_Ctrl[14].val[2] = 0; | ||
1345 | state->CH_Ctrl[14].addr[3] = 14; | ||
1346 | state->CH_Ctrl[14].bit[3] = 3; | ||
1347 | state->CH_Ctrl[14].val[3] = 0; | ||
1348 | state->CH_Ctrl[14].addr[4] = 14; | ||
1349 | state->CH_Ctrl[14].bit[4] = 4; | ||
1350 | state->CH_Ctrl[14].val[4] = 0; | ||
1351 | state->CH_Ctrl[14].addr[5] = 14; | ||
1352 | state->CH_Ctrl[14].bit[5] = 5; | ||
1353 | state->CH_Ctrl[14].val[5] = 0; | ||
1354 | state->CH_Ctrl[14].addr[6] = 14; | ||
1355 | state->CH_Ctrl[14].bit[6] = 6; | ||
1356 | state->CH_Ctrl[14].val[6] = 0; | ||
1357 | |||
1358 | state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ; | ||
1359 | state->CH_Ctrl[15].size = 18 ; | ||
1360 | state->CH_Ctrl[15].addr[0] = 17; | ||
1361 | state->CH_Ctrl[15].bit[0] = 6; | ||
1362 | state->CH_Ctrl[15].val[0] = 0; | ||
1363 | state->CH_Ctrl[15].addr[1] = 17; | ||
1364 | state->CH_Ctrl[15].bit[1] = 7; | ||
1365 | state->CH_Ctrl[15].val[1] = 0; | ||
1366 | state->CH_Ctrl[15].addr[2] = 16; | ||
1367 | state->CH_Ctrl[15].bit[2] = 0; | ||
1368 | state->CH_Ctrl[15].val[2] = 0; | ||
1369 | state->CH_Ctrl[15].addr[3] = 16; | ||
1370 | state->CH_Ctrl[15].bit[3] = 1; | ||
1371 | state->CH_Ctrl[15].val[3] = 0; | ||
1372 | state->CH_Ctrl[15].addr[4] = 16; | ||
1373 | state->CH_Ctrl[15].bit[4] = 2; | ||
1374 | state->CH_Ctrl[15].val[4] = 0; | ||
1375 | state->CH_Ctrl[15].addr[5] = 16; | ||
1376 | state->CH_Ctrl[15].bit[5] = 3; | ||
1377 | state->CH_Ctrl[15].val[5] = 0; | ||
1378 | state->CH_Ctrl[15].addr[6] = 16; | ||
1379 | state->CH_Ctrl[15].bit[6] = 4; | ||
1380 | state->CH_Ctrl[15].val[6] = 0; | ||
1381 | state->CH_Ctrl[15].addr[7] = 16; | ||
1382 | state->CH_Ctrl[15].bit[7] = 5; | ||
1383 | state->CH_Ctrl[15].val[7] = 0; | ||
1384 | state->CH_Ctrl[15].addr[8] = 16; | ||
1385 | state->CH_Ctrl[15].bit[8] = 6; | ||
1386 | state->CH_Ctrl[15].val[8] = 0; | ||
1387 | state->CH_Ctrl[15].addr[9] = 16; | ||
1388 | state->CH_Ctrl[15].bit[9] = 7; | ||
1389 | state->CH_Ctrl[15].val[9] = 0; | ||
1390 | state->CH_Ctrl[15].addr[10] = 15; | ||
1391 | state->CH_Ctrl[15].bit[10] = 0; | ||
1392 | state->CH_Ctrl[15].val[10] = 0; | ||
1393 | state->CH_Ctrl[15].addr[11] = 15; | ||
1394 | state->CH_Ctrl[15].bit[11] = 1; | ||
1395 | state->CH_Ctrl[15].val[11] = 0; | ||
1396 | state->CH_Ctrl[15].addr[12] = 15; | ||
1397 | state->CH_Ctrl[15].bit[12] = 2; | ||
1398 | state->CH_Ctrl[15].val[12] = 0; | ||
1399 | state->CH_Ctrl[15].addr[13] = 15; | ||
1400 | state->CH_Ctrl[15].bit[13] = 3; | ||
1401 | state->CH_Ctrl[15].val[13] = 0; | ||
1402 | state->CH_Ctrl[15].addr[14] = 15; | ||
1403 | state->CH_Ctrl[15].bit[14] = 4; | ||
1404 | state->CH_Ctrl[15].val[14] = 0; | ||
1405 | state->CH_Ctrl[15].addr[15] = 15; | ||
1406 | state->CH_Ctrl[15].bit[15] = 5; | ||
1407 | state->CH_Ctrl[15].val[15] = 0; | ||
1408 | state->CH_Ctrl[15].addr[16] = 15; | ||
1409 | state->CH_Ctrl[15].bit[16] = 6; | ||
1410 | state->CH_Ctrl[15].val[16] = 1; | ||
1411 | state->CH_Ctrl[15].addr[17] = 15; | ||
1412 | state->CH_Ctrl[15].bit[17] = 7; | ||
1413 | state->CH_Ctrl[15].val[17] = 1; | ||
1414 | |||
1415 | state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ; | ||
1416 | state->CH_Ctrl[16].size = 5 ; | ||
1417 | state->CH_Ctrl[16].addr[0] = 112; | ||
1418 | state->CH_Ctrl[16].bit[0] = 0; | ||
1419 | state->CH_Ctrl[16].val[0] = 0; | ||
1420 | state->CH_Ctrl[16].addr[1] = 112; | ||
1421 | state->CH_Ctrl[16].bit[1] = 1; | ||
1422 | state->CH_Ctrl[16].val[1] = 0; | ||
1423 | state->CH_Ctrl[16].addr[2] = 112; | ||
1424 | state->CH_Ctrl[16].bit[2] = 2; | ||
1425 | state->CH_Ctrl[16].val[2] = 0; | ||
1426 | state->CH_Ctrl[16].addr[3] = 112; | ||
1427 | state->CH_Ctrl[16].bit[3] = 3; | ||
1428 | state->CH_Ctrl[16].val[3] = 0; | ||
1429 | state->CH_Ctrl[16].addr[4] = 112; | ||
1430 | state->CH_Ctrl[16].bit[4] = 4; | ||
1431 | state->CH_Ctrl[16].val[4] = 1; | ||
1432 | |||
1433 | state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ; | ||
1434 | state->CH_Ctrl[17].size = 1 ; | ||
1435 | state->CH_Ctrl[17].addr[0] = 14; | ||
1436 | state->CH_Ctrl[17].bit[0] = 7; | ||
1437 | state->CH_Ctrl[17].val[0] = 0; | ||
1438 | |||
1439 | state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ; | ||
1440 | state->CH_Ctrl[18].size = 4 ; | ||
1441 | state->CH_Ctrl[18].addr[0] = 107; | ||
1442 | state->CH_Ctrl[18].bit[0] = 3; | ||
1443 | state->CH_Ctrl[18].val[0] = 0; | ||
1444 | state->CH_Ctrl[18].addr[1] = 107; | ||
1445 | state->CH_Ctrl[18].bit[1] = 4; | ||
1446 | state->CH_Ctrl[18].val[1] = 0; | ||
1447 | state->CH_Ctrl[18].addr[2] = 107; | ||
1448 | state->CH_Ctrl[18].bit[2] = 5; | ||
1449 | state->CH_Ctrl[18].val[2] = 0; | ||
1450 | state->CH_Ctrl[18].addr[3] = 107; | ||
1451 | state->CH_Ctrl[18].bit[3] = 6; | ||
1452 | state->CH_Ctrl[18].val[3] = 0; | ||
1453 | |||
1454 | state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ; | ||
1455 | state->CH_Ctrl[19].size = 3 ; | ||
1456 | state->CH_Ctrl[19].addr[0] = 107; | ||
1457 | state->CH_Ctrl[19].bit[0] = 7; | ||
1458 | state->CH_Ctrl[19].val[0] = 1; | ||
1459 | state->CH_Ctrl[19].addr[1] = 106; | ||
1460 | state->CH_Ctrl[19].bit[1] = 0; | ||
1461 | state->CH_Ctrl[19].val[1] = 1; | ||
1462 | state->CH_Ctrl[19].addr[2] = 106; | ||
1463 | state->CH_Ctrl[19].bit[2] = 1; | ||
1464 | state->CH_Ctrl[19].val[2] = 1; | ||
1465 | |||
1466 | state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ; | ||
1467 | state->CH_Ctrl[20].size = 11 ; | ||
1468 | state->CH_Ctrl[20].addr[0] = 109; | ||
1469 | state->CH_Ctrl[20].bit[0] = 2; | ||
1470 | state->CH_Ctrl[20].val[0] = 0; | ||
1471 | state->CH_Ctrl[20].addr[1] = 109; | ||
1472 | state->CH_Ctrl[20].bit[1] = 3; | ||
1473 | state->CH_Ctrl[20].val[1] = 0; | ||
1474 | state->CH_Ctrl[20].addr[2] = 109; | ||
1475 | state->CH_Ctrl[20].bit[2] = 4; | ||
1476 | state->CH_Ctrl[20].val[2] = 0; | ||
1477 | state->CH_Ctrl[20].addr[3] = 109; | ||
1478 | state->CH_Ctrl[20].bit[3] = 5; | ||
1479 | state->CH_Ctrl[20].val[3] = 0; | ||
1480 | state->CH_Ctrl[20].addr[4] = 109; | ||
1481 | state->CH_Ctrl[20].bit[4] = 6; | ||
1482 | state->CH_Ctrl[20].val[4] = 0; | ||
1483 | state->CH_Ctrl[20].addr[5] = 109; | ||
1484 | state->CH_Ctrl[20].bit[5] = 7; | ||
1485 | state->CH_Ctrl[20].val[5] = 0; | ||
1486 | state->CH_Ctrl[20].addr[6] = 108; | ||
1487 | state->CH_Ctrl[20].bit[6] = 0; | ||
1488 | state->CH_Ctrl[20].val[6] = 0; | ||
1489 | state->CH_Ctrl[20].addr[7] = 108; | ||
1490 | state->CH_Ctrl[20].bit[7] = 1; | ||
1491 | state->CH_Ctrl[20].val[7] = 0; | ||
1492 | state->CH_Ctrl[20].addr[8] = 108; | ||
1493 | state->CH_Ctrl[20].bit[8] = 2; | ||
1494 | state->CH_Ctrl[20].val[8] = 1; | ||
1495 | state->CH_Ctrl[20].addr[9] = 108; | ||
1496 | state->CH_Ctrl[20].bit[9] = 3; | ||
1497 | state->CH_Ctrl[20].val[9] = 1; | ||
1498 | state->CH_Ctrl[20].addr[10] = 108; | ||
1499 | state->CH_Ctrl[20].bit[10] = 4; | ||
1500 | state->CH_Ctrl[20].val[10] = 1; | ||
1501 | |||
1502 | state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ; | ||
1503 | state->CH_Ctrl[21].size = 6 ; | ||
1504 | state->CH_Ctrl[21].addr[0] = 106; | ||
1505 | state->CH_Ctrl[21].bit[0] = 2; | ||
1506 | state->CH_Ctrl[21].val[0] = 0; | ||
1507 | state->CH_Ctrl[21].addr[1] = 106; | ||
1508 | state->CH_Ctrl[21].bit[1] = 3; | ||
1509 | state->CH_Ctrl[21].val[1] = 0; | ||
1510 | state->CH_Ctrl[21].addr[2] = 106; | ||
1511 | state->CH_Ctrl[21].bit[2] = 4; | ||
1512 | state->CH_Ctrl[21].val[2] = 0; | ||
1513 | state->CH_Ctrl[21].addr[3] = 106; | ||
1514 | state->CH_Ctrl[21].bit[3] = 5; | ||
1515 | state->CH_Ctrl[21].val[3] = 0; | ||
1516 | state->CH_Ctrl[21].addr[4] = 106; | ||
1517 | state->CH_Ctrl[21].bit[4] = 6; | ||
1518 | state->CH_Ctrl[21].val[4] = 0; | ||
1519 | state->CH_Ctrl[21].addr[5] = 106; | ||
1520 | state->CH_Ctrl[21].bit[5] = 7; | ||
1521 | state->CH_Ctrl[21].val[5] = 1; | ||
1522 | |||
1523 | state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ; | ||
1524 | state->CH_Ctrl[22].size = 1 ; | ||
1525 | state->CH_Ctrl[22].addr[0] = 138; | ||
1526 | state->CH_Ctrl[22].bit[0] = 4; | ||
1527 | state->CH_Ctrl[22].val[0] = 1; | ||
1528 | |||
1529 | state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ; | ||
1530 | state->CH_Ctrl[23].size = 1 ; | ||
1531 | state->CH_Ctrl[23].addr[0] = 17; | ||
1532 | state->CH_Ctrl[23].bit[0] = 5; | ||
1533 | state->CH_Ctrl[23].val[0] = 0; | ||
1534 | |||
1535 | state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ; | ||
1536 | state->CH_Ctrl[24].size = 1 ; | ||
1537 | state->CH_Ctrl[24].addr[0] = 111; | ||
1538 | state->CH_Ctrl[24].bit[0] = 3; | ||
1539 | state->CH_Ctrl[24].val[0] = 0; | ||
1540 | |||
1541 | state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ; | ||
1542 | state->CH_Ctrl[25].size = 1 ; | ||
1543 | state->CH_Ctrl[25].addr[0] = 112; | ||
1544 | state->CH_Ctrl[25].bit[0] = 7; | ||
1545 | state->CH_Ctrl[25].val[0] = 0; | ||
1546 | |||
1547 | state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ; | ||
1548 | state->CH_Ctrl[26].size = 1 ; | ||
1549 | state->CH_Ctrl[26].addr[0] = 136; | ||
1550 | state->CH_Ctrl[26].bit[0] = 7; | ||
1551 | state->CH_Ctrl[26].val[0] = 0; | ||
1552 | |||
1553 | state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ; | ||
1554 | state->CH_Ctrl[27].size = 1 ; | ||
1555 | state->CH_Ctrl[27].addr[0] = 149; | ||
1556 | state->CH_Ctrl[27].bit[0] = 7; | ||
1557 | state->CH_Ctrl[27].val[0] = 0; | ||
1558 | |||
1559 | state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ; | ||
1560 | state->CH_Ctrl[28].size = 1 ; | ||
1561 | state->CH_Ctrl[28].addr[0] = 149; | ||
1562 | state->CH_Ctrl[28].bit[0] = 6; | ||
1563 | state->CH_Ctrl[28].val[0] = 0; | ||
1564 | |||
1565 | state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ; | ||
1566 | state->CH_Ctrl[29].size = 1 ; | ||
1567 | state->CH_Ctrl[29].addr[0] = 149; | ||
1568 | state->CH_Ctrl[29].bit[0] = 5; | ||
1569 | state->CH_Ctrl[29].val[0] = 1; | ||
1570 | |||
1571 | state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ; | ||
1572 | state->CH_Ctrl[30].size = 1 ; | ||
1573 | state->CH_Ctrl[30].addr[0] = 149; | ||
1574 | state->CH_Ctrl[30].bit[0] = 4; | ||
1575 | state->CH_Ctrl[30].val[0] = 1; | ||
1576 | |||
1577 | state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ; | ||
1578 | state->CH_Ctrl[31].size = 1 ; | ||
1579 | state->CH_Ctrl[31].addr[0] = 149; | ||
1580 | state->CH_Ctrl[31].bit[0] = 3; | ||
1581 | state->CH_Ctrl[31].val[0] = 0; | ||
1582 | |||
1583 | state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ; | ||
1584 | state->CH_Ctrl[32].size = 1 ; | ||
1585 | state->CH_Ctrl[32].addr[0] = 93; | ||
1586 | state->CH_Ctrl[32].bit[0] = 1; | ||
1587 | state->CH_Ctrl[32].val[0] = 0; | ||
1588 | |||
1589 | state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ; | ||
1590 | state->CH_Ctrl[33].size = 1 ; | ||
1591 | state->CH_Ctrl[33].addr[0] = 93; | ||
1592 | state->CH_Ctrl[33].bit[0] = 0; | ||
1593 | state->CH_Ctrl[33].val[0] = 0; | ||
1594 | |||
1595 | state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ; | ||
1596 | state->CH_Ctrl[34].size = 6 ; | ||
1597 | state->CH_Ctrl[34].addr[0] = 92; | ||
1598 | state->CH_Ctrl[34].bit[0] = 2; | ||
1599 | state->CH_Ctrl[34].val[0] = 0; | ||
1600 | state->CH_Ctrl[34].addr[1] = 92; | ||
1601 | state->CH_Ctrl[34].bit[1] = 3; | ||
1602 | state->CH_Ctrl[34].val[1] = 0; | ||
1603 | state->CH_Ctrl[34].addr[2] = 92; | ||
1604 | state->CH_Ctrl[34].bit[2] = 4; | ||
1605 | state->CH_Ctrl[34].val[2] = 0; | ||
1606 | state->CH_Ctrl[34].addr[3] = 92; | ||
1607 | state->CH_Ctrl[34].bit[3] = 5; | ||
1608 | state->CH_Ctrl[34].val[3] = 0; | ||
1609 | state->CH_Ctrl[34].addr[4] = 92; | ||
1610 | state->CH_Ctrl[34].bit[4] = 6; | ||
1611 | state->CH_Ctrl[34].val[4] = 0; | ||
1612 | state->CH_Ctrl[34].addr[5] = 92; | ||
1613 | state->CH_Ctrl[34].bit[5] = 7; | ||
1614 | state->CH_Ctrl[34].val[5] = 0; | ||
1615 | |||
1616 | state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ; | ||
1617 | state->CH_Ctrl[35].size = 6 ; | ||
1618 | state->CH_Ctrl[35].addr[0] = 93; | ||
1619 | state->CH_Ctrl[35].bit[0] = 2; | ||
1620 | state->CH_Ctrl[35].val[0] = 0; | ||
1621 | state->CH_Ctrl[35].addr[1] = 93; | ||
1622 | state->CH_Ctrl[35].bit[1] = 3; | ||
1623 | state->CH_Ctrl[35].val[1] = 0; | ||
1624 | state->CH_Ctrl[35].addr[2] = 93; | ||
1625 | state->CH_Ctrl[35].bit[2] = 4; | ||
1626 | state->CH_Ctrl[35].val[2] = 0; | ||
1627 | state->CH_Ctrl[35].addr[3] = 93; | ||
1628 | state->CH_Ctrl[35].bit[3] = 5; | ||
1629 | state->CH_Ctrl[35].val[3] = 0; | ||
1630 | state->CH_Ctrl[35].addr[4] = 93; | ||
1631 | state->CH_Ctrl[35].bit[4] = 6; | ||
1632 | state->CH_Ctrl[35].val[4] = 0; | ||
1633 | state->CH_Ctrl[35].addr[5] = 93; | ||
1634 | state->CH_Ctrl[35].bit[5] = 7; | ||
1635 | state->CH_Ctrl[35].val[5] = 0; | ||
1636 | |||
1637 | #ifdef _MXL_PRODUCTION | ||
1638 | state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ; | ||
1639 | state->CH_Ctrl[36].size = 1 ; | ||
1640 | state->CH_Ctrl[36].addr[0] = 109; | ||
1641 | state->CH_Ctrl[36].bit[0] = 1; | ||
1642 | state->CH_Ctrl[36].val[0] = 1; | ||
1643 | |||
1644 | state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ; | ||
1645 | state->CH_Ctrl[37].size = 2 ; | ||
1646 | state->CH_Ctrl[37].addr[0] = 112; | ||
1647 | state->CH_Ctrl[37].bit[0] = 5; | ||
1648 | state->CH_Ctrl[37].val[0] = 0; | ||
1649 | state->CH_Ctrl[37].addr[1] = 112; | ||
1650 | state->CH_Ctrl[37].bit[1] = 6; | ||
1651 | state->CH_Ctrl[37].val[1] = 0; | ||
1652 | |||
1653 | state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ; | ||
1654 | state->CH_Ctrl[38].size = 1 ; | ||
1655 | state->CH_Ctrl[38].addr[0] = 65; | ||
1656 | state->CH_Ctrl[38].bit[0] = 1; | ||
1657 | state->CH_Ctrl[38].val[0] = 0; | ||
1658 | #endif | ||
1659 | |||
1660 | return 0 ; | ||
1661 | } | ||
1662 | |||
1663 | static void InitTunerControls(struct dvb_frontend *fe) | ||
1664 | { | ||
1665 | MXL5005_RegisterInit(fe); | ||
1666 | MXL5005_ControlInit(fe); | ||
1667 | #ifdef _MXL_INTERNAL | ||
1668 | MXL5005_MXLControlInit(fe); | ||
1669 | #endif | ||
1670 | } | ||
1671 | |||
1672 | static u16 MXL5005_TunerConfig(struct dvb_frontend *fe, | ||
1673 | u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */ | ||
1674 | u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */ | ||
1675 | u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */ | ||
1676 | u32 IF_out, /* Desired IF Out Frequency */ | ||
1677 | u32 Fxtal, /* XTAL Frequency */ | ||
1678 | u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */ | ||
1679 | u16 TOP, /* 0: Dual AGC; Value: take over point */ | ||
1680 | u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */ | ||
1681 | u8 CLOCK_OUT, /* 0: turn off clk out; 1: turn on clock out */ | ||
1682 | u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */ | ||
1683 | u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */ | ||
1684 | u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */ | ||
1685 | |||
1686 | /* Modulation Type; */ | ||
1687 | /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */ | ||
1688 | u8 Mod_Type, | ||
1689 | |||
1690 | /* Tracking Filter */ | ||
1691 | /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */ | ||
1692 | u8 TF_Type | ||
1693 | ) | ||
1694 | { | ||
1695 | struct mxl5005s_state *state = fe->tuner_priv; | ||
1696 | u16 status = 0; | ||
1697 | |||
1698 | state->Mode = Mode; | ||
1699 | state->IF_Mode = IF_mode; | ||
1700 | state->Chan_Bandwidth = Bandwidth; | ||
1701 | state->IF_OUT = IF_out; | ||
1702 | state->Fxtal = Fxtal; | ||
1703 | state->AGC_Mode = AGC_Mode; | ||
1704 | state->TOP = TOP; | ||
1705 | state->IF_OUT_LOAD = IF_OUT_LOAD; | ||
1706 | state->CLOCK_OUT = CLOCK_OUT; | ||
1707 | state->DIV_OUT = DIV_OUT; | ||
1708 | state->CAPSELECT = CAPSELECT; | ||
1709 | state->EN_RSSI = EN_RSSI; | ||
1710 | state->Mod_Type = Mod_Type; | ||
1711 | state->TF_Type = TF_Type; | ||
1712 | |||
1713 | /* Initialize all the controls and registers */ | ||
1714 | InitTunerControls(fe); | ||
1715 | |||
1716 | /* Synthesizer LO frequency calculation */ | ||
1717 | MXL_SynthIFLO_Calc(fe); | ||
1718 | |||
1719 | return status; | ||
1720 | } | ||
1721 | |||
1722 | static void MXL_SynthIFLO_Calc(struct dvb_frontend *fe) | ||
1723 | { | ||
1724 | struct mxl5005s_state *state = fe->tuner_priv; | ||
1725 | if (state->Mode == 1) /* Digital Mode */ | ||
1726 | state->IF_LO = state->IF_OUT; | ||
1727 | else /* Analog Mode */ { | ||
1728 | if (state->IF_Mode == 0) /* Analog Zero IF mode */ | ||
1729 | state->IF_LO = state->IF_OUT + 400000; | ||
1730 | else /* Analog Low IF mode */ | ||
1731 | state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2; | ||
1732 | } | ||
1733 | } | ||
1734 | |||
1735 | static void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe) | ||
1736 | { | ||
1737 | struct mxl5005s_state *state = fe->tuner_priv; | ||
1738 | |||
1739 | if (state->Mode == 1) /* Digital Mode */ { | ||
1740 | /* remove 20.48MHz setting for 2.6.10 */ | ||
1741 | state->RF_LO = state->RF_IN; | ||
1742 | /* change for 2.6.6 */ | ||
1743 | state->TG_LO = state->RF_IN - 750000; | ||
1744 | } else /* Analog Mode */ { | ||
1745 | if (state->IF_Mode == 0) /* Analog Zero IF mode */ { | ||
1746 | state->RF_LO = state->RF_IN - 400000; | ||
1747 | state->TG_LO = state->RF_IN - 1750000; | ||
1748 | } else /* Analog Low IF mode */ { | ||
1749 | state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2; | ||
1750 | state->TG_LO = state->RF_IN - | ||
1751 | state->Chan_Bandwidth + 500000; | ||
1752 | } | ||
1753 | } | ||
1754 | } | ||
1755 | |||
1756 | static u16 MXL_OverwriteICDefault(struct dvb_frontend *fe) | ||
1757 | { | ||
1758 | u16 status = 0; | ||
1759 | |||
1760 | status += MXL_ControlWrite(fe, OVERRIDE_1, 1); | ||
1761 | status += MXL_ControlWrite(fe, OVERRIDE_2, 1); | ||
1762 | status += MXL_ControlWrite(fe, OVERRIDE_3, 1); | ||
1763 | status += MXL_ControlWrite(fe, OVERRIDE_4, 1); | ||
1764 | |||
1765 | return status; | ||
1766 | } | ||
1767 | |||
1768 | static u16 MXL_BlockInit(struct dvb_frontend *fe) | ||
1769 | { | ||
1770 | struct mxl5005s_state *state = fe->tuner_priv; | ||
1771 | u16 status = 0; | ||
1772 | |||
1773 | status += MXL_OverwriteICDefault(fe); | ||
1774 | |||
1775 | /* Downconverter Control Dig Ana */ | ||
1776 | status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0); | ||
1777 | |||
1778 | /* Filter Control Dig Ana */ | ||
1779 | status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1); | ||
1780 | status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2); | ||
1781 | status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0); | ||
1782 | status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1); | ||
1783 | status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0); | ||
1784 | |||
1785 | /* Initialize Low-Pass Filter */ | ||
1786 | if (state->Mode) { /* Digital Mode */ | ||
1787 | switch (state->Chan_Bandwidth) { | ||
1788 | case 8000000: | ||
1789 | status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0); | ||
1790 | break; | ||
1791 | case 7000000: | ||
1792 | status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2); | ||
1793 | break; | ||
1794 | case 6000000: | ||
1795 | status += MXL_ControlWrite(fe, | ||
1796 | BB_DLPF_BANDSEL, 3); | ||
1797 | break; | ||
1798 | } | ||
1799 | } else { /* Analog Mode */ | ||
1800 | switch (state->Chan_Bandwidth) { | ||
1801 | case 8000000: /* Low Zero */ | ||
1802 | status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, | ||
1803 | (state->IF_Mode ? 0 : 3)); | ||
1804 | break; | ||
1805 | case 7000000: | ||
1806 | status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, | ||
1807 | (state->IF_Mode ? 1 : 4)); | ||
1808 | break; | ||
1809 | case 6000000: | ||
1810 | status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, | ||
1811 | (state->IF_Mode ? 2 : 5)); | ||
1812 | break; | ||
1813 | } | ||
1814 | } | ||
1815 | |||
1816 | /* Charge Pump Control Dig Ana */ | ||
1817 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8); | ||
1818 | status += MXL_ControlWrite(fe, | ||
1819 | RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1); | ||
1820 | status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0); | ||
1821 | |||
1822 | /* AGC TOP Control */ | ||
1823 | if (state->AGC_Mode == 0) /* Dual AGC */ { | ||
1824 | status += MXL_ControlWrite(fe, AGC_IF, 15); | ||
1825 | status += MXL_ControlWrite(fe, AGC_RF, 15); | ||
1826 | } else /* Single AGC Mode Dig Ana */ | ||
1827 | status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12); | ||
1828 | |||
1829 | if (state->TOP == 55) /* TOP == 5.5 */ | ||
1830 | status += MXL_ControlWrite(fe, AGC_IF, 0x0); | ||
1831 | |||
1832 | if (state->TOP == 72) /* TOP == 7.2 */ | ||
1833 | status += MXL_ControlWrite(fe, AGC_IF, 0x1); | ||
1834 | |||
1835 | if (state->TOP == 92) /* TOP == 9.2 */ | ||
1836 | status += MXL_ControlWrite(fe, AGC_IF, 0x2); | ||
1837 | |||
1838 | if (state->TOP == 110) /* TOP == 11.0 */ | ||
1839 | status += MXL_ControlWrite(fe, AGC_IF, 0x3); | ||
1840 | |||
1841 | if (state->TOP == 129) /* TOP == 12.9 */ | ||
1842 | status += MXL_ControlWrite(fe, AGC_IF, 0x4); | ||
1843 | |||
1844 | if (state->TOP == 147) /* TOP == 14.7 */ | ||
1845 | status += MXL_ControlWrite(fe, AGC_IF, 0x5); | ||
1846 | |||
1847 | if (state->TOP == 168) /* TOP == 16.8 */ | ||
1848 | status += MXL_ControlWrite(fe, AGC_IF, 0x6); | ||
1849 | |||
1850 | if (state->TOP == 194) /* TOP == 19.4 */ | ||
1851 | status += MXL_ControlWrite(fe, AGC_IF, 0x7); | ||
1852 | |||
1853 | if (state->TOP == 212) /* TOP == 21.2 */ | ||
1854 | status += MXL_ControlWrite(fe, AGC_IF, 0x9); | ||
1855 | |||
1856 | if (state->TOP == 232) /* TOP == 23.2 */ | ||
1857 | status += MXL_ControlWrite(fe, AGC_IF, 0xA); | ||
1858 | |||
1859 | if (state->TOP == 252) /* TOP == 25.2 */ | ||
1860 | status += MXL_ControlWrite(fe, AGC_IF, 0xB); | ||
1861 | |||
1862 | if (state->TOP == 271) /* TOP == 27.1 */ | ||
1863 | status += MXL_ControlWrite(fe, AGC_IF, 0xC); | ||
1864 | |||
1865 | if (state->TOP == 292) /* TOP == 29.2 */ | ||
1866 | status += MXL_ControlWrite(fe, AGC_IF, 0xD); | ||
1867 | |||
1868 | if (state->TOP == 317) /* TOP == 31.7 */ | ||
1869 | status += MXL_ControlWrite(fe, AGC_IF, 0xE); | ||
1870 | |||
1871 | if (state->TOP == 349) /* TOP == 34.9 */ | ||
1872 | status += MXL_ControlWrite(fe, AGC_IF, 0xF); | ||
1873 | |||
1874 | /* IF Synthesizer Control */ | ||
1875 | status += MXL_IFSynthInit(fe); | ||
1876 | |||
1877 | /* IF UpConverter Control */ | ||
1878 | if (state->IF_OUT_LOAD == 200) { | ||
1879 | status += MXL_ControlWrite(fe, DRV_RES_SEL, 6); | ||
1880 | status += MXL_ControlWrite(fe, I_DRIVER, 2); | ||
1881 | } | ||
1882 | if (state->IF_OUT_LOAD == 300) { | ||
1883 | status += MXL_ControlWrite(fe, DRV_RES_SEL, 4); | ||
1884 | status += MXL_ControlWrite(fe, I_DRIVER, 1); | ||
1885 | } | ||
1886 | |||
1887 | /* Anti-Alias Filtering Control | ||
1888 | * initialise Anti-Aliasing Filter | ||
1889 | */ | ||
1890 | if (state->Mode) { /* Digital Mode */ | ||
1891 | if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) { | ||
1892 | status += MXL_ControlWrite(fe, EN_AAF, 1); | ||
1893 | status += MXL_ControlWrite(fe, EN_3P, 1); | ||
1894 | status += MXL_ControlWrite(fe, EN_AUX_3P, 1); | ||
1895 | status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); | ||
1896 | } | ||
1897 | if ((state->IF_OUT == 36125000UL) || | ||
1898 | (state->IF_OUT == 36150000UL)) { | ||
1899 | status += MXL_ControlWrite(fe, EN_AAF, 1); | ||
1900 | status += MXL_ControlWrite(fe, EN_3P, 1); | ||
1901 | status += MXL_ControlWrite(fe, EN_AUX_3P, 1); | ||
1902 | status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1); | ||
1903 | } | ||
1904 | if (state->IF_OUT > 36150000UL) { | ||
1905 | status += MXL_ControlWrite(fe, EN_AAF, 0); | ||
1906 | status += MXL_ControlWrite(fe, EN_3P, 1); | ||
1907 | status += MXL_ControlWrite(fe, EN_AUX_3P, 1); | ||
1908 | status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1); | ||
1909 | } | ||
1910 | } else { /* Analog Mode */ | ||
1911 | if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL) { | ||
1912 | status += MXL_ControlWrite(fe, EN_AAF, 1); | ||
1913 | status += MXL_ControlWrite(fe, EN_3P, 1); | ||
1914 | status += MXL_ControlWrite(fe, EN_AUX_3P, 1); | ||
1915 | status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); | ||
1916 | } | ||
1917 | if (state->IF_OUT > 5000000UL) { | ||
1918 | status += MXL_ControlWrite(fe, EN_AAF, 0); | ||
1919 | status += MXL_ControlWrite(fe, EN_3P, 0); | ||
1920 | status += MXL_ControlWrite(fe, EN_AUX_3P, 0); | ||
1921 | status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0); | ||
1922 | } | ||
1923 | } | ||
1924 | |||
1925 | /* Demod Clock Out */ | ||
1926 | if (state->CLOCK_OUT) | ||
1927 | status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1); | ||
1928 | else | ||
1929 | status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0); | ||
1930 | |||
1931 | if (state->DIV_OUT == 1) | ||
1932 | status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1); | ||
1933 | if (state->DIV_OUT == 0) | ||
1934 | status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0); | ||
1935 | |||
1936 | /* Crystal Control */ | ||
1937 | if (state->CAPSELECT) | ||
1938 | status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1); | ||
1939 | else | ||
1940 | status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0); | ||
1941 | |||
1942 | if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL) | ||
1943 | status += MXL_ControlWrite(fe, IF_SEL_DBL, 1); | ||
1944 | if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL) | ||
1945 | status += MXL_ControlWrite(fe, IF_SEL_DBL, 0); | ||
1946 | |||
1947 | if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL) | ||
1948 | status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3); | ||
1949 | if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL) | ||
1950 | status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0); | ||
1951 | |||
1952 | /* Misc Controls */ | ||
1953 | if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */ | ||
1954 | status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0); | ||
1955 | else | ||
1956 | status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1); | ||
1957 | |||
1958 | /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */ | ||
1959 | |||
1960 | /* Set TG_R_DIV */ | ||
1961 | status += MXL_ControlWrite(fe, TG_R_DIV, | ||
1962 | MXL_Ceiling(state->Fxtal, 1000000)); | ||
1963 | |||
1964 | /* Apply Default value to BB_INITSTATE_DLPF_TUNE */ | ||
1965 | |||
1966 | /* RSSI Control */ | ||
1967 | if (state->EN_RSSI) { | ||
1968 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
1969 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
1970 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); | ||
1971 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
1972 | |||
1973 | /* RSSI reference point */ | ||
1974 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2); | ||
1975 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3); | ||
1976 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); | ||
1977 | |||
1978 | /* TOP point */ | ||
1979 | status += MXL_ControlWrite(fe, RFA_FLR, 0); | ||
1980 | status += MXL_ControlWrite(fe, RFA_CEIL, 12); | ||
1981 | } | ||
1982 | |||
1983 | /* Modulation type bit settings | ||
1984 | * Override the control values preset | ||
1985 | */ | ||
1986 | if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */ { | ||
1987 | state->AGC_Mode = 1; /* Single AGC Mode */ | ||
1988 | |||
1989 | /* Enable RSSI */ | ||
1990 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
1991 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
1992 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); | ||
1993 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
1994 | |||
1995 | /* RSSI reference point */ | ||
1996 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); | ||
1997 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); | ||
1998 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); | ||
1999 | |||
2000 | /* TOP point */ | ||
2001 | status += MXL_ControlWrite(fe, RFA_FLR, 2); | ||
2002 | status += MXL_ControlWrite(fe, RFA_CEIL, 13); | ||
2003 | if (state->IF_OUT <= 6280000UL) /* Low IF */ | ||
2004 | status += MXL_ControlWrite(fe, BB_IQSWAP, 0); | ||
2005 | else /* High IF */ | ||
2006 | status += MXL_ControlWrite(fe, BB_IQSWAP, 1); | ||
2007 | |||
2008 | } | ||
2009 | if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */ { | ||
2010 | state->AGC_Mode = 1; /* Single AGC Mode */ | ||
2011 | |||
2012 | /* Enable RSSI */ | ||
2013 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
2014 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
2015 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); | ||
2016 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
2017 | |||
2018 | /* RSSI reference point */ | ||
2019 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2); | ||
2020 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4); | ||
2021 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1); | ||
2022 | |||
2023 | /* TOP point */ | ||
2024 | status += MXL_ControlWrite(fe, RFA_FLR, 2); | ||
2025 | status += MXL_ControlWrite(fe, RFA_CEIL, 13); | ||
2026 | status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1); | ||
2027 | /* Low Zero */ | ||
2028 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); | ||
2029 | |||
2030 | if (state->IF_OUT <= 6280000UL) /* Low IF */ | ||
2031 | status += MXL_ControlWrite(fe, BB_IQSWAP, 0); | ||
2032 | else /* High IF */ | ||
2033 | status += MXL_ControlWrite(fe, BB_IQSWAP, 1); | ||
2034 | } | ||
2035 | if (state->Mod_Type == MXL_QAM) /* QAM Mode */ { | ||
2036 | state->Mode = MXL_DIGITAL_MODE; | ||
2037 | |||
2038 | /* state->AGC_Mode = 1; */ /* Single AGC Mode */ | ||
2039 | |||
2040 | /* Disable RSSI */ /* change here for v2.6.5 */ | ||
2041 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
2042 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
2043 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); | ||
2044 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
2045 | |||
2046 | /* RSSI reference point */ | ||
2047 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); | ||
2048 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); | ||
2049 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2); | ||
2050 | /* change here for v2.6.5 */ | ||
2051 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); | ||
2052 | |||
2053 | if (state->IF_OUT <= 6280000UL) /* Low IF */ | ||
2054 | status += MXL_ControlWrite(fe, BB_IQSWAP, 0); | ||
2055 | else /* High IF */ | ||
2056 | status += MXL_ControlWrite(fe, BB_IQSWAP, 1); | ||
2057 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2); | ||
2058 | |||
2059 | } | ||
2060 | if (state->Mod_Type == MXL_ANALOG_CABLE) { | ||
2061 | /* Analog Cable Mode */ | ||
2062 | /* state->Mode = MXL_DIGITAL_MODE; */ | ||
2063 | |||
2064 | state->AGC_Mode = 1; /* Single AGC Mode */ | ||
2065 | |||
2066 | /* Disable RSSI */ | ||
2067 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
2068 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
2069 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); | ||
2070 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
2071 | /* change for 2.6.3 */ | ||
2072 | status += MXL_ControlWrite(fe, AGC_IF, 1); | ||
2073 | status += MXL_ControlWrite(fe, AGC_RF, 15); | ||
2074 | status += MXL_ControlWrite(fe, BB_IQSWAP, 1); | ||
2075 | } | ||
2076 | |||
2077 | if (state->Mod_Type == MXL_ANALOG_OTA) { | ||
2078 | /* Analog OTA Terrestrial mode add for 2.6.7 */ | ||
2079 | /* state->Mode = MXL_ANALOG_MODE; */ | ||
2080 | |||
2081 | /* Enable RSSI */ | ||
2082 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
2083 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
2084 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); | ||
2085 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
2086 | |||
2087 | /* RSSI reference point */ | ||
2088 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); | ||
2089 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); | ||
2090 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2); | ||
2091 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); | ||
2092 | status += MXL_ControlWrite(fe, BB_IQSWAP, 1); | ||
2093 | } | ||
2094 | |||
2095 | /* RSSI disable */ | ||
2096 | if (state->EN_RSSI == 0) { | ||
2097 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
2098 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
2099 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); | ||
2100 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
2101 | } | ||
2102 | |||
2103 | return status; | ||
2104 | } | ||
2105 | |||
2106 | static u16 MXL_IFSynthInit(struct dvb_frontend *fe) | ||
2107 | { | ||
2108 | struct mxl5005s_state *state = fe->tuner_priv; | ||
2109 | u16 status = 0 ; | ||
2110 | u32 Fref = 0 ; | ||
2111 | u32 Kdbl, intModVal ; | ||
2112 | u32 fracModVal ; | ||
2113 | Kdbl = 2 ; | ||
2114 | |||
2115 | if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL) | ||
2116 | Kdbl = 2 ; | ||
2117 | if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL) | ||
2118 | Kdbl = 1 ; | ||
2119 | |||
2120 | /* IF Synthesizer Control */ | ||
2121 | if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF mode */ { | ||
2122 | if (state->IF_LO == 41000000UL) { | ||
2123 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2124 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2125 | Fref = 328000000UL ; | ||
2126 | } | ||
2127 | if (state->IF_LO == 47000000UL) { | ||
2128 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2129 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2130 | Fref = 376000000UL ; | ||
2131 | } | ||
2132 | if (state->IF_LO == 54000000UL) { | ||
2133 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10); | ||
2134 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2135 | Fref = 324000000UL ; | ||
2136 | } | ||
2137 | if (state->IF_LO == 60000000UL) { | ||
2138 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10); | ||
2139 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2140 | Fref = 360000000UL ; | ||
2141 | } | ||
2142 | if (state->IF_LO == 39250000UL) { | ||
2143 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2144 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2145 | Fref = 314000000UL ; | ||
2146 | } | ||
2147 | if (state->IF_LO == 39650000UL) { | ||
2148 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2149 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2150 | Fref = 317200000UL ; | ||
2151 | } | ||
2152 | if (state->IF_LO == 40150000UL) { | ||
2153 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2154 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2155 | Fref = 321200000UL ; | ||
2156 | } | ||
2157 | if (state->IF_LO == 40650000UL) { | ||
2158 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2159 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2160 | Fref = 325200000UL ; | ||
2161 | } | ||
2162 | } | ||
2163 | |||
2164 | if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0)) { | ||
2165 | if (state->IF_LO == 57000000UL) { | ||
2166 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10); | ||
2167 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2168 | Fref = 342000000UL ; | ||
2169 | } | ||
2170 | if (state->IF_LO == 44000000UL) { | ||
2171 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2172 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2173 | Fref = 352000000UL ; | ||
2174 | } | ||
2175 | if (state->IF_LO == 43750000UL) { | ||
2176 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2177 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2178 | Fref = 350000000UL ; | ||
2179 | } | ||
2180 | if (state->IF_LO == 36650000UL) { | ||
2181 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2182 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2183 | Fref = 366500000UL ; | ||
2184 | } | ||
2185 | if (state->IF_LO == 36150000UL) { | ||
2186 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2187 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2188 | Fref = 361500000UL ; | ||
2189 | } | ||
2190 | if (state->IF_LO == 36000000UL) { | ||
2191 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2192 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2193 | Fref = 360000000UL ; | ||
2194 | } | ||
2195 | if (state->IF_LO == 35250000UL) { | ||
2196 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2197 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2198 | Fref = 352500000UL ; | ||
2199 | } | ||
2200 | if (state->IF_LO == 34750000UL) { | ||
2201 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2202 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2203 | Fref = 347500000UL ; | ||
2204 | } | ||
2205 | if (state->IF_LO == 6280000UL) { | ||
2206 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07); | ||
2207 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2208 | Fref = 376800000UL ; | ||
2209 | } | ||
2210 | if (state->IF_LO == 5000000UL) { | ||
2211 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09); | ||
2212 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2213 | Fref = 360000000UL ; | ||
2214 | } | ||
2215 | if (state->IF_LO == 4500000UL) { | ||
2216 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06); | ||
2217 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2218 | Fref = 360000000UL ; | ||
2219 | } | ||
2220 | if (state->IF_LO == 4570000UL) { | ||
2221 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06); | ||
2222 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2223 | Fref = 365600000UL ; | ||
2224 | } | ||
2225 | if (state->IF_LO == 4000000UL) { | ||
2226 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05); | ||
2227 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2228 | Fref = 360000000UL ; | ||
2229 | } | ||
2230 | if (state->IF_LO == 57400000UL) { | ||
2231 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10); | ||
2232 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2233 | Fref = 344400000UL ; | ||
2234 | } | ||
2235 | if (state->IF_LO == 44400000UL) { | ||
2236 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2237 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2238 | Fref = 355200000UL ; | ||
2239 | } | ||
2240 | if (state->IF_LO == 44150000UL) { | ||
2241 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08); | ||
2242 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2243 | Fref = 353200000UL ; | ||
2244 | } | ||
2245 | if (state->IF_LO == 37050000UL) { | ||
2246 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2247 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2248 | Fref = 370500000UL ; | ||
2249 | } | ||
2250 | if (state->IF_LO == 36550000UL) { | ||
2251 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2252 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2253 | Fref = 365500000UL ; | ||
2254 | } | ||
2255 | if (state->IF_LO == 36125000UL) { | ||
2256 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04); | ||
2257 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2258 | Fref = 361250000UL ; | ||
2259 | } | ||
2260 | if (state->IF_LO == 6000000UL) { | ||
2261 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07); | ||
2262 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2263 | Fref = 360000000UL ; | ||
2264 | } | ||
2265 | if (state->IF_LO == 5400000UL) { | ||
2266 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07); | ||
2267 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2268 | Fref = 324000000UL ; | ||
2269 | } | ||
2270 | if (state->IF_LO == 5380000UL) { | ||
2271 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07); | ||
2272 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C); | ||
2273 | Fref = 322800000UL ; | ||
2274 | } | ||
2275 | if (state->IF_LO == 5200000UL) { | ||
2276 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09); | ||
2277 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2278 | Fref = 374400000UL ; | ||
2279 | } | ||
2280 | if (state->IF_LO == 4900000UL) { | ||
2281 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09); | ||
2282 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2283 | Fref = 352800000UL ; | ||
2284 | } | ||
2285 | if (state->IF_LO == 4400000UL) { | ||
2286 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06); | ||
2287 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2288 | Fref = 352000000UL ; | ||
2289 | } | ||
2290 | if (state->IF_LO == 4063000UL) /* add for 2.6.8 */ { | ||
2291 | status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05); | ||
2292 | status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08); | ||
2293 | Fref = 365670000UL ; | ||
2294 | } | ||
2295 | } | ||
2296 | /* CHCAL_INT_MOD_IF */ | ||
2297 | /* CHCAL_FRAC_MOD_IF */ | ||
2298 | intModVal = Fref / (state->Fxtal * Kdbl/2); | ||
2299 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal); | ||
2300 | |||
2301 | fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) * | ||
2302 | intModVal); | ||
2303 | |||
2304 | fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000); | ||
2305 | status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal); | ||
2306 | |||
2307 | return status ; | ||
2308 | } | ||
2309 | |||
2310 | static u32 MXL_GetXtalInt(u32 Xtal_Freq) | ||
2311 | { | ||
2312 | if ((Xtal_Freq % 1000000) == 0) | ||
2313 | return (Xtal_Freq / 10000); | ||
2314 | else | ||
2315 | return (((Xtal_Freq / 1000000) + 1)*100); | ||
2316 | } | ||
2317 | |||
2318 | static u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq) | ||
2319 | { | ||
2320 | struct mxl5005s_state *state = fe->tuner_priv; | ||
2321 | u16 status = 0; | ||
2322 | u32 divider_val, E3, E4, E5, E5A; | ||
2323 | u32 Fmax, Fmin, FmaxBin, FminBin; | ||
2324 | u32 Kdbl_RF = 2; | ||
2325 | u32 tg_divval; | ||
2326 | u32 tg_lo; | ||
2327 | u32 Xtal_Int; | ||
2328 | |||
2329 | u32 Fref_TG; | ||
2330 | u32 Fvco; | ||
2331 | |||
2332 | Xtal_Int = MXL_GetXtalInt(state->Fxtal); | ||
2333 | |||
2334 | state->RF_IN = RF_Freq; | ||
2335 | |||
2336 | MXL_SynthRFTGLO_Calc(fe); | ||
2337 | |||
2338 | if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL) | ||
2339 | Kdbl_RF = 2; | ||
2340 | if (state->Fxtal > 22000000 && state->Fxtal <= 32000000) | ||
2341 | Kdbl_RF = 1; | ||
2342 | |||
2343 | /* Downconverter Controls | ||
2344 | * Look-Up Table Implementation for: | ||
2345 | * DN_POLY | ||
2346 | * DN_RFGAIN | ||
2347 | * DN_CAP_RFLPF | ||
2348 | * DN_EN_VHFUHFBAR | ||
2349 | * DN_GAIN_ADJUST | ||
2350 | * Change the boundary reference from RF_IN to RF_LO | ||
2351 | */ | ||
2352 | if (state->RF_LO < 40000000UL) | ||
2353 | return -1; | ||
2354 | |||
2355 | if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) { | ||
2356 | status += MXL_ControlWrite(fe, DN_POLY, 2); | ||
2357 | status += MXL_ControlWrite(fe, DN_RFGAIN, 3); | ||
2358 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423); | ||
2359 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1); | ||
2360 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1); | ||
2361 | } | ||
2362 | if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) { | ||
2363 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2364 | status += MXL_ControlWrite(fe, DN_RFGAIN, 3); | ||
2365 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222); | ||
2366 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1); | ||
2367 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1); | ||
2368 | } | ||
2369 | if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) { | ||
2370 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2371 | status += MXL_ControlWrite(fe, DN_RFGAIN, 3); | ||
2372 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147); | ||
2373 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1); | ||
2374 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2); | ||
2375 | } | ||
2376 | if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) { | ||
2377 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2378 | status += MXL_ControlWrite(fe, DN_RFGAIN, 3); | ||
2379 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9); | ||
2380 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1); | ||
2381 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2); | ||
2382 | } | ||
2383 | if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) { | ||
2384 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2385 | status += MXL_ControlWrite(fe, DN_RFGAIN, 3); | ||
2386 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0); | ||
2387 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1); | ||
2388 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3); | ||
2389 | } | ||
2390 | if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) { | ||
2391 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2392 | status += MXL_ControlWrite(fe, DN_RFGAIN, 1); | ||
2393 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0); | ||
2394 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0); | ||
2395 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3); | ||
2396 | } | ||
2397 | if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) { | ||
2398 | status += MXL_ControlWrite(fe, DN_POLY, 3); | ||
2399 | status += MXL_ControlWrite(fe, DN_RFGAIN, 2); | ||
2400 | status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0); | ||
2401 | status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0); | ||
2402 | status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3); | ||
2403 | } | ||
2404 | if (state->RF_LO > 900000000UL) | ||
2405 | return -1; | ||
2406 | |||
2407 | /* DN_IQTNBUF_AMP */ | ||
2408 | /* DN_IQTNGNBFBIAS_BST */ | ||
2409 | if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) { | ||
2410 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2411 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2412 | } | ||
2413 | if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) { | ||
2414 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2415 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2416 | } | ||
2417 | if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) { | ||
2418 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2419 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2420 | } | ||
2421 | if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) { | ||
2422 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2423 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2424 | } | ||
2425 | if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) { | ||
2426 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2427 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2428 | } | ||
2429 | if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) { | ||
2430 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2431 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2432 | } | ||
2433 | if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) { | ||
2434 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2435 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2436 | } | ||
2437 | if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) { | ||
2438 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2439 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2440 | } | ||
2441 | if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) { | ||
2442 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2443 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2444 | } | ||
2445 | if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) { | ||
2446 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2447 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2448 | } | ||
2449 | if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) { | ||
2450 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2451 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2452 | } | ||
2453 | if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) { | ||
2454 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2455 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2456 | } | ||
2457 | if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) { | ||
2458 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2459 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2460 | } | ||
2461 | if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) { | ||
2462 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1); | ||
2463 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0); | ||
2464 | } | ||
2465 | if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) { | ||
2466 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10); | ||
2467 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1); | ||
2468 | } | ||
2469 | if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) { | ||
2470 | status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10); | ||
2471 | status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1); | ||
2472 | } | ||
2473 | |||
2474 | /* | ||
2475 | * Set RF Synth and LO Path Control | ||
2476 | * | ||
2477 | * Look-Up table implementation for: | ||
2478 | * RFSYN_EN_OUTMUX | ||
2479 | * RFSYN_SEL_VCO_OUT | ||
2480 | * RFSYN_SEL_VCO_HI | ||
2481 | * RFSYN_SEL_DIVM | ||
2482 | * RFSYN_RF_DIV_BIAS | ||
2483 | * DN_SEL_FREQ | ||
2484 | * | ||
2485 | * Set divider_val, Fmax, Fmix to use in Equations | ||
2486 | */ | ||
2487 | FminBin = 28000000UL ; | ||
2488 | FmaxBin = 42500000UL ; | ||
2489 | if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) { | ||
2490 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1); | ||
2491 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0); | ||
2492 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2493 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2494 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2495 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1); | ||
2496 | divider_val = 64 ; | ||
2497 | Fmax = FmaxBin ; | ||
2498 | Fmin = FminBin ; | ||
2499 | } | ||
2500 | FminBin = 42500000UL ; | ||
2501 | FmaxBin = 56000000UL ; | ||
2502 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2503 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1); | ||
2504 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0); | ||
2505 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
2506 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2507 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2508 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1); | ||
2509 | divider_val = 64 ; | ||
2510 | Fmax = FmaxBin ; | ||
2511 | Fmin = FminBin ; | ||
2512 | } | ||
2513 | FminBin = 56000000UL ; | ||
2514 | FmaxBin = 85000000UL ; | ||
2515 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2516 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2517 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2518 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2519 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2520 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2521 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1); | ||
2522 | divider_val = 32 ; | ||
2523 | Fmax = FmaxBin ; | ||
2524 | Fmin = FminBin ; | ||
2525 | } | ||
2526 | FminBin = 85000000UL ; | ||
2527 | FmaxBin = 112000000UL ; | ||
2528 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2529 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2530 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2531 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
2532 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2533 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2534 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1); | ||
2535 | divider_val = 32 ; | ||
2536 | Fmax = FmaxBin ; | ||
2537 | Fmin = FminBin ; | ||
2538 | } | ||
2539 | FminBin = 112000000UL ; | ||
2540 | FmaxBin = 170000000UL ; | ||
2541 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2542 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2543 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2544 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2545 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2546 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2547 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2); | ||
2548 | divider_val = 16 ; | ||
2549 | Fmax = FmaxBin ; | ||
2550 | Fmin = FminBin ; | ||
2551 | } | ||
2552 | FminBin = 170000000UL ; | ||
2553 | FmaxBin = 225000000UL ; | ||
2554 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2555 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2556 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2557 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
2558 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2559 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2560 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2); | ||
2561 | divider_val = 16 ; | ||
2562 | Fmax = FmaxBin ; | ||
2563 | Fmin = FminBin ; | ||
2564 | } | ||
2565 | FminBin = 225000000UL ; | ||
2566 | FmaxBin = 300000000UL ; | ||
2567 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2568 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2569 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2570 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2571 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2572 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2573 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4); | ||
2574 | divider_val = 8 ; | ||
2575 | Fmax = 340000000UL ; | ||
2576 | Fmin = FminBin ; | ||
2577 | } | ||
2578 | FminBin = 300000000UL ; | ||
2579 | FmaxBin = 340000000UL ; | ||
2580 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2581 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1); | ||
2582 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0); | ||
2583 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2584 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2585 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2586 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
2587 | divider_val = 8 ; | ||
2588 | Fmax = FmaxBin ; | ||
2589 | Fmin = 225000000UL ; | ||
2590 | } | ||
2591 | FminBin = 340000000UL ; | ||
2592 | FmaxBin = 450000000UL ; | ||
2593 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2594 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1); | ||
2595 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0); | ||
2596 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
2597 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
2598 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2); | ||
2599 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
2600 | divider_val = 8 ; | ||
2601 | Fmax = FmaxBin ; | ||
2602 | Fmin = FminBin ; | ||
2603 | } | ||
2604 | FminBin = 450000000UL ; | ||
2605 | FmaxBin = 680000000UL ; | ||
2606 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2607 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2608 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2609 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
2610 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1); | ||
2611 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2612 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
2613 | divider_val = 4 ; | ||
2614 | Fmax = FmaxBin ; | ||
2615 | Fmin = FminBin ; | ||
2616 | } | ||
2617 | FminBin = 680000000UL ; | ||
2618 | FmaxBin = 900000000UL ; | ||
2619 | if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) { | ||
2620 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
2621 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
2622 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
2623 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1); | ||
2624 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
2625 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
2626 | divider_val = 4 ; | ||
2627 | Fmax = FmaxBin ; | ||
2628 | Fmin = FminBin ; | ||
2629 | } | ||
2630 | |||
2631 | /* CHCAL_INT_MOD_RF | ||
2632 | * CHCAL_FRAC_MOD_RF | ||
2633 | * RFSYN_LPF_R | ||
2634 | * CHCAL_EN_INT_RF | ||
2635 | */ | ||
2636 | /* Equation E3 RFSYN_VCO_BIAS */ | ||
2637 | E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ; | ||
2638 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3); | ||
2639 | |||
2640 | /* Equation E4 CHCAL_INT_MOD_RF */ | ||
2641 | E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000); | ||
2642 | MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4); | ||
2643 | |||
2644 | /* Equation E5 CHCAL_FRAC_MOD_RF CHCAL_EN_INT_RF */ | ||
2645 | E5 = ((2<<17)*(state->RF_LO/10000*divider_val - | ||
2646 | (E4*(2*state->Fxtal*Kdbl_RF)/10000))) / | ||
2647 | (2*state->Fxtal*Kdbl_RF/10000); | ||
2648 | |||
2649 | status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5); | ||
2650 | |||
2651 | /* Equation E5A RFSYN_LPF_R */ | ||
2652 | E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ; | ||
2653 | status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A); | ||
2654 | |||
2655 | /* Euqation E5B CHCAL_EN_INIT_RF */ | ||
2656 | status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0)); | ||
2657 | /*if (E5 == 0) | ||
2658 | * status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1); | ||
2659 | *else | ||
2660 | * status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5); | ||
2661 | */ | ||
2662 | |||
2663 | /* | ||
2664 | * Set TG Synth | ||
2665 | * | ||
2666 | * Look-Up table implementation for: | ||
2667 | * TG_LO_DIVVAL | ||
2668 | * TG_LO_SELVAL | ||
2669 | * | ||
2670 | * Set divider_val, Fmax, Fmix to use in Equations | ||
2671 | */ | ||
2672 | if (state->TG_LO < 33000000UL) | ||
2673 | return -1; | ||
2674 | |||
2675 | FminBin = 33000000UL ; | ||
2676 | FmaxBin = 50000000UL ; | ||
2677 | if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) { | ||
2678 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6); | ||
2679 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0); | ||
2680 | divider_val = 36 ; | ||
2681 | Fmax = FmaxBin ; | ||
2682 | Fmin = FminBin ; | ||
2683 | } | ||
2684 | FminBin = 50000000UL ; | ||
2685 | FmaxBin = 67000000UL ; | ||
2686 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2687 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1); | ||
2688 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0); | ||
2689 | divider_val = 24 ; | ||
2690 | Fmax = FmaxBin ; | ||
2691 | Fmin = FminBin ; | ||
2692 | } | ||
2693 | FminBin = 67000000UL ; | ||
2694 | FmaxBin = 100000000UL ; | ||
2695 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2696 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC); | ||
2697 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2); | ||
2698 | divider_val = 18 ; | ||
2699 | Fmax = FmaxBin ; | ||
2700 | Fmin = FminBin ; | ||
2701 | } | ||
2702 | FminBin = 100000000UL ; | ||
2703 | FmaxBin = 150000000UL ; | ||
2704 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2705 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8); | ||
2706 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2); | ||
2707 | divider_val = 12 ; | ||
2708 | Fmax = FmaxBin ; | ||
2709 | Fmin = FminBin ; | ||
2710 | } | ||
2711 | FminBin = 150000000UL ; | ||
2712 | FmaxBin = 200000000UL ; | ||
2713 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2714 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0); | ||
2715 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2); | ||
2716 | divider_val = 8 ; | ||
2717 | Fmax = FmaxBin ; | ||
2718 | Fmin = FminBin ; | ||
2719 | } | ||
2720 | FminBin = 200000000UL ; | ||
2721 | FmaxBin = 300000000UL ; | ||
2722 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2723 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8); | ||
2724 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3); | ||
2725 | divider_val = 6 ; | ||
2726 | Fmax = FmaxBin ; | ||
2727 | Fmin = FminBin ; | ||
2728 | } | ||
2729 | FminBin = 300000000UL ; | ||
2730 | FmaxBin = 400000000UL ; | ||
2731 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2732 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0); | ||
2733 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3); | ||
2734 | divider_val = 4 ; | ||
2735 | Fmax = FmaxBin ; | ||
2736 | Fmin = FminBin ; | ||
2737 | } | ||
2738 | FminBin = 400000000UL ; | ||
2739 | FmaxBin = 600000000UL ; | ||
2740 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2741 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8); | ||
2742 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7); | ||
2743 | divider_val = 3 ; | ||
2744 | Fmax = FmaxBin ; | ||
2745 | Fmin = FminBin ; | ||
2746 | } | ||
2747 | FminBin = 600000000UL ; | ||
2748 | FmaxBin = 900000000UL ; | ||
2749 | if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) { | ||
2750 | status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0); | ||
2751 | status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7); | ||
2752 | divider_val = 2 ; | ||
2753 | Fmax = FmaxBin ; | ||
2754 | Fmin = FminBin ; | ||
2755 | } | ||
2756 | |||
2757 | /* TG_DIV_VAL */ | ||
2758 | tg_divval = (state->TG_LO*divider_val/100000) * | ||
2759 | (MXL_Ceiling(state->Fxtal, 1000000) * 100) / | ||
2760 | (state->Fxtal/1000); | ||
2761 | |||
2762 | status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval); | ||
2763 | |||
2764 | if (state->TG_LO > 600000000UL) | ||
2765 | status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1); | ||
2766 | |||
2767 | Fmax = 1800000000UL ; | ||
2768 | Fmin = 1200000000UL ; | ||
2769 | |||
2770 | /* prevent overflow of 32 bit unsigned integer, use | ||
2771 | * following equation. Edit for v2.6.4 | ||
2772 | */ | ||
2773 | /* Fref_TF = Fref_TG * 1000 */ | ||
2774 | Fref_TG = (state->Fxtal/1000) / MXL_Ceiling(state->Fxtal, 1000000); | ||
2775 | |||
2776 | /* Fvco = Fvco/10 */ | ||
2777 | Fvco = (state->TG_LO/10000) * divider_val * Fref_TG; | ||
2778 | |||
2779 | tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8; | ||
2780 | |||
2781 | /* below equation is same as above but much harder to debug. | ||
2782 | * tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) - | ||
2783 | * ((state->TG_LO/10000)*divider_val * | ||
2784 | * (state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 * | ||
2785 | * Xtal_Int/100) + 8; | ||
2786 | */ | ||
2787 | |||
2788 | status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo); | ||
2789 | |||
2790 | /* add for 2.6.5 Special setting for QAM */ | ||
2791 | if (state->Mod_Type == MXL_QAM) { | ||
2792 | if (state->RF_IN < 680000000) | ||
2793 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); | ||
2794 | else | ||
2795 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2); | ||
2796 | } | ||
2797 | |||
2798 | /* Off Chip Tracking Filter Control */ | ||
2799 | if (state->TF_Type == MXL_TF_OFF) { | ||
2800 | /* Tracking Filter Off State; turn off all the banks */ | ||
2801 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2802 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2803 | status += MXL_SetGPIO(fe, 3, 1); /* Bank1 Off */ | ||
2804 | status += MXL_SetGPIO(fe, 1, 1); /* Bank2 Off */ | ||
2805 | status += MXL_SetGPIO(fe, 4, 1); /* Bank3 Off */ | ||
2806 | } | ||
2807 | |||
2808 | if (state->TF_Type == MXL_TF_C) /* Tracking Filter type C */ { | ||
2809 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
2810 | status += MXL_ControlWrite(fe, DAC_DIN_A, 0); | ||
2811 | |||
2812 | if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) { | ||
2813 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2814 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2815 | status += MXL_SetGPIO(fe, 3, 0); | ||
2816 | status += MXL_SetGPIO(fe, 1, 1); | ||
2817 | status += MXL_SetGPIO(fe, 4, 1); | ||
2818 | } | ||
2819 | if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) { | ||
2820 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2821 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2822 | status += MXL_SetGPIO(fe, 3, 1); | ||
2823 | status += MXL_SetGPIO(fe, 1, 0); | ||
2824 | status += MXL_SetGPIO(fe, 4, 1); | ||
2825 | } | ||
2826 | if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) { | ||
2827 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2828 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2829 | status += MXL_SetGPIO(fe, 3, 1); | ||
2830 | status += MXL_SetGPIO(fe, 1, 0); | ||
2831 | status += MXL_SetGPIO(fe, 4, 0); | ||
2832 | } | ||
2833 | if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) { | ||
2834 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2835 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2836 | status += MXL_SetGPIO(fe, 3, 1); | ||
2837 | status += MXL_SetGPIO(fe, 1, 1); | ||
2838 | status += MXL_SetGPIO(fe, 4, 0); | ||
2839 | } | ||
2840 | if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) { | ||
2841 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2842 | status += MXL_ControlWrite(fe, DAC_DIN_B, 29); | ||
2843 | status += MXL_SetGPIO(fe, 3, 1); | ||
2844 | status += MXL_SetGPIO(fe, 1, 1); | ||
2845 | status += MXL_SetGPIO(fe, 4, 0); | ||
2846 | } | ||
2847 | if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) { | ||
2848 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2849 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2850 | status += MXL_SetGPIO(fe, 3, 1); | ||
2851 | status += MXL_SetGPIO(fe, 1, 1); | ||
2852 | status += MXL_SetGPIO(fe, 4, 0); | ||
2853 | } | ||
2854 | if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) { | ||
2855 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2856 | status += MXL_ControlWrite(fe, DAC_DIN_B, 16); | ||
2857 | status += MXL_SetGPIO(fe, 3, 1); | ||
2858 | status += MXL_SetGPIO(fe, 1, 1); | ||
2859 | status += MXL_SetGPIO(fe, 4, 1); | ||
2860 | } | ||
2861 | if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) { | ||
2862 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2863 | status += MXL_ControlWrite(fe, DAC_DIN_B, 7); | ||
2864 | status += MXL_SetGPIO(fe, 3, 1); | ||
2865 | status += MXL_SetGPIO(fe, 1, 1); | ||
2866 | status += MXL_SetGPIO(fe, 4, 1); | ||
2867 | } | ||
2868 | if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) { | ||
2869 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2870 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2871 | status += MXL_SetGPIO(fe, 3, 1); | ||
2872 | status += MXL_SetGPIO(fe, 1, 1); | ||
2873 | status += MXL_SetGPIO(fe, 4, 1); | ||
2874 | } | ||
2875 | } | ||
2876 | |||
2877 | if (state->TF_Type == MXL_TF_C_H) { | ||
2878 | |||
2879 | /* Tracking Filter type C-H for Hauppauge only */ | ||
2880 | status += MXL_ControlWrite(fe, DAC_DIN_A, 0); | ||
2881 | |||
2882 | if (state->RF_IN >= 43000000 && state->RF_IN < 150000000) { | ||
2883 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2884 | status += MXL_SetGPIO(fe, 4, 0); | ||
2885 | status += MXL_SetGPIO(fe, 3, 1); | ||
2886 | status += MXL_SetGPIO(fe, 1, 1); | ||
2887 | } | ||
2888 | if (state->RF_IN >= 150000000 && state->RF_IN < 280000000) { | ||
2889 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2890 | status += MXL_SetGPIO(fe, 4, 1); | ||
2891 | status += MXL_SetGPIO(fe, 3, 0); | ||
2892 | status += MXL_SetGPIO(fe, 1, 1); | ||
2893 | } | ||
2894 | if (state->RF_IN >= 280000000 && state->RF_IN < 360000000) { | ||
2895 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2896 | status += MXL_SetGPIO(fe, 4, 1); | ||
2897 | status += MXL_SetGPIO(fe, 3, 0); | ||
2898 | status += MXL_SetGPIO(fe, 1, 0); | ||
2899 | } | ||
2900 | if (state->RF_IN >= 360000000 && state->RF_IN < 560000000) { | ||
2901 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2902 | status += MXL_SetGPIO(fe, 4, 1); | ||
2903 | status += MXL_SetGPIO(fe, 3, 1); | ||
2904 | status += MXL_SetGPIO(fe, 1, 0); | ||
2905 | } | ||
2906 | if (state->RF_IN >= 560000000 && state->RF_IN < 580000000) { | ||
2907 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2908 | status += MXL_SetGPIO(fe, 4, 1); | ||
2909 | status += MXL_SetGPIO(fe, 3, 1); | ||
2910 | status += MXL_SetGPIO(fe, 1, 0); | ||
2911 | } | ||
2912 | if (state->RF_IN >= 580000000 && state->RF_IN < 630000000) { | ||
2913 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2914 | status += MXL_SetGPIO(fe, 4, 1); | ||
2915 | status += MXL_SetGPIO(fe, 3, 1); | ||
2916 | status += MXL_SetGPIO(fe, 1, 0); | ||
2917 | } | ||
2918 | if (state->RF_IN >= 630000000 && state->RF_IN < 700000000) { | ||
2919 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2920 | status += MXL_SetGPIO(fe, 4, 1); | ||
2921 | status += MXL_SetGPIO(fe, 3, 1); | ||
2922 | status += MXL_SetGPIO(fe, 1, 1); | ||
2923 | } | ||
2924 | if (state->RF_IN >= 700000000 && state->RF_IN < 760000000) { | ||
2925 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2926 | status += MXL_SetGPIO(fe, 4, 1); | ||
2927 | status += MXL_SetGPIO(fe, 3, 1); | ||
2928 | status += MXL_SetGPIO(fe, 1, 1); | ||
2929 | } | ||
2930 | if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000) { | ||
2931 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
2932 | status += MXL_SetGPIO(fe, 4, 1); | ||
2933 | status += MXL_SetGPIO(fe, 3, 1); | ||
2934 | status += MXL_SetGPIO(fe, 1, 1); | ||
2935 | } | ||
2936 | } | ||
2937 | |||
2938 | if (state->TF_Type == MXL_TF_D) { /* Tracking Filter type D */ | ||
2939 | |||
2940 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
2941 | |||
2942 | if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) { | ||
2943 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2944 | status += MXL_SetGPIO(fe, 4, 0); | ||
2945 | status += MXL_SetGPIO(fe, 1, 1); | ||
2946 | status += MXL_SetGPIO(fe, 3, 1); | ||
2947 | } | ||
2948 | if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) { | ||
2949 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2950 | status += MXL_SetGPIO(fe, 4, 0); | ||
2951 | status += MXL_SetGPIO(fe, 1, 0); | ||
2952 | status += MXL_SetGPIO(fe, 3, 1); | ||
2953 | } | ||
2954 | if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) { | ||
2955 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2956 | status += MXL_SetGPIO(fe, 4, 1); | ||
2957 | status += MXL_SetGPIO(fe, 1, 0); | ||
2958 | status += MXL_SetGPIO(fe, 3, 1); | ||
2959 | } | ||
2960 | if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) { | ||
2961 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2962 | status += MXL_SetGPIO(fe, 4, 1); | ||
2963 | status += MXL_SetGPIO(fe, 1, 0); | ||
2964 | status += MXL_SetGPIO(fe, 3, 0); | ||
2965 | } | ||
2966 | if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) { | ||
2967 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
2968 | status += MXL_SetGPIO(fe, 4, 1); | ||
2969 | status += MXL_SetGPIO(fe, 1, 1); | ||
2970 | status += MXL_SetGPIO(fe, 3, 0); | ||
2971 | } | ||
2972 | if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) { | ||
2973 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
2974 | status += MXL_SetGPIO(fe, 4, 1); | ||
2975 | status += MXL_SetGPIO(fe, 1, 1); | ||
2976 | status += MXL_SetGPIO(fe, 3, 0); | ||
2977 | } | ||
2978 | if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) { | ||
2979 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
2980 | status += MXL_SetGPIO(fe, 4, 1); | ||
2981 | status += MXL_SetGPIO(fe, 1, 1); | ||
2982 | status += MXL_SetGPIO(fe, 3, 1); | ||
2983 | } | ||
2984 | } | ||
2985 | |||
2986 | if (state->TF_Type == MXL_TF_D_L) { | ||
2987 | |||
2988 | /* Tracking Filter type D-L for Lumanate ONLY change 2.6.3 */ | ||
2989 | status += MXL_ControlWrite(fe, DAC_DIN_A, 0); | ||
2990 | |||
2991 | /* if UHF and terrestrial => Turn off Tracking Filter */ | ||
2992 | if (state->RF_IN >= 471000000 && | ||
2993 | (state->RF_IN - 471000000)%6000000 != 0) { | ||
2994 | /* Turn off all the banks */ | ||
2995 | status += MXL_SetGPIO(fe, 3, 1); | ||
2996 | status += MXL_SetGPIO(fe, 1, 1); | ||
2997 | status += MXL_SetGPIO(fe, 4, 1); | ||
2998 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
2999 | status += MXL_ControlWrite(fe, AGC_IF, 10); | ||
3000 | } else { | ||
3001 | /* if VHF or cable => Turn on Tracking Filter */ | ||
3002 | if (state->RF_IN >= 43000000 && | ||
3003 | state->RF_IN < 140000000) { | ||
3004 | |||
3005 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
3006 | status += MXL_SetGPIO(fe, 4, 1); | ||
3007 | status += MXL_SetGPIO(fe, 1, 1); | ||
3008 | status += MXL_SetGPIO(fe, 3, 0); | ||
3009 | } | ||
3010 | if (state->RF_IN >= 140000000 && | ||
3011 | state->RF_IN < 240000000) { | ||
3012 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
3013 | status += MXL_SetGPIO(fe, 4, 1); | ||
3014 | status += MXL_SetGPIO(fe, 1, 0); | ||
3015 | status += MXL_SetGPIO(fe, 3, 0); | ||
3016 | } | ||
3017 | if (state->RF_IN >= 240000000 && | ||
3018 | state->RF_IN < 340000000) { | ||
3019 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
3020 | status += MXL_SetGPIO(fe, 4, 0); | ||
3021 | status += MXL_SetGPIO(fe, 1, 1); | ||
3022 | status += MXL_SetGPIO(fe, 3, 0); | ||
3023 | } | ||
3024 | if (state->RF_IN >= 340000000 && | ||
3025 | state->RF_IN < 430000000) { | ||
3026 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
3027 | status += MXL_SetGPIO(fe, 4, 0); | ||
3028 | status += MXL_SetGPIO(fe, 1, 0); | ||
3029 | status += MXL_SetGPIO(fe, 3, 1); | ||
3030 | } | ||
3031 | if (state->RF_IN >= 430000000 && | ||
3032 | state->RF_IN < 470000000) { | ||
3033 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
3034 | status += MXL_SetGPIO(fe, 4, 1); | ||
3035 | status += MXL_SetGPIO(fe, 1, 0); | ||
3036 | status += MXL_SetGPIO(fe, 3, 1); | ||
3037 | } | ||
3038 | if (state->RF_IN >= 470000000 && | ||
3039 | state->RF_IN < 570000000) { | ||
3040 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
3041 | status += MXL_SetGPIO(fe, 4, 0); | ||
3042 | status += MXL_SetGPIO(fe, 1, 0); | ||
3043 | status += MXL_SetGPIO(fe, 3, 1); | ||
3044 | } | ||
3045 | if (state->RF_IN >= 570000000 && | ||
3046 | state->RF_IN < 620000000) { | ||
3047 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0); | ||
3048 | status += MXL_SetGPIO(fe, 4, 0); | ||
3049 | status += MXL_SetGPIO(fe, 1, 1); | ||
3050 | status += MXL_SetGPIO(fe, 3, 1); | ||
3051 | } | ||
3052 | if (state->RF_IN >= 620000000 && | ||
3053 | state->RF_IN < 760000000) { | ||
3054 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
3055 | status += MXL_SetGPIO(fe, 4, 0); | ||
3056 | status += MXL_SetGPIO(fe, 1, 1); | ||
3057 | status += MXL_SetGPIO(fe, 3, 1); | ||
3058 | } | ||
3059 | if (state->RF_IN >= 760000000 && | ||
3060 | state->RF_IN <= 900000000) { | ||
3061 | status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1); | ||
3062 | status += MXL_SetGPIO(fe, 4, 1); | ||
3063 | status += MXL_SetGPIO(fe, 1, 1); | ||
3064 | status += MXL_SetGPIO(fe, 3, 1); | ||
3065 | } | ||
3066 | } | ||
3067 | } | ||
3068 | |||
3069 | if (state->TF_Type == MXL_TF_E) /* Tracking Filter type E */ { | ||
3070 | |||
3071 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
3072 | |||
3073 | if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) { | ||
3074 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3075 | status += MXL_SetGPIO(fe, 4, 0); | ||
3076 | status += MXL_SetGPIO(fe, 1, 1); | ||
3077 | status += MXL_SetGPIO(fe, 3, 1); | ||
3078 | } | ||
3079 | if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) { | ||
3080 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3081 | status += MXL_SetGPIO(fe, 4, 0); | ||
3082 | status += MXL_SetGPIO(fe, 1, 0); | ||
3083 | status += MXL_SetGPIO(fe, 3, 1); | ||
3084 | } | ||
3085 | if (state->RF_IN >= 250000000 && state->RF_IN < 310000000) { | ||
3086 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3087 | status += MXL_SetGPIO(fe, 4, 1); | ||
3088 | status += MXL_SetGPIO(fe, 1, 0); | ||
3089 | status += MXL_SetGPIO(fe, 3, 1); | ||
3090 | } | ||
3091 | if (state->RF_IN >= 310000000 && state->RF_IN < 360000000) { | ||
3092 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3093 | status += MXL_SetGPIO(fe, 4, 1); | ||
3094 | status += MXL_SetGPIO(fe, 1, 0); | ||
3095 | status += MXL_SetGPIO(fe, 3, 0); | ||
3096 | } | ||
3097 | if (state->RF_IN >= 360000000 && state->RF_IN < 470000000) { | ||
3098 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3099 | status += MXL_SetGPIO(fe, 4, 1); | ||
3100 | status += MXL_SetGPIO(fe, 1, 1); | ||
3101 | status += MXL_SetGPIO(fe, 3, 0); | ||
3102 | } | ||
3103 | if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) { | ||
3104 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3105 | status += MXL_SetGPIO(fe, 4, 1); | ||
3106 | status += MXL_SetGPIO(fe, 1, 1); | ||
3107 | status += MXL_SetGPIO(fe, 3, 0); | ||
3108 | } | ||
3109 | if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000) { | ||
3110 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3111 | status += MXL_SetGPIO(fe, 4, 1); | ||
3112 | status += MXL_SetGPIO(fe, 1, 1); | ||
3113 | status += MXL_SetGPIO(fe, 3, 1); | ||
3114 | } | ||
3115 | } | ||
3116 | |||
3117 | if (state->TF_Type == MXL_TF_F) { | ||
3118 | |||
3119 | /* Tracking Filter type F */ | ||
3120 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
3121 | |||
3122 | if (state->RF_IN >= 43000000 && state->RF_IN < 160000000) { | ||
3123 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3124 | status += MXL_SetGPIO(fe, 4, 0); | ||
3125 | status += MXL_SetGPIO(fe, 1, 1); | ||
3126 | status += MXL_SetGPIO(fe, 3, 1); | ||
3127 | } | ||
3128 | if (state->RF_IN >= 160000000 && state->RF_IN < 210000000) { | ||
3129 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3130 | status += MXL_SetGPIO(fe, 4, 0); | ||
3131 | status += MXL_SetGPIO(fe, 1, 0); | ||
3132 | status += MXL_SetGPIO(fe, 3, 1); | ||
3133 | } | ||
3134 | if (state->RF_IN >= 210000000 && state->RF_IN < 300000000) { | ||
3135 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3136 | status += MXL_SetGPIO(fe, 4, 1); | ||
3137 | status += MXL_SetGPIO(fe, 1, 0); | ||
3138 | status += MXL_SetGPIO(fe, 3, 1); | ||
3139 | } | ||
3140 | if (state->RF_IN >= 300000000 && state->RF_IN < 390000000) { | ||
3141 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3142 | status += MXL_SetGPIO(fe, 4, 1); | ||
3143 | status += MXL_SetGPIO(fe, 1, 0); | ||
3144 | status += MXL_SetGPIO(fe, 3, 0); | ||
3145 | } | ||
3146 | if (state->RF_IN >= 390000000 && state->RF_IN < 515000000) { | ||
3147 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3148 | status += MXL_SetGPIO(fe, 4, 1); | ||
3149 | status += MXL_SetGPIO(fe, 1, 1); | ||
3150 | status += MXL_SetGPIO(fe, 3, 0); | ||
3151 | } | ||
3152 | if (state->RF_IN >= 515000000 && state->RF_IN < 650000000) { | ||
3153 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3154 | status += MXL_SetGPIO(fe, 4, 1); | ||
3155 | status += MXL_SetGPIO(fe, 1, 1); | ||
3156 | status += MXL_SetGPIO(fe, 3, 0); | ||
3157 | } | ||
3158 | if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000) { | ||
3159 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3160 | status += MXL_SetGPIO(fe, 4, 1); | ||
3161 | status += MXL_SetGPIO(fe, 1, 1); | ||
3162 | status += MXL_SetGPIO(fe, 3, 1); | ||
3163 | } | ||
3164 | } | ||
3165 | |||
3166 | if (state->TF_Type == MXL_TF_E_2) { | ||
3167 | |||
3168 | /* Tracking Filter type E_2 */ | ||
3169 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
3170 | |||
3171 | if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) { | ||
3172 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3173 | status += MXL_SetGPIO(fe, 4, 0); | ||
3174 | status += MXL_SetGPIO(fe, 1, 1); | ||
3175 | status += MXL_SetGPIO(fe, 3, 1); | ||
3176 | } | ||
3177 | if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) { | ||
3178 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3179 | status += MXL_SetGPIO(fe, 4, 0); | ||
3180 | status += MXL_SetGPIO(fe, 1, 0); | ||
3181 | status += MXL_SetGPIO(fe, 3, 1); | ||
3182 | } | ||
3183 | if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) { | ||
3184 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3185 | status += MXL_SetGPIO(fe, 4, 1); | ||
3186 | status += MXL_SetGPIO(fe, 1, 0); | ||
3187 | status += MXL_SetGPIO(fe, 3, 1); | ||
3188 | } | ||
3189 | if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) { | ||
3190 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3191 | status += MXL_SetGPIO(fe, 4, 1); | ||
3192 | status += MXL_SetGPIO(fe, 1, 0); | ||
3193 | status += MXL_SetGPIO(fe, 3, 0); | ||
3194 | } | ||
3195 | if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) { | ||
3196 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3197 | status += MXL_SetGPIO(fe, 4, 1); | ||
3198 | status += MXL_SetGPIO(fe, 1, 1); | ||
3199 | status += MXL_SetGPIO(fe, 3, 0); | ||
3200 | } | ||
3201 | if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) { | ||
3202 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3203 | status += MXL_SetGPIO(fe, 4, 1); | ||
3204 | status += MXL_SetGPIO(fe, 1, 1); | ||
3205 | status += MXL_SetGPIO(fe, 3, 0); | ||
3206 | } | ||
3207 | if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) { | ||
3208 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3209 | status += MXL_SetGPIO(fe, 4, 1); | ||
3210 | status += MXL_SetGPIO(fe, 1, 1); | ||
3211 | status += MXL_SetGPIO(fe, 3, 1); | ||
3212 | } | ||
3213 | } | ||
3214 | |||
3215 | if (state->TF_Type == MXL_TF_G) { | ||
3216 | |||
3217 | /* Tracking Filter type G add for v2.6.8 */ | ||
3218 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
3219 | |||
3220 | if (state->RF_IN >= 50000000 && state->RF_IN < 190000000) { | ||
3221 | |||
3222 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3223 | status += MXL_SetGPIO(fe, 4, 0); | ||
3224 | status += MXL_SetGPIO(fe, 1, 1); | ||
3225 | status += MXL_SetGPIO(fe, 3, 1); | ||
3226 | } | ||
3227 | if (state->RF_IN >= 190000000 && state->RF_IN < 280000000) { | ||
3228 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3229 | status += MXL_SetGPIO(fe, 4, 0); | ||
3230 | status += MXL_SetGPIO(fe, 1, 0); | ||
3231 | status += MXL_SetGPIO(fe, 3, 1); | ||
3232 | } | ||
3233 | if (state->RF_IN >= 280000000 && state->RF_IN < 350000000) { | ||
3234 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3235 | status += MXL_SetGPIO(fe, 4, 1); | ||
3236 | status += MXL_SetGPIO(fe, 1, 0); | ||
3237 | status += MXL_SetGPIO(fe, 3, 1); | ||
3238 | } | ||
3239 | if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) { | ||
3240 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3241 | status += MXL_SetGPIO(fe, 4, 1); | ||
3242 | status += MXL_SetGPIO(fe, 1, 0); | ||
3243 | status += MXL_SetGPIO(fe, 3, 0); | ||
3244 | } | ||
3245 | if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) { | ||
3246 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3247 | status += MXL_SetGPIO(fe, 4, 1); | ||
3248 | status += MXL_SetGPIO(fe, 1, 0); | ||
3249 | status += MXL_SetGPIO(fe, 3, 1); | ||
3250 | } | ||
3251 | if (state->RF_IN >= 470000000 && state->RF_IN < 640000000) { | ||
3252 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3253 | status += MXL_SetGPIO(fe, 4, 1); | ||
3254 | status += MXL_SetGPIO(fe, 1, 1); | ||
3255 | status += MXL_SetGPIO(fe, 3, 0); | ||
3256 | } | ||
3257 | if (state->RF_IN >= 640000000 && state->RF_IN < 820000000) { | ||
3258 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3259 | status += MXL_SetGPIO(fe, 4, 1); | ||
3260 | status += MXL_SetGPIO(fe, 1, 1); | ||
3261 | status += MXL_SetGPIO(fe, 3, 0); | ||
3262 | } | ||
3263 | if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000) { | ||
3264 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3265 | status += MXL_SetGPIO(fe, 4, 1); | ||
3266 | status += MXL_SetGPIO(fe, 1, 1); | ||
3267 | status += MXL_SetGPIO(fe, 3, 1); | ||
3268 | } | ||
3269 | } | ||
3270 | |||
3271 | if (state->TF_Type == MXL_TF_E_NA) { | ||
3272 | |||
3273 | /* Tracking Filter type E-NA for Empia ONLY change for 2.6.8 */ | ||
3274 | status += MXL_ControlWrite(fe, DAC_DIN_B, 0); | ||
3275 | |||
3276 | /* if UHF and terrestrial=> Turn off Tracking Filter */ | ||
3277 | if (state->RF_IN >= 471000000 && | ||
3278 | (state->RF_IN - 471000000)%6000000 != 0) { | ||
3279 | |||
3280 | /* Turn off all the banks */ | ||
3281 | status += MXL_SetGPIO(fe, 3, 1); | ||
3282 | status += MXL_SetGPIO(fe, 1, 1); | ||
3283 | status += MXL_SetGPIO(fe, 4, 1); | ||
3284 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3285 | |||
3286 | /* 2.6.12 Turn on RSSI */ | ||
3287 | status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1); | ||
3288 | status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1); | ||
3289 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1); | ||
3290 | status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1); | ||
3291 | |||
3292 | /* RSSI reference point */ | ||
3293 | status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5); | ||
3294 | status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3); | ||
3295 | status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2); | ||
3296 | |||
3297 | /* following parameter is from analog OTA mode, | ||
3298 | * can be change to seek better performance */ | ||
3299 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); | ||
3300 | } else { | ||
3301 | /* if VHF or Cable => Turn on Tracking Filter */ | ||
3302 | |||
3303 | /* 2.6.12 Turn off RSSI */ | ||
3304 | status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0); | ||
3305 | |||
3306 | /* change back from above condition */ | ||
3307 | status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); | ||
3308 | |||
3309 | |||
3310 | if (state->RF_IN >= 43000000 && state->RF_IN < 174000000) { | ||
3311 | |||
3312 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3313 | status += MXL_SetGPIO(fe, 4, 0); | ||
3314 | status += MXL_SetGPIO(fe, 1, 1); | ||
3315 | status += MXL_SetGPIO(fe, 3, 1); | ||
3316 | } | ||
3317 | if (state->RF_IN >= 174000000 && state->RF_IN < 250000000) { | ||
3318 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3319 | status += MXL_SetGPIO(fe, 4, 0); | ||
3320 | status += MXL_SetGPIO(fe, 1, 0); | ||
3321 | status += MXL_SetGPIO(fe, 3, 1); | ||
3322 | } | ||
3323 | if (state->RF_IN >= 250000000 && state->RF_IN < 350000000) { | ||
3324 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3325 | status += MXL_SetGPIO(fe, 4, 1); | ||
3326 | status += MXL_SetGPIO(fe, 1, 0); | ||
3327 | status += MXL_SetGPIO(fe, 3, 1); | ||
3328 | } | ||
3329 | if (state->RF_IN >= 350000000 && state->RF_IN < 400000000) { | ||
3330 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3331 | status += MXL_SetGPIO(fe, 4, 1); | ||
3332 | status += MXL_SetGPIO(fe, 1, 0); | ||
3333 | status += MXL_SetGPIO(fe, 3, 0); | ||
3334 | } | ||
3335 | if (state->RF_IN >= 400000000 && state->RF_IN < 570000000) { | ||
3336 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0); | ||
3337 | status += MXL_SetGPIO(fe, 4, 1); | ||
3338 | status += MXL_SetGPIO(fe, 1, 1); | ||
3339 | status += MXL_SetGPIO(fe, 3, 0); | ||
3340 | } | ||
3341 | if (state->RF_IN >= 570000000 && state->RF_IN < 770000000) { | ||
3342 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3343 | status += MXL_SetGPIO(fe, 4, 1); | ||
3344 | status += MXL_SetGPIO(fe, 1, 1); | ||
3345 | status += MXL_SetGPIO(fe, 3, 0); | ||
3346 | } | ||
3347 | if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000) { | ||
3348 | status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1); | ||
3349 | status += MXL_SetGPIO(fe, 4, 1); | ||
3350 | status += MXL_SetGPIO(fe, 1, 1); | ||
3351 | status += MXL_SetGPIO(fe, 3, 1); | ||
3352 | } | ||
3353 | } | ||
3354 | } | ||
3355 | return status ; | ||
3356 | } | ||
3357 | |||
3358 | static u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val) | ||
3359 | { | ||
3360 | u16 status = 0; | ||
3361 | |||
3362 | if (GPIO_Num == 1) | ||
3363 | status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1); | ||
3364 | |||
3365 | /* GPIO2 is not available */ | ||
3366 | |||
3367 | if (GPIO_Num == 3) { | ||
3368 | if (GPIO_Val == 1) { | ||
3369 | status += MXL_ControlWrite(fe, GPIO_3, 0); | ||
3370 | status += MXL_ControlWrite(fe, GPIO_3B, 0); | ||
3371 | } | ||
3372 | if (GPIO_Val == 0) { | ||
3373 | status += MXL_ControlWrite(fe, GPIO_3, 1); | ||
3374 | status += MXL_ControlWrite(fe, GPIO_3B, 1); | ||
3375 | } | ||
3376 | if (GPIO_Val == 3) { /* tri-state */ | ||
3377 | status += MXL_ControlWrite(fe, GPIO_3, 0); | ||
3378 | status += MXL_ControlWrite(fe, GPIO_3B, 1); | ||
3379 | } | ||
3380 | } | ||
3381 | if (GPIO_Num == 4) { | ||
3382 | if (GPIO_Val == 1) { | ||
3383 | status += MXL_ControlWrite(fe, GPIO_4, 0); | ||
3384 | status += MXL_ControlWrite(fe, GPIO_4B, 0); | ||
3385 | } | ||
3386 | if (GPIO_Val == 0) { | ||
3387 | status += MXL_ControlWrite(fe, GPIO_4, 1); | ||
3388 | status += MXL_ControlWrite(fe, GPIO_4B, 1); | ||
3389 | } | ||
3390 | if (GPIO_Val == 3) { /* tri-state */ | ||
3391 | status += MXL_ControlWrite(fe, GPIO_4, 0); | ||
3392 | status += MXL_ControlWrite(fe, GPIO_4B, 1); | ||
3393 | } | ||
3394 | } | ||
3395 | |||
3396 | return status; | ||
3397 | } | ||
3398 | |||
3399 | static u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value) | ||
3400 | { | ||
3401 | u16 status = 0; | ||
3402 | |||
3403 | /* Will write ALL Matching Control Name */ | ||
3404 | /* Write Matching INIT Control */ | ||
3405 | status += MXL_ControlWrite_Group(fe, ControlNum, value, 1); | ||
3406 | /* Write Matching CH Control */ | ||
3407 | status += MXL_ControlWrite_Group(fe, ControlNum, value, 2); | ||
3408 | #ifdef _MXL_INTERNAL | ||
3409 | /* Write Matching MXL Control */ | ||
3410 | status += MXL_ControlWrite_Group(fe, ControlNum, value, 3); | ||
3411 | #endif | ||
3412 | return status; | ||
3413 | } | ||
3414 | |||
3415 | static u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, | ||
3416 | u32 value, u16 controlGroup) | ||
3417 | { | ||
3418 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3419 | u16 i, j, k; | ||
3420 | u32 highLimit; | ||
3421 | u32 ctrlVal; | ||
3422 | |||
3423 | if (controlGroup == 1) /* Initial Control */ { | ||
3424 | |||
3425 | for (i = 0; i < state->Init_Ctrl_Num; i++) { | ||
3426 | |||
3427 | if (controlNum == state->Init_Ctrl[i].Ctrl_Num) { | ||
3428 | |||
3429 | highLimit = 1 << state->Init_Ctrl[i].size; | ||
3430 | if (value < highLimit) { | ||
3431 | for (j = 0; j < state->Init_Ctrl[i].size; j++) { | ||
3432 | state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01); | ||
3433 | MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]), | ||
3434 | (u8)(state->Init_Ctrl[i].bit[j]), | ||
3435 | (u8)((value>>j) & 0x01)); | ||
3436 | } | ||
3437 | ctrlVal = 0; | ||
3438 | for (k = 0; k < state->Init_Ctrl[i].size; k++) | ||
3439 | ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k); | ||
3440 | } else | ||
3441 | return -1; | ||
3442 | } | ||
3443 | } | ||
3444 | } | ||
3445 | if (controlGroup == 2) /* Chan change Control */ { | ||
3446 | |||
3447 | for (i = 0; i < state->CH_Ctrl_Num; i++) { | ||
3448 | |||
3449 | if (controlNum == state->CH_Ctrl[i].Ctrl_Num) { | ||
3450 | |||
3451 | highLimit = 1 << state->CH_Ctrl[i].size; | ||
3452 | if (value < highLimit) { | ||
3453 | for (j = 0; j < state->CH_Ctrl[i].size; j++) { | ||
3454 | state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01); | ||
3455 | MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]), | ||
3456 | (u8)(state->CH_Ctrl[i].bit[j]), | ||
3457 | (u8)((value>>j) & 0x01)); | ||
3458 | } | ||
3459 | ctrlVal = 0; | ||
3460 | for (k = 0; k < state->CH_Ctrl[i].size; k++) | ||
3461 | ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k); | ||
3462 | } else | ||
3463 | return -1; | ||
3464 | } | ||
3465 | } | ||
3466 | } | ||
3467 | #ifdef _MXL_INTERNAL | ||
3468 | if (controlGroup == 3) /* Maxlinear Control */ { | ||
3469 | |||
3470 | for (i = 0; i < state->MXL_Ctrl_Num; i++) { | ||
3471 | |||
3472 | if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) { | ||
3473 | |||
3474 | highLimit = (1 << state->MXL_Ctrl[i].size); | ||
3475 | if (value < highLimit) { | ||
3476 | for (j = 0; j < state->MXL_Ctrl[i].size; j++) { | ||
3477 | state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01); | ||
3478 | MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]), | ||
3479 | (u8)(state->MXL_Ctrl[i].bit[j]), | ||
3480 | (u8)((value>>j) & 0x01)); | ||
3481 | } | ||
3482 | ctrlVal = 0; | ||
3483 | for (k = 0; k < state->MXL_Ctrl[i].size; k++) | ||
3484 | ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k); | ||
3485 | } else | ||
3486 | return -1; | ||
3487 | } | ||
3488 | } | ||
3489 | } | ||
3490 | #endif | ||
3491 | return 0 ; /* successful return */ | ||
3492 | } | ||
3493 | |||
3494 | static u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal) | ||
3495 | { | ||
3496 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3497 | int i ; | ||
3498 | |||
3499 | for (i = 0; i < 104; i++) { | ||
3500 | if (RegNum == state->TunerRegs[i].Reg_Num) { | ||
3501 | *RegVal = (u8)(state->TunerRegs[i].Reg_Val); | ||
3502 | return 0; | ||
3503 | } | ||
3504 | } | ||
3505 | |||
3506 | return 1; | ||
3507 | } | ||
3508 | |||
3509 | static u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value) | ||
3510 | { | ||
3511 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3512 | u32 ctrlVal ; | ||
3513 | u16 i, k ; | ||
3514 | |||
3515 | for (i = 0; i < state->Init_Ctrl_Num ; i++) { | ||
3516 | |||
3517 | if (controlNum == state->Init_Ctrl[i].Ctrl_Num) { | ||
3518 | |||
3519 | ctrlVal = 0; | ||
3520 | for (k = 0; k < state->Init_Ctrl[i].size; k++) | ||
3521 | ctrlVal += state->Init_Ctrl[i].val[k] * (1<<k); | ||
3522 | *value = ctrlVal; | ||
3523 | return 0; | ||
3524 | } | ||
3525 | } | ||
3526 | |||
3527 | for (i = 0; i < state->CH_Ctrl_Num ; i++) { | ||
3528 | |||
3529 | if (controlNum == state->CH_Ctrl[i].Ctrl_Num) { | ||
3530 | |||
3531 | ctrlVal = 0; | ||
3532 | for (k = 0; k < state->CH_Ctrl[i].size; k++) | ||
3533 | ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k); | ||
3534 | *value = ctrlVal; | ||
3535 | return 0; | ||
3536 | |||
3537 | } | ||
3538 | } | ||
3539 | |||
3540 | #ifdef _MXL_INTERNAL | ||
3541 | for (i = 0; i < state->MXL_Ctrl_Num ; i++) { | ||
3542 | |||
3543 | if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) { | ||
3544 | |||
3545 | ctrlVal = 0; | ||
3546 | for (k = 0; k < state->MXL_Ctrl[i].size; k++) | ||
3547 | ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k); | ||
3548 | *value = ctrlVal; | ||
3549 | return 0; | ||
3550 | |||
3551 | } | ||
3552 | } | ||
3553 | #endif | ||
3554 | return 1; | ||
3555 | } | ||
3556 | |||
3557 | static void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, | ||
3558 | u8 bitVal) | ||
3559 | { | ||
3560 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3561 | int i ; | ||
3562 | |||
3563 | const u8 AND_MAP[8] = { | ||
3564 | 0xFE, 0xFD, 0xFB, 0xF7, | ||
3565 | 0xEF, 0xDF, 0xBF, 0x7F } ; | ||
3566 | |||
3567 | const u8 OR_MAP[8] = { | ||
3568 | 0x01, 0x02, 0x04, 0x08, | ||
3569 | 0x10, 0x20, 0x40, 0x80 } ; | ||
3570 | |||
3571 | for (i = 0; i < state->TunerRegs_Num; i++) { | ||
3572 | if (state->TunerRegs[i].Reg_Num == address) { | ||
3573 | if (bitVal) | ||
3574 | state->TunerRegs[i].Reg_Val |= OR_MAP[bit]; | ||
3575 | else | ||
3576 | state->TunerRegs[i].Reg_Val &= AND_MAP[bit]; | ||
3577 | break ; | ||
3578 | } | ||
3579 | } | ||
3580 | } | ||
3581 | |||
3582 | static u32 MXL_Ceiling(u32 value, u32 resolution) | ||
3583 | { | ||
3584 | return (value/resolution + (value % resolution > 0 ? 1 : 0)); | ||
3585 | } | ||
3586 | |||
3587 | /* Retrieve the Initialzation Registers */ | ||
3588 | static u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 *RegNum, | ||
3589 | u8 *RegVal, int *count) | ||
3590 | { | ||
3591 | u16 status = 0; | ||
3592 | int i ; | ||
3593 | |||
3594 | u8 RegAddr[] = { | ||
3595 | 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73, | ||
3596 | 76, 77, 91, 134, 135, 137, 147, | ||
3597 | 156, 166, 167, 168, 25 }; | ||
3598 | |||
3599 | *count = sizeof(RegAddr) / sizeof(u8); | ||
3600 | |||
3601 | status += MXL_BlockInit(fe); | ||
3602 | |||
3603 | for (i = 0 ; i < *count; i++) { | ||
3604 | RegNum[i] = RegAddr[i]; | ||
3605 | status += MXL_RegRead(fe, RegNum[i], &RegVal[i]); | ||
3606 | } | ||
3607 | |||
3608 | return status; | ||
3609 | } | ||
3610 | |||
3611 | static u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, | ||
3612 | int *count) | ||
3613 | { | ||
3614 | u16 status = 0; | ||
3615 | int i ; | ||
3616 | |||
3617 | /* add 77, 166, 167, 168 register for 2.6.12 */ | ||
3618 | #ifdef _MXL_PRODUCTION | ||
3619 | u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106, | ||
3620 | 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ; | ||
3621 | #else | ||
3622 | u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106, | ||
3623 | 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ; | ||
3624 | /* | ||
3625 | u8 RegAddr[171]; | ||
3626 | for (i = 0; i <= 170; i++) | ||
3627 | RegAddr[i] = i; | ||
3628 | */ | ||
3629 | #endif | ||
3630 | |||
3631 | *count = sizeof(RegAddr) / sizeof(u8); | ||
3632 | |||
3633 | for (i = 0 ; i < *count; i++) { | ||
3634 | RegNum[i] = RegAddr[i]; | ||
3635 | status += MXL_RegRead(fe, RegNum[i], &RegVal[i]); | ||
3636 | } | ||
3637 | |||
3638 | return status; | ||
3639 | } | ||
3640 | |||
3641 | static u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, | ||
3642 | u8 *RegVal, int *count) | ||
3643 | { | ||
3644 | u16 status = 0; | ||
3645 | int i; | ||
3646 | |||
3647 | u8 RegAddr[] = {43, 136}; | ||
3648 | |||
3649 | *count = sizeof(RegAddr) / sizeof(u8); | ||
3650 | |||
3651 | for (i = 0; i < *count; i++) { | ||
3652 | RegNum[i] = RegAddr[i]; | ||
3653 | status += MXL_RegRead(fe, RegNum[i], &RegVal[i]); | ||
3654 | } | ||
3655 | |||
3656 | return status; | ||
3657 | } | ||
3658 | |||
3659 | static u16 MXL_GetMasterControl(u8 *MasterReg, int state) | ||
3660 | { | ||
3661 | if (state == 1) /* Load_Start */ | ||
3662 | *MasterReg = 0xF3; | ||
3663 | if (state == 2) /* Power_Down */ | ||
3664 | *MasterReg = 0x41; | ||
3665 | if (state == 3) /* Synth_Reset */ | ||
3666 | *MasterReg = 0xB1; | ||
3667 | if (state == 4) /* Seq_Off */ | ||
3668 | *MasterReg = 0xF1; | ||
3669 | |||
3670 | return 0; | ||
3671 | } | ||
3672 | |||
3673 | #ifdef _MXL_PRODUCTION | ||
3674 | static u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range) | ||
3675 | { | ||
3676 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3677 | u16 status = 0 ; | ||
3678 | |||
3679 | if (VCO_Range == 1) { | ||
3680 | status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1); | ||
3681 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
3682 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
3683 | status += MXL_ControlWrite(fe, RFSYN_DIVM, 1); | ||
3684 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
3685 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
3686 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
3687 | if (state->Mode == 0 && state->IF_Mode == 1) { | ||
3688 | /* Analog Low IF Mode */ | ||
3689 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3690 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3691 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56); | ||
3692 | status += MXL_ControlWrite(fe, | ||
3693 | CHCAL_FRAC_MOD_RF, 180224); | ||
3694 | } | ||
3695 | if (state->Mode == 0 && state->IF_Mode == 0) { | ||
3696 | /* Analog Zero IF Mode */ | ||
3697 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3698 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3699 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56); | ||
3700 | status += MXL_ControlWrite(fe, | ||
3701 | CHCAL_FRAC_MOD_RF, 222822); | ||
3702 | } | ||
3703 | if (state->Mode == 1) /* Digital Mode */ { | ||
3704 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3705 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3706 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56); | ||
3707 | status += MXL_ControlWrite(fe, | ||
3708 | CHCAL_FRAC_MOD_RF, 229376); | ||
3709 | } | ||
3710 | } | ||
3711 | |||
3712 | if (VCO_Range == 2) { | ||
3713 | status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1); | ||
3714 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
3715 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
3716 | status += MXL_ControlWrite(fe, RFSYN_DIVM, 1); | ||
3717 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
3718 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
3719 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
3720 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3721 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3722 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41); | ||
3723 | if (state->Mode == 0 && state->IF_Mode == 1) { | ||
3724 | /* Analog Low IF Mode */ | ||
3725 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3726 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3727 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42); | ||
3728 | status += MXL_ControlWrite(fe, | ||
3729 | CHCAL_FRAC_MOD_RF, 206438); | ||
3730 | } | ||
3731 | if (state->Mode == 0 && state->IF_Mode == 0) { | ||
3732 | /* Analog Zero IF Mode */ | ||
3733 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3734 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3735 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42); | ||
3736 | status += MXL_ControlWrite(fe, | ||
3737 | CHCAL_FRAC_MOD_RF, 206438); | ||
3738 | } | ||
3739 | if (state->Mode == 1) /* Digital Mode */ { | ||
3740 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1); | ||
3741 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3742 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41); | ||
3743 | status += MXL_ControlWrite(fe, | ||
3744 | CHCAL_FRAC_MOD_RF, 16384); | ||
3745 | } | ||
3746 | } | ||
3747 | |||
3748 | if (VCO_Range == 3) { | ||
3749 | status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1); | ||
3750 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
3751 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
3752 | status += MXL_ControlWrite(fe, RFSYN_DIVM, 1); | ||
3753 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
3754 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
3755 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
3756 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3757 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3758 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42); | ||
3759 | if (state->Mode == 0 && state->IF_Mode == 1) { | ||
3760 | /* Analog Low IF Mode */ | ||
3761 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3762 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3763 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44); | ||
3764 | status += MXL_ControlWrite(fe, | ||
3765 | CHCAL_FRAC_MOD_RF, 173670); | ||
3766 | } | ||
3767 | if (state->Mode == 0 && state->IF_Mode == 0) { | ||
3768 | /* Analog Zero IF Mode */ | ||
3769 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3770 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3771 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44); | ||
3772 | status += MXL_ControlWrite(fe, | ||
3773 | CHCAL_FRAC_MOD_RF, 173670); | ||
3774 | } | ||
3775 | if (state->Mode == 1) /* Digital Mode */ { | ||
3776 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3777 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8); | ||
3778 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42); | ||
3779 | status += MXL_ControlWrite(fe, | ||
3780 | CHCAL_FRAC_MOD_RF, 245760); | ||
3781 | } | ||
3782 | } | ||
3783 | |||
3784 | if (VCO_Range == 4) { | ||
3785 | status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1); | ||
3786 | status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0); | ||
3787 | status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0); | ||
3788 | status += MXL_ControlWrite(fe, RFSYN_DIVM, 1); | ||
3789 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1); | ||
3790 | status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1); | ||
3791 | status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0); | ||
3792 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3793 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3794 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27); | ||
3795 | if (state->Mode == 0 && state->IF_Mode == 1) { | ||
3796 | /* Analog Low IF Mode */ | ||
3797 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3798 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3799 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27); | ||
3800 | status += MXL_ControlWrite(fe, | ||
3801 | CHCAL_FRAC_MOD_RF, 206438); | ||
3802 | } | ||
3803 | if (state->Mode == 0 && state->IF_Mode == 0) { | ||
3804 | /* Analog Zero IF Mode */ | ||
3805 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3806 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3807 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27); | ||
3808 | status += MXL_ControlWrite(fe, | ||
3809 | CHCAL_FRAC_MOD_RF, 206438); | ||
3810 | } | ||
3811 | if (state->Mode == 1) /* Digital Mode */ { | ||
3812 | status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0); | ||
3813 | status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40); | ||
3814 | status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27); | ||
3815 | status += MXL_ControlWrite(fe, | ||
3816 | CHCAL_FRAC_MOD_RF, 212992); | ||
3817 | } | ||
3818 | } | ||
3819 | |||
3820 | return status; | ||
3821 | } | ||
3822 | |||
3823 | static u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis) | ||
3824 | { | ||
3825 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3826 | u16 status = 0; | ||
3827 | |||
3828 | if (Hystersis == 1) | ||
3829 | status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1); | ||
3830 | |||
3831 | return status; | ||
3832 | } | ||
3833 | #endif | ||
3834 | /* End: Reference driver code found in the Realtek driver that | ||
3835 | * is copyright MaxLinear */ | ||
3836 | |||
3837 | /* ---------------------------------------------------------------- | ||
3838 | * Begin: Everything after here is new code to adapt the | ||
3839 | * proprietary Realtek driver into a Linux API tuner. | ||
3840 | * Copyright (C) 2008 Steven Toth <stoth@hauppauge.com> | ||
3841 | */ | ||
3842 | static int mxl5005s_reset(struct dvb_frontend *fe) | ||
3843 | { | ||
3844 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3845 | int ret = 0; | ||
3846 | |||
3847 | u8 buf[2] = { 0xff, 0x00 }; | ||
3848 | struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0, | ||
3849 | .buf = buf, .len = 2 }; | ||
3850 | |||
3851 | dprintk(2, "%s()\n", __func__); | ||
3852 | |||
3853 | if (fe->ops.i2c_gate_ctrl) | ||
3854 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
3855 | |||
3856 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { | ||
3857 | printk(KERN_WARNING "mxl5005s I2C reset failed\n"); | ||
3858 | ret = -EREMOTEIO; | ||
3859 | } | ||
3860 | |||
3861 | if (fe->ops.i2c_gate_ctrl) | ||
3862 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
3863 | |||
3864 | return ret; | ||
3865 | } | ||
3866 | |||
3867 | /* Write a single byte to a single reg, latch the value if required by | ||
3868 | * following the transaction with the latch byte. | ||
3869 | */ | ||
3870 | static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch) | ||
3871 | { | ||
3872 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3873 | u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE }; | ||
3874 | struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0, | ||
3875 | .buf = buf, .len = 3 }; | ||
3876 | |||
3877 | if (latch == 0) | ||
3878 | msg.len = 2; | ||
3879 | |||
3880 | dprintk(2, "%s(0x%x, 0x%x, 0x%x)\n", __func__, reg, val, msg.addr); | ||
3881 | |||
3882 | if (i2c_transfer(state->i2c, &msg, 1) != 1) { | ||
3883 | printk(KERN_WARNING "mxl5005s I2C write failed\n"); | ||
3884 | return -EREMOTEIO; | ||
3885 | } | ||
3886 | return 0; | ||
3887 | } | ||
3888 | |||
3889 | static int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable, | ||
3890 | u8 *datatable, u8 len) | ||
3891 | { | ||
3892 | int ret = 0, i; | ||
3893 | |||
3894 | if (fe->ops.i2c_gate_ctrl) | ||
3895 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
3896 | |||
3897 | for (i = 0 ; i < len-1; i++) { | ||
3898 | ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0); | ||
3899 | if (ret < 0) | ||
3900 | break; | ||
3901 | } | ||
3902 | |||
3903 | ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1); | ||
3904 | |||
3905 | if (fe->ops.i2c_gate_ctrl) | ||
3906 | fe->ops.i2c_gate_ctrl(fe, 0); | ||
3907 | |||
3908 | return ret; | ||
3909 | } | ||
3910 | |||
3911 | static int mxl5005s_init(struct dvb_frontend *fe) | ||
3912 | { | ||
3913 | dprintk(1, "%s()\n", __func__); | ||
3914 | return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ); | ||
3915 | } | ||
3916 | |||
3917 | static int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, | ||
3918 | u32 bandwidth) | ||
3919 | { | ||
3920 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3921 | |||
3922 | u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX]; | ||
3923 | u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX]; | ||
3924 | int TableLen; | ||
3925 | |||
3926 | dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth); | ||
3927 | |||
3928 | mxl5005s_reset(fe); | ||
3929 | |||
3930 | /* Tuner initialization stage 0 */ | ||
3931 | MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET); | ||
3932 | AddrTable[0] = MASTER_CONTROL_ADDR; | ||
3933 | ByteTable[0] |= state->config->AgcMasterByte; | ||
3934 | |||
3935 | mxl5005s_writeregs(fe, AddrTable, ByteTable, 1); | ||
3936 | |||
3937 | mxl5005s_AssignTunerMode(fe, mod_type, bandwidth); | ||
3938 | |||
3939 | /* Tuner initialization stage 1 */ | ||
3940 | MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen); | ||
3941 | |||
3942 | mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen); | ||
3943 | |||
3944 | return 0; | ||
3945 | } | ||
3946 | |||
3947 | static int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type, | ||
3948 | u32 bandwidth) | ||
3949 | { | ||
3950 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3951 | struct mxl5005s_config *c = state->config; | ||
3952 | |||
3953 | InitTunerControls(fe); | ||
3954 | |||
3955 | /* Set MxL5005S parameters. */ | ||
3956 | MXL5005_TunerConfig( | ||
3957 | fe, | ||
3958 | c->mod_mode, | ||
3959 | c->if_mode, | ||
3960 | bandwidth, | ||
3961 | c->if_freq, | ||
3962 | c->xtal_freq, | ||
3963 | c->agc_mode, | ||
3964 | c->top, | ||
3965 | c->output_load, | ||
3966 | c->clock_out, | ||
3967 | c->div_out, | ||
3968 | c->cap_select, | ||
3969 | c->rssi_enable, | ||
3970 | mod_type, | ||
3971 | c->tracking_filter); | ||
3972 | |||
3973 | return 0; | ||
3974 | } | ||
3975 | |||
3976 | static int mxl5005s_set_params(struct dvb_frontend *fe, | ||
3977 | struct dvb_frontend_parameters *params) | ||
3978 | { | ||
3979 | struct mxl5005s_state *state = fe->tuner_priv; | ||
3980 | u32 req_mode, req_bw = 0; | ||
3981 | int ret; | ||
3982 | |||
3983 | dprintk(1, "%s()\n", __func__); | ||
3984 | |||
3985 | if (fe->ops.info.type == FE_ATSC) { | ||
3986 | switch (params->u.vsb.modulation) { | ||
3987 | case VSB_8: | ||
3988 | req_mode = MXL_ATSC; break; | ||
3989 | default: | ||
3990 | case QAM_64: | ||
3991 | case QAM_256: | ||
3992 | case QAM_AUTO: | ||
3993 | req_mode = MXL_QAM; break; | ||
3994 | } | ||
3995 | } else | ||
3996 | req_mode = MXL_DVBT; | ||
3997 | |||
3998 | /* Change tuner for new modulation type if reqd */ | ||
3999 | if (req_mode != state->current_mode) { | ||
4000 | switch (req_mode) { | ||
4001 | case VSB_8: | ||
4002 | case QAM_64: | ||
4003 | case QAM_256: | ||
4004 | case QAM_AUTO: | ||
4005 | req_bw = MXL5005S_BANDWIDTH_6MHZ; | ||
4006 | break; | ||
4007 | default: | ||
4008 | /* Assume DVB-T */ | ||
4009 | switch (params->u.ofdm.bandwidth) { | ||
4010 | case BANDWIDTH_6_MHZ: | ||
4011 | req_bw = MXL5005S_BANDWIDTH_6MHZ; | ||
4012 | break; | ||
4013 | case BANDWIDTH_7_MHZ: | ||
4014 | req_bw = MXL5005S_BANDWIDTH_7MHZ; | ||
4015 | break; | ||
4016 | case BANDWIDTH_AUTO: | ||
4017 | case BANDWIDTH_8_MHZ: | ||
4018 | req_bw = MXL5005S_BANDWIDTH_8MHZ; | ||
4019 | break; | ||
4020 | } | ||
4021 | } | ||
4022 | |||
4023 | state->current_mode = req_mode; | ||
4024 | ret = mxl5005s_reconfigure(fe, req_mode, req_bw); | ||
4025 | |||
4026 | } else | ||
4027 | ret = 0; | ||
4028 | |||
4029 | if (ret == 0) { | ||
4030 | dprintk(1, "%s() freq=%d\n", __func__, params->frequency); | ||
4031 | ret = mxl5005s_SetRfFreqHz(fe, params->frequency); | ||
4032 | } | ||
4033 | |||
4034 | return ret; | ||
4035 | } | ||
4036 | |||
4037 | static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency) | ||
4038 | { | ||
4039 | struct mxl5005s_state *state = fe->tuner_priv; | ||
4040 | dprintk(1, "%s()\n", __func__); | ||
4041 | |||
4042 | *frequency = state->RF_IN; | ||
4043 | |||
4044 | return 0; | ||
4045 | } | ||
4046 | |||
4047 | static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) | ||
4048 | { | ||
4049 | struct mxl5005s_state *state = fe->tuner_priv; | ||
4050 | dprintk(1, "%s()\n", __func__); | ||
4051 | |||
4052 | *bandwidth = state->Chan_Bandwidth; | ||
4053 | |||
4054 | return 0; | ||
4055 | } | ||
4056 | |||
4057 | static int mxl5005s_release(struct dvb_frontend *fe) | ||
4058 | { | ||
4059 | dprintk(1, "%s()\n", __func__); | ||
4060 | kfree(fe->tuner_priv); | ||
4061 | fe->tuner_priv = NULL; | ||
4062 | return 0; | ||
4063 | } | ||
4064 | |||
4065 | static const struct dvb_tuner_ops mxl5005s_tuner_ops = { | ||
4066 | .info = { | ||
4067 | .name = "MaxLinear MXL5005S", | ||
4068 | .frequency_min = 48000000, | ||
4069 | .frequency_max = 860000000, | ||
4070 | .frequency_step = 50000, | ||
4071 | }, | ||
4072 | |||
4073 | .release = mxl5005s_release, | ||
4074 | .init = mxl5005s_init, | ||
4075 | |||
4076 | .set_params = mxl5005s_set_params, | ||
4077 | .get_frequency = mxl5005s_get_frequency, | ||
4078 | .get_bandwidth = mxl5005s_get_bandwidth, | ||
4079 | }; | ||
4080 | |||
4081 | struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe, | ||
4082 | struct i2c_adapter *i2c, | ||
4083 | struct mxl5005s_config *config) | ||
4084 | { | ||
4085 | struct mxl5005s_state *state = NULL; | ||
4086 | dprintk(1, "%s()\n", __func__); | ||
4087 | |||
4088 | state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL); | ||
4089 | if (state == NULL) | ||
4090 | return NULL; | ||
4091 | |||
4092 | state->frontend = fe; | ||
4093 | state->config = config; | ||
4094 | state->i2c = i2c; | ||
4095 | state->current_mode = MXL_QAM; | ||
4096 | |||
4097 | printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n", | ||
4098 | config->i2c_address); | ||
4099 | |||
4100 | memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops, | ||
4101 | sizeof(struct dvb_tuner_ops)); | ||
4102 | |||
4103 | fe->tuner_priv = state; | ||
4104 | return fe; | ||
4105 | } | ||
4106 | EXPORT_SYMBOL(mxl5005s_attach); | ||
4107 | |||
4108 | MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver"); | ||
4109 | MODULE_AUTHOR("Steven Toth"); | ||
4110 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/media/common/tuners/mxl5005s.h b/drivers/media/common/tuners/mxl5005s.h new file mode 100644 index 000000000000..396db150bf0c --- /dev/null +++ b/drivers/media/common/tuners/mxl5005s.h | |||
@@ -0,0 +1,131 @@ | |||
1 | /* | ||
2 | MaxLinear MXL5005S VSB/QAM/DVBT tuner driver | ||
3 | |||
4 | Copyright (C) 2008 MaxLinear | ||
5 | Copyright (C) 2008 Steven Toth <stoth@hauppauge.com> | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU 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., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
20 | |||
21 | */ | ||
22 | |||
23 | #ifndef __MXL5005S_H | ||
24 | #define __MXL5005S_H | ||
25 | |||
26 | #include <linux/i2c.h> | ||
27 | #include "dvb_frontend.h" | ||
28 | |||
29 | struct mxl5005s_config { | ||
30 | |||
31 | /* 7 bit i2c address */ | ||
32 | u8 i2c_address; | ||
33 | |||
34 | #define IF_FREQ_4570000HZ 4570000 | ||
35 | #define IF_FREQ_4571429HZ 4571429 | ||
36 | #define IF_FREQ_5380000HZ 5380000 | ||
37 | #define IF_FREQ_36000000HZ 36000000 | ||
38 | #define IF_FREQ_36125000HZ 36125000 | ||
39 | #define IF_FREQ_36166667HZ 36166667 | ||
40 | #define IF_FREQ_44000000HZ 44000000 | ||
41 | u32 if_freq; | ||
42 | |||
43 | #define CRYSTAL_FREQ_4000000HZ 4000000 | ||
44 | #define CRYSTAL_FREQ_16000000HZ 16000000 | ||
45 | #define CRYSTAL_FREQ_25000000HZ 25000000 | ||
46 | #define CRYSTAL_FREQ_28800000HZ 28800000 | ||
47 | u32 xtal_freq; | ||
48 | |||
49 | #define MXL_DUAL_AGC 0 | ||
50 | #define MXL_SINGLE_AGC 1 | ||
51 | u8 agc_mode; | ||
52 | |||
53 | #define MXL_TF_DEFAULT 0 | ||
54 | #define MXL_TF_OFF 1 | ||
55 | #define MXL_TF_C 2 | ||
56 | #define MXL_TF_C_H 3 | ||
57 | #define MXL_TF_D 4 | ||
58 | #define MXL_TF_D_L 5 | ||
59 | #define MXL_TF_E 6 | ||
60 | #define MXL_TF_F 7 | ||
61 | #define MXL_TF_E_2 8 | ||
62 | #define MXL_TF_E_NA 9 | ||
63 | #define MXL_TF_G 10 | ||
64 | u8 tracking_filter; | ||
65 | |||
66 | #define MXL_RSSI_DISABLE 0 | ||
67 | #define MXL_RSSI_ENABLE 1 | ||
68 | u8 rssi_enable; | ||
69 | |||
70 | #define MXL_CAP_SEL_DISABLE 0 | ||
71 | #define MXL_CAP_SEL_ENABLE 1 | ||
72 | u8 cap_select; | ||
73 | |||
74 | #define MXL_DIV_OUT_1 0 | ||
75 | #define MXL_DIV_OUT_4 1 | ||
76 | u8 div_out; | ||
77 | |||
78 | #define MXL_CLOCK_OUT_DISABLE 0 | ||
79 | #define MXL_CLOCK_OUT_ENABLE 1 | ||
80 | u8 clock_out; | ||
81 | |||
82 | #define MXL5005S_IF_OUTPUT_LOAD_200_OHM 200 | ||
83 | #define MXL5005S_IF_OUTPUT_LOAD_300_OHM 300 | ||
84 | u32 output_load; | ||
85 | |||
86 | #define MXL5005S_TOP_5P5 55 | ||
87 | #define MXL5005S_TOP_7P2 72 | ||
88 | #define MXL5005S_TOP_9P2 92 | ||
89 | #define MXL5005S_TOP_11P0 110 | ||
90 | #define MXL5005S_TOP_12P9 129 | ||
91 | #define MXL5005S_TOP_14P7 147 | ||
92 | #define MXL5005S_TOP_16P8 168 | ||
93 | #define MXL5005S_TOP_19P4 194 | ||
94 | #define MXL5005S_TOP_21P2 212 | ||
95 | #define MXL5005S_TOP_23P2 232 | ||
96 | #define MXL5005S_TOP_25P2 252 | ||
97 | #define MXL5005S_TOP_27P1 271 | ||
98 | #define MXL5005S_TOP_29P2 292 | ||
99 | #define MXL5005S_TOP_31P7 317 | ||
100 | #define MXL5005S_TOP_34P9 349 | ||
101 | u32 top; | ||
102 | |||
103 | #define MXL_ANALOG_MODE 0 | ||
104 | #define MXL_DIGITAL_MODE 1 | ||
105 | u8 mod_mode; | ||
106 | |||
107 | #define MXL_ZERO_IF 0 | ||
108 | #define MXL_LOW_IF 1 | ||
109 | u8 if_mode; | ||
110 | |||
111 | /* Stuff I don't know what to do with */ | ||
112 | u8 AgcMasterByte; | ||
113 | }; | ||
114 | |||
115 | #if defined(CONFIG_MEDIA_TUNER_MXL5005S) || \ | ||
116 | (defined(CONFIG_MEDIA_TUNER_MXL5005S_MODULE) && defined(MODULE)) | ||
117 | extern struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe, | ||
118 | struct i2c_adapter *i2c, | ||
119 | struct mxl5005s_config *config); | ||
120 | #else | ||
121 | static inline struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe, | ||
122 | struct i2c_adapter *i2c, | ||
123 | struct mxl5005s_config *config) | ||
124 | { | ||
125 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | ||
126 | return NULL; | ||
127 | } | ||
128 | #endif /* CONFIG_DVB_TUNER_MXL5005S */ | ||
129 | |||
130 | #endif /* __MXL5005S_H */ | ||
131 | |||
diff --git a/drivers/media/common/tuners/tda18271-common.c b/drivers/media/common/tuners/tda18271-common.c index e27a7620a32f..42b5f5d4bfe6 100644 --- a/drivers/media/common/tuners/tda18271-common.c +++ b/drivers/media/common/tuners/tda18271-common.c | |||
@@ -227,9 +227,8 @@ int tda18271_charge_pump_source(struct dvb_frontend *fe, | |||
227 | 227 | ||
228 | regs[r_cp] &= ~0x20; | 228 | regs[r_cp] &= ~0x20; |
229 | regs[r_cp] |= ((force & 1) << 5); | 229 | regs[r_cp] |= ((force & 1) << 5); |
230 | tda18271_write_regs(fe, r_cp, 1); | ||
231 | 230 | ||
232 | return 0; | 231 | return tda18271_write_regs(fe, r_cp, 1); |
233 | } | 232 | } |
234 | 233 | ||
235 | int tda18271_init_regs(struct dvb_frontend *fe) | 234 | int tda18271_init_regs(struct dvb_frontend *fe) |
@@ -487,16 +486,15 @@ int tda18271_set_standby_mode(struct dvb_frontend *fe, | |||
487 | struct tda18271_priv *priv = fe->tuner_priv; | 486 | struct tda18271_priv *priv = fe->tuner_priv; |
488 | unsigned char *regs = priv->tda18271_regs; | 487 | unsigned char *regs = priv->tda18271_regs; |
489 | 488 | ||
490 | tda_dbg("sm = %d, sm_lt = %d, sm_xt = %d\n", sm, sm_lt, sm_xt); | 489 | if (tda18271_debug & DBG_ADV) |
490 | tda_dbg("sm = %d, sm_lt = %d, sm_xt = %d\n", sm, sm_lt, sm_xt); | ||
491 | 491 | ||
492 | regs[R_EP3] &= ~0xe0; /* clear sm, sm_lt, sm_xt */ | 492 | regs[R_EP3] &= ~0xe0; /* clear sm, sm_lt, sm_xt */ |
493 | regs[R_EP3] |= sm ? (1 << 7) : 0 | | 493 | regs[R_EP3] |= sm ? (1 << 7) : 0 | |
494 | sm_lt ? (1 << 6) : 0 | | 494 | sm_lt ? (1 << 6) : 0 | |
495 | sm_xt ? (1 << 5) : 0; | 495 | sm_xt ? (1 << 5) : 0; |
496 | 496 | ||
497 | tda18271_write_regs(fe, R_EP3, 1); | 497 | return tda18271_write_regs(fe, R_EP3, 1); |
498 | |||
499 | return 0; | ||
500 | } | 498 | } |
501 | 499 | ||
502 | /*---------------------------------------------------------------------*/ | 500 | /*---------------------------------------------------------------------*/ |
@@ -510,7 +508,7 @@ int tda18271_calc_main_pll(struct dvb_frontend *fe, u32 freq) | |||
510 | u32 div; | 508 | u32 div; |
511 | 509 | ||
512 | int ret = tda18271_lookup_pll_map(fe, MAIN_PLL, &freq, &pd, &d); | 510 | int ret = tda18271_lookup_pll_map(fe, MAIN_PLL, &freq, &pd, &d); |
513 | if (ret < 0) | 511 | if (tda_fail(ret)) |
514 | goto fail; | 512 | goto fail; |
515 | 513 | ||
516 | regs[R_MPD] = (0x77 & pd); | 514 | regs[R_MPD] = (0x77 & pd); |
@@ -542,7 +540,7 @@ int tda18271_calc_cal_pll(struct dvb_frontend *fe, u32 freq) | |||
542 | u32 div; | 540 | u32 div; |
543 | 541 | ||
544 | int ret = tda18271_lookup_pll_map(fe, CAL_PLL, &freq, &pd, &d); | 542 | int ret = tda18271_lookup_pll_map(fe, CAL_PLL, &freq, &pd, &d); |
545 | if (ret < 0) | 543 | if (tda_fail(ret)) |
546 | goto fail; | 544 | goto fail; |
547 | 545 | ||
548 | regs[R_CPD] = pd; | 546 | regs[R_CPD] = pd; |
@@ -566,7 +564,7 @@ int tda18271_calc_bp_filter(struct dvb_frontend *fe, u32 *freq) | |||
566 | u8 val; | 564 | u8 val; |
567 | 565 | ||
568 | int ret = tda18271_lookup_map(fe, BP_FILTER, freq, &val); | 566 | int ret = tda18271_lookup_map(fe, BP_FILTER, freq, &val); |
569 | if (ret < 0) | 567 | if (tda_fail(ret)) |
570 | goto fail; | 568 | goto fail; |
571 | 569 | ||
572 | regs[R_EP1] &= ~0x07; /* clear bp filter bits */ | 570 | regs[R_EP1] &= ~0x07; /* clear bp filter bits */ |
@@ -583,7 +581,7 @@ int tda18271_calc_km(struct dvb_frontend *fe, u32 *freq) | |||
583 | u8 val; | 581 | u8 val; |
584 | 582 | ||
585 | int ret = tda18271_lookup_map(fe, RF_CAL_KMCO, freq, &val); | 583 | int ret = tda18271_lookup_map(fe, RF_CAL_KMCO, freq, &val); |
586 | if (ret < 0) | 584 | if (tda_fail(ret)) |
587 | goto fail; | 585 | goto fail; |
588 | 586 | ||
589 | regs[R_EB13] &= ~0x7c; /* clear k & m bits */ | 587 | regs[R_EB13] &= ~0x7c; /* clear k & m bits */ |
@@ -600,7 +598,7 @@ int tda18271_calc_rf_band(struct dvb_frontend *fe, u32 *freq) | |||
600 | u8 val; | 598 | u8 val; |
601 | 599 | ||
602 | int ret = tda18271_lookup_map(fe, RF_BAND, freq, &val); | 600 | int ret = tda18271_lookup_map(fe, RF_BAND, freq, &val); |
603 | if (ret < 0) | 601 | if (tda_fail(ret)) |
604 | goto fail; | 602 | goto fail; |
605 | 603 | ||
606 | regs[R_EP2] &= ~0xe0; /* clear rf band bits */ | 604 | regs[R_EP2] &= ~0xe0; /* clear rf band bits */ |
@@ -617,7 +615,7 @@ int tda18271_calc_gain_taper(struct dvb_frontend *fe, u32 *freq) | |||
617 | u8 val; | 615 | u8 val; |
618 | 616 | ||
619 | int ret = tda18271_lookup_map(fe, GAIN_TAPER, freq, &val); | 617 | int ret = tda18271_lookup_map(fe, GAIN_TAPER, freq, &val); |
620 | if (ret < 0) | 618 | if (tda_fail(ret)) |
621 | goto fail; | 619 | goto fail; |
622 | 620 | ||
623 | regs[R_EP2] &= ~0x1f; /* clear gain taper bits */ | 621 | regs[R_EP2] &= ~0x1f; /* clear gain taper bits */ |
@@ -634,7 +632,7 @@ int tda18271_calc_ir_measure(struct dvb_frontend *fe, u32 *freq) | |||
634 | u8 val; | 632 | u8 val; |
635 | 633 | ||
636 | int ret = tda18271_lookup_map(fe, IR_MEASURE, freq, &val); | 634 | int ret = tda18271_lookup_map(fe, IR_MEASURE, freq, &val); |
637 | if (ret < 0) | 635 | if (tda_fail(ret)) |
638 | goto fail; | 636 | goto fail; |
639 | 637 | ||
640 | regs[R_EP5] &= ~0x07; | 638 | regs[R_EP5] &= ~0x07; |
diff --git a/drivers/media/common/tuners/tda18271-fe.c b/drivers/media/common/tuners/tda18271-fe.c index b262100ae897..89c01fb1f859 100644 --- a/drivers/media/common/tuners/tda18271-fe.c +++ b/drivers/media/common/tuners/tda18271-fe.c | |||
@@ -51,6 +51,7 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
51 | { | 51 | { |
52 | struct tda18271_priv *priv = fe->tuner_priv; | 52 | struct tda18271_priv *priv = fe->tuner_priv; |
53 | unsigned char *regs = priv->tda18271_regs; | 53 | unsigned char *regs = priv->tda18271_regs; |
54 | int ret; | ||
54 | u32 N; | 55 | u32 N; |
55 | 56 | ||
56 | /* update TV broadcast parameters */ | 57 | /* update TV broadcast parameters */ |
@@ -85,7 +86,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
85 | /* update rf top / if top */ | 86 | /* update rf top / if top */ |
86 | regs[R_EB22] = 0x00; | 87 | regs[R_EB22] = 0x00; |
87 | regs[R_EB22] |= map->rfagc_top; | 88 | regs[R_EB22] |= map->rfagc_top; |
88 | tda18271_write_regs(fe, R_EB22, 1); | 89 | ret = tda18271_write_regs(fe, R_EB22, 1); |
90 | if (tda_fail(ret)) | ||
91 | goto fail; | ||
89 | 92 | ||
90 | /* --------------------------------------------------------------- */ | 93 | /* --------------------------------------------------------------- */ |
91 | 94 | ||
@@ -121,7 +124,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
121 | /* agc1 has priority on agc2 */ | 124 | /* agc1 has priority on agc2 */ |
122 | regs[R_EB1] &= ~0x01; | 125 | regs[R_EB1] &= ~0x01; |
123 | 126 | ||
124 | tda18271_write_regs(fe, R_EB1, 1); | 127 | ret = tda18271_write_regs(fe, R_EB1, 1); |
128 | if (tda_fail(ret)) | ||
129 | goto fail; | ||
125 | 130 | ||
126 | /* --------------------------------------------------------------- */ | 131 | /* --------------------------------------------------------------- */ |
127 | 132 | ||
@@ -141,7 +146,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
141 | break; | 146 | break; |
142 | } | 147 | } |
143 | 148 | ||
144 | tda18271_write_regs(fe, R_TM, 7); | 149 | ret = tda18271_write_regs(fe, R_TM, 7); |
150 | if (tda_fail(ret)) | ||
151 | goto fail; | ||
145 | 152 | ||
146 | /* force charge pump source */ | 153 | /* force charge pump source */ |
147 | charge_pump_source(fe, 1); | 154 | charge_pump_source(fe, 1); |
@@ -158,9 +165,9 @@ static int tda18271_channel_configuration(struct dvb_frontend *fe, | |||
158 | regs[R_EP3] &= ~0x04; | 165 | regs[R_EP3] &= ~0x04; |
159 | else | 166 | else |
160 | regs[R_EP3] |= 0x04; | 167 | regs[R_EP3] |= 0x04; |
161 | tda18271_write_regs(fe, R_EP3, 1); | 168 | ret = tda18271_write_regs(fe, R_EP3, 1); |
162 | 169 | fail: | |
163 | return 0; | 170 | return ret; |
164 | } | 171 | } |
165 | 172 | ||
166 | static int tda18271_read_thermometer(struct dvb_frontend *fe) | 173 | static int tda18271_read_thermometer(struct dvb_frontend *fe) |
@@ -213,11 +220,13 @@ static int tda18271c2_rf_tracking_filters_correction(struct dvb_frontend *fe, | |||
213 | struct tda18271_priv *priv = fe->tuner_priv; | 220 | struct tda18271_priv *priv = fe->tuner_priv; |
214 | struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state; | 221 | struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state; |
215 | unsigned char *regs = priv->tda18271_regs; | 222 | unsigned char *regs = priv->tda18271_regs; |
216 | int tm_current, rfcal_comp, approx, i; | 223 | int tm_current, rfcal_comp, approx, i, ret; |
217 | u8 dc_over_dt, rf_tab; | 224 | u8 dc_over_dt, rf_tab; |
218 | 225 | ||
219 | /* power up */ | 226 | /* power up */ |
220 | tda18271_set_standby_mode(fe, 0, 0, 0); | 227 | ret = tda18271_set_standby_mode(fe, 0, 0, 0); |
228 | if (tda_fail(ret)) | ||
229 | goto fail; | ||
221 | 230 | ||
222 | /* read die current temperature */ | 231 | /* read die current temperature */ |
223 | tm_current = tda18271_read_thermometer(fe); | 232 | tm_current = tda18271_read_thermometer(fe); |
@@ -228,8 +237,8 @@ static int tda18271c2_rf_tracking_filters_correction(struct dvb_frontend *fe, | |||
228 | rf_tab = regs[R_EB14]; | 237 | rf_tab = regs[R_EB14]; |
229 | 238 | ||
230 | i = tda18271_lookup_rf_band(fe, &freq, NULL); | 239 | i = tda18271_lookup_rf_band(fe, &freq, NULL); |
231 | if (i < 0) | 240 | if (tda_fail(i)) |
232 | return -EINVAL; | 241 | return i; |
233 | 242 | ||
234 | if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) { | 243 | if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) { |
235 | approx = map[i].rf_a1 * | 244 | approx = map[i].rf_a1 * |
@@ -250,35 +259,42 @@ static int tda18271c2_rf_tracking_filters_correction(struct dvb_frontend *fe, | |||
250 | rfcal_comp = dc_over_dt * (tm_current - priv->tm_rfcal); | 259 | rfcal_comp = dc_over_dt * (tm_current - priv->tm_rfcal); |
251 | 260 | ||
252 | regs[R_EB14] = approx + rfcal_comp; | 261 | regs[R_EB14] = approx + rfcal_comp; |
253 | tda18271_write_regs(fe, R_EB14, 1); | 262 | ret = tda18271_write_regs(fe, R_EB14, 1); |
254 | 263 | fail: | |
255 | return 0; | 264 | return ret; |
256 | } | 265 | } |
257 | 266 | ||
258 | static int tda18271_por(struct dvb_frontend *fe) | 267 | static int tda18271_por(struct dvb_frontend *fe) |
259 | { | 268 | { |
260 | struct tda18271_priv *priv = fe->tuner_priv; | 269 | struct tda18271_priv *priv = fe->tuner_priv; |
261 | unsigned char *regs = priv->tda18271_regs; | 270 | unsigned char *regs = priv->tda18271_regs; |
271 | int ret; | ||
262 | 272 | ||
263 | /* power up detector 1 */ | 273 | /* power up detector 1 */ |
264 | regs[R_EB12] &= ~0x20; | 274 | regs[R_EB12] &= ~0x20; |
265 | tda18271_write_regs(fe, R_EB12, 1); | 275 | ret = tda18271_write_regs(fe, R_EB12, 1); |
276 | if (tda_fail(ret)) | ||
277 | goto fail; | ||
266 | 278 | ||
267 | regs[R_EB18] &= ~0x80; /* turn agc1 loop on */ | 279 | regs[R_EB18] &= ~0x80; /* turn agc1 loop on */ |
268 | regs[R_EB18] &= ~0x03; /* set agc1_gain to 6 dB */ | 280 | regs[R_EB18] &= ~0x03; /* set agc1_gain to 6 dB */ |
269 | tda18271_write_regs(fe, R_EB18, 1); | 281 | ret = tda18271_write_regs(fe, R_EB18, 1); |
282 | if (tda_fail(ret)) | ||
283 | goto fail; | ||
270 | 284 | ||
271 | regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */ | 285 | regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */ |
272 | 286 | ||
273 | /* POR mode */ | 287 | /* POR mode */ |
274 | tda18271_set_standby_mode(fe, 1, 0, 0); | 288 | ret = tda18271_set_standby_mode(fe, 1, 0, 0); |
289 | if (tda_fail(ret)) | ||
290 | goto fail; | ||
275 | 291 | ||
276 | /* disable 1.5 MHz low pass filter */ | 292 | /* disable 1.5 MHz low pass filter */ |
277 | regs[R_EB23] &= ~0x04; /* forcelp_fc2_en = 0 */ | 293 | regs[R_EB23] &= ~0x04; /* forcelp_fc2_en = 0 */ |
278 | regs[R_EB23] &= ~0x02; /* XXX: lp_fc[2] = 0 */ | 294 | regs[R_EB23] &= ~0x02; /* XXX: lp_fc[2] = 0 */ |
279 | tda18271_write_regs(fe, R_EB21, 3); | 295 | ret = tda18271_write_regs(fe, R_EB21, 3); |
280 | 296 | fail: | |
281 | return 0; | 297 | return ret; |
282 | } | 298 | } |
283 | 299 | ||
284 | static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq) | 300 | static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq) |
@@ -389,7 +405,7 @@ static int tda18271_powerscan(struct dvb_frontend *fe, | |||
389 | { | 405 | { |
390 | struct tda18271_priv *priv = fe->tuner_priv; | 406 | struct tda18271_priv *priv = fe->tuner_priv; |
391 | unsigned char *regs = priv->tda18271_regs; | 407 | unsigned char *regs = priv->tda18271_regs; |
392 | int sgn, bcal, count, wait; | 408 | int sgn, bcal, count, wait, ret; |
393 | u8 cid_target; | 409 | u8 cid_target; |
394 | u16 count_limit; | 410 | u16 count_limit; |
395 | u32 freq; | 411 | u32 freq; |
@@ -421,7 +437,9 @@ static int tda18271_powerscan(struct dvb_frontend *fe, | |||
421 | tda18271_write_regs(fe, R_EP2, 1); | 437 | tda18271_write_regs(fe, R_EP2, 1); |
422 | 438 | ||
423 | /* read power detection info, stored in EB10 */ | 439 | /* read power detection info, stored in EB10 */ |
424 | tda18271_read_extended(fe); | 440 | ret = tda18271_read_extended(fe); |
441 | if (tda_fail(ret)) | ||
442 | return ret; | ||
425 | 443 | ||
426 | /* algorithm initialization */ | 444 | /* algorithm initialization */ |
427 | sgn = 1; | 445 | sgn = 1; |
@@ -447,7 +465,9 @@ static int tda18271_powerscan(struct dvb_frontend *fe, | |||
447 | tda18271_write_regs(fe, R_EP2, 1); | 465 | tda18271_write_regs(fe, R_EP2, 1); |
448 | 466 | ||
449 | /* read power detection info, stored in EB10 */ | 467 | /* read power detection info, stored in EB10 */ |
450 | tda18271_read_extended(fe); | 468 | ret = tda18271_read_extended(fe); |
469 | if (tda_fail(ret)) | ||
470 | return ret; | ||
451 | 471 | ||
452 | count += 200; | 472 | count += 200; |
453 | 473 | ||
@@ -478,6 +498,7 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe) | |||
478 | { | 498 | { |
479 | struct tda18271_priv *priv = fe->tuner_priv; | 499 | struct tda18271_priv *priv = fe->tuner_priv; |
480 | unsigned char *regs = priv->tda18271_regs; | 500 | unsigned char *regs = priv->tda18271_regs; |
501 | int ret; | ||
481 | 502 | ||
482 | /* set standard to digital */ | 503 | /* set standard to digital */ |
483 | regs[R_EP3] &= ~0x1f; /* clear std bits */ | 504 | regs[R_EP3] &= ~0x1f; /* clear std bits */ |
@@ -489,10 +510,14 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe) | |||
489 | /* update IF output level & IF notch frequency */ | 510 | /* update IF output level & IF notch frequency */ |
490 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ | 511 | regs[R_EP4] &= ~0x1c; /* clear if level bits */ |
491 | 512 | ||
492 | tda18271_write_regs(fe, R_EP3, 2); | 513 | ret = tda18271_write_regs(fe, R_EP3, 2); |
514 | if (tda_fail(ret)) | ||
515 | goto fail; | ||
493 | 516 | ||
494 | regs[R_EB18] &= ~0x03; /* set agc1_gain to 6 dB */ | 517 | regs[R_EB18] &= ~0x03; /* set agc1_gain to 6 dB */ |
495 | tda18271_write_regs(fe, R_EB18, 1); | 518 | ret = tda18271_write_regs(fe, R_EB18, 1); |
519 | if (tda_fail(ret)) | ||
520 | goto fail; | ||
496 | 521 | ||
497 | regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */ | 522 | regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */ |
498 | 523 | ||
@@ -500,9 +525,9 @@ static int tda18271_powerscan_init(struct dvb_frontend *fe) | |||
500 | regs[R_EB23] |= 0x04; /* forcelp_fc2_en = 1 */ | 525 | regs[R_EB23] |= 0x04; /* forcelp_fc2_en = 1 */ |
501 | regs[R_EB23] |= 0x02; /* lp_fc[2] = 1 */ | 526 | regs[R_EB23] |= 0x02; /* lp_fc[2] = 1 */ |
502 | 527 | ||
503 | tda18271_write_regs(fe, R_EB21, 3); | 528 | ret = tda18271_write_regs(fe, R_EB21, 3); |
504 | 529 | fail: | |
505 | return 0; | 530 | return ret; |
506 | } | 531 | } |
507 | 532 | ||
508 | static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) | 533 | static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) |
@@ -521,7 +546,7 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) | |||
521 | 546 | ||
522 | i = tda18271_lookup_rf_band(fe, &freq, NULL); | 547 | i = tda18271_lookup_rf_band(fe, &freq, NULL); |
523 | 548 | ||
524 | if (i < 0) | 549 | if (tda_fail(i)) |
525 | return i; | 550 | return i; |
526 | 551 | ||
527 | rf_default[RF1] = 1000 * map[i].rf1_def; | 552 | rf_default[RF1] = 1000 * map[i].rf1_def; |
@@ -535,6 +560,8 @@ static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq) | |||
535 | 560 | ||
536 | /* look for optimized calibration frequency */ | 561 | /* look for optimized calibration frequency */ |
537 | bcal = tda18271_powerscan(fe, &rf_default[rf], &rf_freq[rf]); | 562 | bcal = tda18271_powerscan(fe, &rf_default[rf], &rf_freq[rf]); |
563 | if (tda_fail(bcal)) | ||
564 | return bcal; | ||
538 | 565 | ||
539 | tda18271_calc_rf_cal(fe, &rf_freq[rf]); | 566 | tda18271_calc_rf_cal(fe, &rf_freq[rf]); |
540 | prog_tab[rf] = regs[R_EB14]; | 567 | prog_tab[rf] = regs[R_EB14]; |
@@ -575,22 +602,29 @@ static int tda18271_calc_rf_filter_curve(struct dvb_frontend *fe) | |||
575 | { | 602 | { |
576 | struct tda18271_priv *priv = fe->tuner_priv; | 603 | struct tda18271_priv *priv = fe->tuner_priv; |
577 | unsigned int i; | 604 | unsigned int i; |
605 | int ret; | ||
578 | 606 | ||
579 | tda_info("tda18271: performing RF tracking filter calibration\n"); | 607 | tda_info("tda18271: performing RF tracking filter calibration\n"); |
580 | 608 | ||
581 | /* wait for die temperature stabilization */ | 609 | /* wait for die temperature stabilization */ |
582 | msleep(200); | 610 | msleep(200); |
583 | 611 | ||
584 | tda18271_powerscan_init(fe); | 612 | ret = tda18271_powerscan_init(fe); |
613 | if (tda_fail(ret)) | ||
614 | goto fail; | ||
585 | 615 | ||
586 | /* rf band calibration */ | 616 | /* rf band calibration */ |
587 | for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++) | 617 | for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++) { |
618 | ret = | ||
588 | tda18271_rf_tracking_filters_init(fe, 1000 * | 619 | tda18271_rf_tracking_filters_init(fe, 1000 * |
589 | priv->rf_cal_state[i].rfmax); | 620 | priv->rf_cal_state[i].rfmax); |
621 | if (tda_fail(ret)) | ||
622 | goto fail; | ||
623 | } | ||
590 | 624 | ||
591 | priv->tm_rfcal = tda18271_read_thermometer(fe); | 625 | priv->tm_rfcal = tda18271_read_thermometer(fe); |
592 | 626 | fail: | |
593 | return 0; | 627 | return ret; |
594 | } | 628 | } |
595 | 629 | ||
596 | /* ------------------------------------------------------------------ */ | 630 | /* ------------------------------------------------------------------ */ |
@@ -599,6 +633,7 @@ static int tda18271c2_rf_cal_init(struct dvb_frontend *fe) | |||
599 | { | 633 | { |
600 | struct tda18271_priv *priv = fe->tuner_priv; | 634 | struct tda18271_priv *priv = fe->tuner_priv; |
601 | unsigned char *regs = priv->tda18271_regs; | 635 | unsigned char *regs = priv->tda18271_regs; |
636 | int ret; | ||
602 | 637 | ||
603 | /* test RF_CAL_OK to see if we need init */ | 638 | /* test RF_CAL_OK to see if we need init */ |
604 | if ((regs[R_EP1] & 0x10) == 0) | 639 | if ((regs[R_EP1] & 0x10) == 0) |
@@ -607,15 +642,22 @@ static int tda18271c2_rf_cal_init(struct dvb_frontend *fe) | |||
607 | if (priv->cal_initialized) | 642 | if (priv->cal_initialized) |
608 | return 0; | 643 | return 0; |
609 | 644 | ||
610 | tda18271_calc_rf_filter_curve(fe); | 645 | ret = tda18271_calc_rf_filter_curve(fe); |
646 | if (tda_fail(ret)) | ||
647 | goto fail; | ||
611 | 648 | ||
612 | tda18271_por(fe); | 649 | ret = tda18271_por(fe); |
650 | if (tda_fail(ret)) | ||
651 | goto fail; | ||
613 | 652 | ||
614 | tda_info("tda18271: RF tracking filter calibration complete\n"); | 653 | tda_info("tda18271: RF tracking filter calibration complete\n"); |
615 | 654 | ||
616 | priv->cal_initialized = true; | 655 | priv->cal_initialized = true; |
617 | 656 | goto end; | |
618 | return 0; | 657 | fail: |
658 | tda_info("tda18271: RF tracking filter calibration failed!\n"); | ||
659 | end: | ||
660 | return ret; | ||
619 | } | 661 | } |
620 | 662 | ||
621 | static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, | 663 | static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, |
@@ -623,6 +665,7 @@ static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, | |||
623 | { | 665 | { |
624 | struct tda18271_priv *priv = fe->tuner_priv; | 666 | struct tda18271_priv *priv = fe->tuner_priv; |
625 | unsigned char *regs = priv->tda18271_regs; | 667 | unsigned char *regs = priv->tda18271_regs; |
668 | int ret; | ||
626 | u32 N = 0; | 669 | u32 N = 0; |
627 | 670 | ||
628 | /* calculate bp filter */ | 671 | /* calculate bp filter */ |
@@ -671,7 +714,10 @@ static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe, | |||
671 | 714 | ||
672 | tda18271_calc_main_pll(fe, N); | 715 | tda18271_calc_main_pll(fe, N); |
673 | 716 | ||
674 | tda18271_write_regs(fe, R_EP3, 11); | 717 | ret = tda18271_write_regs(fe, R_EP3, 11); |
718 | if (tda_fail(ret)) | ||
719 | return ret; | ||
720 | |||
675 | msleep(5); /* RF tracking filter calibration initialization */ | 721 | msleep(5); /* RF tracking filter calibration initialization */ |
676 | 722 | ||
677 | /* search for K,M,CO for RF calibration */ | 723 | /* search for K,M,CO for RF calibration */ |
@@ -719,45 +765,56 @@ static int tda18271_ir_cal_init(struct dvb_frontend *fe) | |||
719 | { | 765 | { |
720 | struct tda18271_priv *priv = fe->tuner_priv; | 766 | struct tda18271_priv *priv = fe->tuner_priv; |
721 | unsigned char *regs = priv->tda18271_regs; | 767 | unsigned char *regs = priv->tda18271_regs; |
768 | int ret; | ||
722 | 769 | ||
723 | tda18271_read_regs(fe); | 770 | ret = tda18271_read_regs(fe); |
771 | if (tda_fail(ret)) | ||
772 | goto fail; | ||
724 | 773 | ||
725 | /* test IR_CAL_OK to see if we need init */ | 774 | /* test IR_CAL_OK to see if we need init */ |
726 | if ((regs[R_EP1] & 0x08) == 0) | 775 | if ((regs[R_EP1] & 0x08) == 0) |
727 | tda18271_init_regs(fe); | 776 | ret = tda18271_init_regs(fe); |
728 | 777 | fail: | |
729 | return 0; | 778 | return ret; |
730 | } | 779 | } |
731 | 780 | ||
732 | static int tda18271_init(struct dvb_frontend *fe) | 781 | static int tda18271_init(struct dvb_frontend *fe) |
733 | { | 782 | { |
734 | struct tda18271_priv *priv = fe->tuner_priv; | 783 | struct tda18271_priv *priv = fe->tuner_priv; |
784 | int ret; | ||
735 | 785 | ||
736 | mutex_lock(&priv->lock); | 786 | mutex_lock(&priv->lock); |
737 | 787 | ||
738 | /* power up */ | 788 | /* power up */ |
739 | tda18271_set_standby_mode(fe, 0, 0, 0); | 789 | ret = tda18271_set_standby_mode(fe, 0, 0, 0); |
790 | if (tda_fail(ret)) | ||
791 | goto fail; | ||
740 | 792 | ||
741 | /* initialization */ | 793 | /* initialization */ |
742 | tda18271_ir_cal_init(fe); | 794 | ret = tda18271_ir_cal_init(fe); |
795 | if (tda_fail(ret)) | ||
796 | goto fail; | ||
743 | 797 | ||
744 | if (priv->id == TDA18271HDC2) | 798 | if (priv->id == TDA18271HDC2) |
745 | tda18271c2_rf_cal_init(fe); | 799 | tda18271c2_rf_cal_init(fe); |
746 | 800 | fail: | |
747 | mutex_unlock(&priv->lock); | 801 | mutex_unlock(&priv->lock); |
748 | 802 | ||
749 | return 0; | 803 | return ret; |
750 | } | 804 | } |
751 | 805 | ||
752 | static int tda18271_tune(struct dvb_frontend *fe, | 806 | static int tda18271_tune(struct dvb_frontend *fe, |
753 | struct tda18271_std_map_item *map, u32 freq, u32 bw) | 807 | struct tda18271_std_map_item *map, u32 freq, u32 bw) |
754 | { | 808 | { |
755 | struct tda18271_priv *priv = fe->tuner_priv; | 809 | struct tda18271_priv *priv = fe->tuner_priv; |
810 | int ret; | ||
756 | 811 | ||
757 | tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n", | 812 | tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n", |
758 | freq, map->if_freq, bw, map->agc_mode, map->std); | 813 | freq, map->if_freq, bw, map->agc_mode, map->std); |
759 | 814 | ||
760 | tda18271_init(fe); | 815 | ret = tda18271_init(fe); |
816 | if (tda_fail(ret)) | ||
817 | goto fail; | ||
761 | 818 | ||
762 | mutex_lock(&priv->lock); | 819 | mutex_lock(&priv->lock); |
763 | 820 | ||
@@ -769,11 +826,11 @@ static int tda18271_tune(struct dvb_frontend *fe, | |||
769 | tda18271c2_rf_tracking_filters_correction(fe, freq); | 826 | tda18271c2_rf_tracking_filters_correction(fe, freq); |
770 | break; | 827 | break; |
771 | } | 828 | } |
772 | tda18271_channel_configuration(fe, map, freq, bw); | 829 | ret = tda18271_channel_configuration(fe, map, freq, bw); |
773 | 830 | ||
774 | mutex_unlock(&priv->lock); | 831 | mutex_unlock(&priv->lock); |
775 | 832 | fail: | |
776 | return 0; | 833 | return ret; |
777 | } | 834 | } |
778 | 835 | ||
779 | /* ------------------------------------------------------------------ */ | 836 | /* ------------------------------------------------------------------ */ |
@@ -837,7 +894,7 @@ static int tda18271_set_params(struct dvb_frontend *fe, | |||
837 | 894 | ||
838 | ret = tda18271_tune(fe, map, freq, bw); | 895 | ret = tda18271_tune(fe, map, freq, bw); |
839 | 896 | ||
840 | if (ret < 0) | 897 | if (tda_fail(ret)) |
841 | goto fail; | 898 | goto fail; |
842 | 899 | ||
843 | priv->frequency = freq; | 900 | priv->frequency = freq; |
@@ -893,7 +950,7 @@ static int tda18271_set_analog_params(struct dvb_frontend *fe, | |||
893 | 950 | ||
894 | ret = tda18271_tune(fe, map, freq, 0); | 951 | ret = tda18271_tune(fe, map, freq, 0); |
895 | 952 | ||
896 | if (ret < 0) | 953 | if (tda_fail(ret)) |
897 | goto fail; | 954 | goto fail; |
898 | 955 | ||
899 | priv->frequency = freq; | 956 | priv->frequency = freq; |
@@ -905,16 +962,17 @@ fail: | |||
905 | static int tda18271_sleep(struct dvb_frontend *fe) | 962 | static int tda18271_sleep(struct dvb_frontend *fe) |
906 | { | 963 | { |
907 | struct tda18271_priv *priv = fe->tuner_priv; | 964 | struct tda18271_priv *priv = fe->tuner_priv; |
965 | int ret; | ||
908 | 966 | ||
909 | mutex_lock(&priv->lock); | 967 | mutex_lock(&priv->lock); |
910 | 968 | ||
911 | /* standby mode w/ slave tuner output | 969 | /* standby mode w/ slave tuner output |
912 | * & loop thru & xtal oscillator on */ | 970 | * & loop thru & xtal oscillator on */ |
913 | tda18271_set_standby_mode(fe, 1, 0, 0); | 971 | ret = tda18271_set_standby_mode(fe, 1, 0, 0); |
914 | 972 | ||
915 | mutex_unlock(&priv->lock); | 973 | mutex_unlock(&priv->lock); |
916 | 974 | ||
917 | return 0; | 975 | return ret; |
918 | } | 976 | } |
919 | 977 | ||
920 | static int tda18271_release(struct dvb_frontend *fe) | 978 | static int tda18271_release(struct dvb_frontend *fe) |
@@ -1095,10 +1153,10 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, | |||
1095 | if (cfg) | 1153 | if (cfg) |
1096 | priv->small_i2c = cfg->small_i2c; | 1154 | priv->small_i2c = cfg->small_i2c; |
1097 | 1155 | ||
1098 | if (tda18271_get_id(fe) < 0) | 1156 | if (tda_fail(tda18271_get_id(fe))) |
1099 | goto fail; | 1157 | goto fail; |
1100 | 1158 | ||
1101 | if (tda18271_assign_map_layout(fe) < 0) | 1159 | if (tda_fail(tda18271_assign_map_layout(fe))) |
1102 | goto fail; | 1160 | goto fail; |
1103 | 1161 | ||
1104 | mutex_lock(&priv->lock); | 1162 | mutex_lock(&priv->lock); |
diff --git a/drivers/media/common/tuners/tda18271-priv.h b/drivers/media/common/tuners/tda18271-priv.h index 2bc5eb368ea2..81a739365f8c 100644 --- a/drivers/media/common/tuners/tda18271-priv.h +++ b/drivers/media/common/tuners/tda18271-priv.h | |||
@@ -153,6 +153,15 @@ extern int tda18271_debug; | |||
153 | #define tda_reg(fmt, arg...) dprintk(KERN_DEBUG, DBG_REG, fmt, ##arg) | 153 | #define tda_reg(fmt, arg...) dprintk(KERN_DEBUG, DBG_REG, fmt, ##arg) |
154 | #define tda_cal(fmt, arg...) dprintk(KERN_DEBUG, DBG_CAL, fmt, ##arg) | 154 | #define tda_cal(fmt, arg...) dprintk(KERN_DEBUG, DBG_CAL, fmt, ##arg) |
155 | 155 | ||
156 | #define tda_fail(ret) \ | ||
157 | ({ \ | ||
158 | int __ret; \ | ||
159 | __ret = (ret < 0); \ | ||
160 | if (__ret) \ | ||
161 | tda_printk(KERN_ERR, "error %d on line %d\n", ret, __LINE__);\ | ||
162 | __ret; \ | ||
163 | }) | ||
164 | |||
156 | /*---------------------------------------------------------------------*/ | 165 | /*---------------------------------------------------------------------*/ |
157 | 166 | ||
158 | enum tda18271_map_type { | 167 | enum tda18271_map_type { |
diff --git a/drivers/media/common/tuners/tea5767.c b/drivers/media/common/tuners/tea5767.c index f6e7d7ad8424..1f5646334a8f 100644 --- a/drivers/media/common/tuners/tea5767.c +++ b/drivers/media/common/tuners/tea5767.c | |||
@@ -373,14 +373,14 @@ int tea5767_autodetection(struct i2c_adapter* i2c_adap, u8 i2c_addr) | |||
373 | 373 | ||
374 | if ((rc = tuner_i2c_xfer_recv(&i2c, buffer, 7))< 5) { | 374 | if ((rc = tuner_i2c_xfer_recv(&i2c, buffer, 7))< 5) { |
375 | printk(KERN_WARNING "It is not a TEA5767. Received %i bytes.\n", rc); | 375 | printk(KERN_WARNING "It is not a TEA5767. Received %i bytes.\n", rc); |
376 | return EINVAL; | 376 | return -EINVAL; |
377 | } | 377 | } |
378 | 378 | ||
379 | /* If all bytes are the same then it's a TV tuner and not a tea5767 */ | 379 | /* If all bytes are the same then it's a TV tuner and not a tea5767 */ |
380 | if (buffer[0] == buffer[1] && buffer[0] == buffer[2] && | 380 | if (buffer[0] == buffer[1] && buffer[0] == buffer[2] && |
381 | buffer[0] == buffer[3] && buffer[0] == buffer[4]) { | 381 | buffer[0] == buffer[3] && buffer[0] == buffer[4]) { |
382 | printk(KERN_WARNING "All bytes are equal. It is not a TEA5767\n"); | 382 | printk(KERN_WARNING "All bytes are equal. It is not a TEA5767\n"); |
383 | return EINVAL; | 383 | return -EINVAL; |
384 | } | 384 | } |
385 | 385 | ||
386 | /* Status bytes: | 386 | /* Status bytes: |
@@ -390,7 +390,7 @@ int tea5767_autodetection(struct i2c_adapter* i2c_adap, u8 i2c_addr) | |||
390 | */ | 390 | */ |
391 | if (((buffer[3] & 0x0f) != 0x00) || (buffer[4] != 0x00)) { | 391 | if (((buffer[3] & 0x0f) != 0x00) || (buffer[4] != 0x00)) { |
392 | printk(KERN_WARNING "Chip ID is not zero. It is not a TEA5767\n"); | 392 | printk(KERN_WARNING "Chip ID is not zero. It is not a TEA5767\n"); |
393 | return EINVAL; | 393 | return -EINVAL; |
394 | } | 394 | } |
395 | 395 | ||
396 | 396 | ||
diff --git a/drivers/media/common/tuners/xc5000.c b/drivers/media/common/tuners/xc5000.c index 43d35bdb221f..ceae6db901ec 100644 --- a/drivers/media/common/tuners/xc5000.c +++ b/drivers/media/common/tuners/xc5000.c | |||
@@ -212,7 +212,7 @@ static void xc5000_TunerReset(struct dvb_frontend *fe) | |||
212 | dprintk(1, "%s()\n", __func__); | 212 | dprintk(1, "%s()\n", __func__); |
213 | 213 | ||
214 | if (priv->cfg->tuner_callback) { | 214 | if (priv->cfg->tuner_callback) { |
215 | ret = priv->cfg->tuner_callback(priv->cfg->priv, | 215 | ret = priv->cfg->tuner_callback(priv->devptr, |
216 | XC5000_TUNER_RESET, 0); | 216 | XC5000_TUNER_RESET, 0); |
217 | if (ret) | 217 | if (ret) |
218 | printk(KERN_ERR "xc5000: reset failed\n"); | 218 | printk(KERN_ERR "xc5000: reset failed\n"); |
@@ -900,9 +900,9 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = { | |||
900 | .get_status = xc5000_get_status | 900 | .get_status = xc5000_get_status |
901 | }; | 901 | }; |
902 | 902 | ||
903 | struct dvb_frontend * xc5000_attach(struct dvb_frontend *fe, | 903 | struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, |
904 | struct i2c_adapter *i2c, | 904 | struct i2c_adapter *i2c, |
905 | struct xc5000_config *cfg) | 905 | struct xc5000_config *cfg, void *devptr) |
906 | { | 906 | { |
907 | struct xc5000_priv *priv = NULL; | 907 | struct xc5000_priv *priv = NULL; |
908 | u16 id = 0; | 908 | u16 id = 0; |
@@ -916,6 +916,7 @@ struct dvb_frontend * xc5000_attach(struct dvb_frontend *fe, | |||
916 | priv->cfg = cfg; | 916 | priv->cfg = cfg; |
917 | priv->bandwidth = BANDWIDTH_6_MHZ; | 917 | priv->bandwidth = BANDWIDTH_6_MHZ; |
918 | priv->i2c = i2c; | 918 | priv->i2c = i2c; |
919 | priv->devptr = devptr; | ||
919 | 920 | ||
920 | /* Check if firmware has been loaded. It is possible that another | 921 | /* Check if firmware has been loaded. It is possible that another |
921 | instance of the driver has loaded the firmware. | 922 | instance of the driver has loaded the firmware. |
diff --git a/drivers/media/common/tuners/xc5000.h b/drivers/media/common/tuners/xc5000.h index 0ee80f9d19b8..c910715addc9 100644 --- a/drivers/media/common/tuners/xc5000.h +++ b/drivers/media/common/tuners/xc5000.h | |||
@@ -31,29 +31,31 @@ struct xc5000_config { | |||
31 | u8 i2c_address; | 31 | u8 i2c_address; |
32 | u32 if_khz; | 32 | u32 if_khz; |
33 | 33 | ||
34 | /* For each bridge framework, when it attaches either analog or digital, | ||
35 | * it has to store a reference back to its _core equivalent structure, | ||
36 | * so that it can service the hardware by steering gpio's etc. | ||
37 | * Each bridge implementation is different so cast priv accordingly. | ||
38 | * The xc5000 driver cares not for this value, other than ensuring | ||
39 | * it's passed back to a bridge during tuner_callback(). | ||
40 | */ | ||
41 | void *priv; | ||
42 | int (*tuner_callback) (void *priv, int command, int arg); | 34 | int (*tuner_callback) (void *priv, int command, int arg); |
43 | }; | 35 | }; |
44 | 36 | ||
45 | /* xc5000 callback command */ | 37 | /* xc5000 callback command */ |
46 | #define XC5000_TUNER_RESET 0 | 38 | #define XC5000_TUNER_RESET 0 |
47 | 39 | ||
40 | /* For each bridge framework, when it attaches either analog or digital, | ||
41 | * it has to store a reference back to its _core equivalent structure, | ||
42 | * so that it can service the hardware by steering gpio's etc. | ||
43 | * Each bridge implementation is different so cast devptr accordingly. | ||
44 | * The xc5000 driver cares not for this value, other than ensuring | ||
45 | * it's passed back to a bridge during tuner_callback(). | ||
46 | */ | ||
47 | |||
48 | #if defined(CONFIG_MEDIA_TUNER_XC5000) || \ | 48 | #if defined(CONFIG_MEDIA_TUNER_XC5000) || \ |
49 | (defined(CONFIG_MEDIA_TUNER_XC5000_MODULE) && defined(MODULE)) | 49 | (defined(CONFIG_MEDIA_TUNER_XC5000_MODULE) && defined(MODULE)) |
50 | extern struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, | 50 | extern struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, |
51 | struct i2c_adapter *i2c, | 51 | struct i2c_adapter *i2c, |
52 | struct xc5000_config *cfg); | 52 | struct xc5000_config *cfg, |
53 | void *devptr); | ||
53 | #else | 54 | #else |
54 | static inline struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, | 55 | static inline struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, |
55 | struct i2c_adapter *i2c, | 56 | struct i2c_adapter *i2c, |
56 | struct xc5000_config *cfg) | 57 | struct xc5000_config *cfg, |
58 | void *devptr) | ||
57 | { | 59 | { |
58 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 60 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
59 | return NULL; | 61 | return NULL; |
diff --git a/drivers/media/common/tuners/xc5000_priv.h b/drivers/media/common/tuners/xc5000_priv.h index 13b2d19341da..ecebfe4745ad 100644 --- a/drivers/media/common/tuners/xc5000_priv.h +++ b/drivers/media/common/tuners/xc5000_priv.h | |||
@@ -31,6 +31,8 @@ struct xc5000_priv { | |||
31 | u8 video_standard; | 31 | u8 video_standard; |
32 | u8 rf_mode; | 32 | u8 rf_mode; |
33 | u8 fwloaded; | 33 | u8 fwloaded; |
34 | |||
35 | void *devptr; | ||
34 | }; | 36 | }; |
35 | 37 | ||
36 | #endif | 38 | #endif |
diff --git a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c index 7b0ea3bdfafb..f9d087669d5d 100644 --- a/drivers/media/dvb/b2c2/flexcop-fe-tuner.c +++ b/drivers/media/dvb/b2c2/flexcop-fe-tuner.c | |||
@@ -634,7 +634,7 @@ int flexcop_frontend_init(struct flexcop_device *fc) | |||
634 | } | 634 | } |
635 | 635 | ||
636 | /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */ | 636 | /* try the sky v2.3 (vp310/Samsung tbdu18132(tsa5059)) */ |
637 | fc->fe = dvb_attach(vp310_mt312_attach, | 637 | fc->fe = dvb_attach(mt312_attach, |
638 | &skystar23_samsung_tbdu18132_config, i2c); | 638 | &skystar23_samsung_tbdu18132_config, i2c); |
639 | if (fc->fe != NULL) { | 639 | if (fc->fe != NULL) { |
640 | ops = &fc->fe->ops; | 640 | ops = &fc->fe->ops; |
diff --git a/drivers/media/dvb/bt8xx/Kconfig b/drivers/media/dvb/bt8xx/Kconfig index d1239b8342f8..7588db1319d0 100644 --- a/drivers/media/dvb/bt8xx/Kconfig +++ b/drivers/media/dvb/bt8xx/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config DVB_BT8XX | 1 | config DVB_BT8XX |
2 | tristate "BT8xx based PCI cards" | 2 | tristate "BT8xx based PCI cards" |
3 | depends on DVB_CORE && PCI && I2C && VIDEO_BT848 | 3 | depends on DVB_CORE && PCI && I2C && VIDEO_BT848 |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select DVB_MT352 if !DVB_FE_CUSTOMISE | 5 | select DVB_MT352 if !DVB_FE_CUSTOMISE |
5 | select DVB_SP887X if !DVB_FE_CUSTOMISE | 6 | select DVB_SP887X if !DVB_FE_CUSTOMISE |
6 | select DVB_NXT6000 if !DVB_FE_CUSTOMISE | 7 | select DVB_NXT6000 if !DVB_FE_CUSTOMISE |
diff --git a/drivers/media/dvb/cinergyT2/Kconfig b/drivers/media/dvb/cinergyT2/Kconfig index 3d778c5aba68..c03513b2ccae 100644 --- a/drivers/media/dvb/cinergyT2/Kconfig +++ b/drivers/media/dvb/cinergyT2/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config DVB_CINERGYT2 | 1 | config DVB_CINERGYT2 |
2 | tristate "Terratec CinergyT2/qanu USB2 DVB-T receiver" | 2 | tristate "Terratec CinergyT2/qanu USB2 DVB-T receiver" |
3 | depends on DVB_CORE && USB | 3 | depends on DVB_CORE && USB && INPUT |
4 | help | 4 | help |
5 | Support for "TerraTec CinergyT2" USB2.0 Highspeed DVB Receivers | 5 | Support for "TerraTec CinergyT2" USB2.0 Highspeed DVB Receivers |
6 | 6 | ||
diff --git a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c index 8cbdb0ec67e2..588fbe105c27 100644 --- a/drivers/media/dvb/dvb-core/dvb_ca_en50221.c +++ b/drivers/media/dvb/dvb-core/dvb_ca_en50221.c | |||
@@ -910,15 +910,21 @@ static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca) | |||
910 | int curdelay = 100000000; | 910 | int curdelay = 100000000; |
911 | int slot; | 911 | int slot; |
912 | 912 | ||
913 | /* Beware of too high polling frequency, because one polling | ||
914 | * call might take several hundred milliseconds until timeout! | ||
915 | */ | ||
913 | for (slot = 0; slot < ca->slot_count; slot++) { | 916 | for (slot = 0; slot < ca->slot_count; slot++) { |
914 | switch (ca->slot_info[slot].slot_state) { | 917 | switch (ca->slot_info[slot].slot_state) { |
915 | default: | 918 | default: |
916 | case DVB_CA_SLOTSTATE_NONE: | 919 | case DVB_CA_SLOTSTATE_NONE: |
920 | delay = HZ * 60; /* 60s */ | ||
921 | if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) | ||
922 | delay = HZ * 5; /* 5s */ | ||
923 | break; | ||
917 | case DVB_CA_SLOTSTATE_INVALID: | 924 | case DVB_CA_SLOTSTATE_INVALID: |
918 | delay = HZ * 60; | 925 | delay = HZ * 60; /* 60s */ |
919 | if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) { | 926 | if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) |
920 | delay = HZ / 10; | 927 | delay = HZ / 10; /* 100ms */ |
921 | } | ||
922 | break; | 928 | break; |
923 | 929 | ||
924 | case DVB_CA_SLOTSTATE_UNINITIALISED: | 930 | case DVB_CA_SLOTSTATE_UNINITIALISED: |
@@ -926,19 +932,17 @@ static void dvb_ca_en50221_thread_update_delay(struct dvb_ca_private *ca) | |||
926 | case DVB_CA_SLOTSTATE_VALIDATE: | 932 | case DVB_CA_SLOTSTATE_VALIDATE: |
927 | case DVB_CA_SLOTSTATE_WAITFR: | 933 | case DVB_CA_SLOTSTATE_WAITFR: |
928 | case DVB_CA_SLOTSTATE_LINKINIT: | 934 | case DVB_CA_SLOTSTATE_LINKINIT: |
929 | delay = HZ / 10; | 935 | delay = HZ / 10; /* 100ms */ |
930 | break; | 936 | break; |
931 | 937 | ||
932 | case DVB_CA_SLOTSTATE_RUNNING: | 938 | case DVB_CA_SLOTSTATE_RUNNING: |
933 | delay = HZ * 60; | 939 | delay = HZ * 60; /* 60s */ |
934 | if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) { | 940 | if (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE)) |
935 | delay = HZ / 10; | 941 | delay = HZ / 10; /* 100ms */ |
936 | } | ||
937 | if (ca->open) { | 942 | if (ca->open) { |
938 | if ((!ca->slot_info[slot].da_irq_supported) || | 943 | if ((!ca->slot_info[slot].da_irq_supported) || |
939 | (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_DA))) { | 944 | (!(ca->flags & DVB_CA_EN50221_FLAG_IRQ_DA))) |
940 | delay = HZ / 10; | 945 | delay = HZ / 10; /* 100ms */ |
941 | } | ||
942 | } | 946 | } |
943 | break; | 947 | break; |
944 | } | 948 | } |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 4c1cff9feb2e..cf4584e48b6d 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config DVB_USB | 1 | config DVB_USB |
2 | tristate "Support for various USB DVB devices" | 2 | tristate "Support for various USB DVB devices" |
3 | depends on DVB_CORE && USB && I2C | 3 | depends on DVB_CORE && USB && I2C |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select FW_LOADER | 5 | select FW_LOADER |
5 | help | 6 | help |
6 | By enabling this you will be able to choose the various supported | 7 | By enabling this you will be able to choose the various supported |
diff --git a/drivers/media/dvb/frontends/Kconfig b/drivers/media/dvb/frontends/Kconfig index 6d2384605927..c20553c4da1f 100644 --- a/drivers/media/dvb/frontends/Kconfig +++ b/drivers/media/dvb/frontends/Kconfig | |||
@@ -30,7 +30,7 @@ config DVB_CX24123 | |||
30 | A DVB-S tuner module. Say Y when you want to support this frontend. | 30 | A DVB-S tuner module. Say Y when you want to support this frontend. |
31 | 31 | ||
32 | config DVB_MT312 | 32 | config DVB_MT312 |
33 | tristate "Zarlink VP310/MT312 based" | 33 | tristate "Zarlink VP310/MT312/ZL10313 based" |
34 | depends on DVB_CORE && I2C | 34 | depends on DVB_CORE && I2C |
35 | default m if DVB_FE_CUSTOMISE | 35 | default m if DVB_FE_CUSTOMISE |
36 | help | 36 | help |
@@ -97,7 +97,7 @@ comment "DVB-T (terrestrial) frontends" | |||
97 | 97 | ||
98 | config DVB_SP8870 | 98 | config DVB_SP8870 |
99 | tristate "Spase sp8870 based" | 99 | tristate "Spase sp8870 based" |
100 | depends on DVB_CORE && I2C | 100 | depends on DVB_CORE && I2C && HOTPLUG |
101 | default m if DVB_FE_CUSTOMISE | 101 | default m if DVB_FE_CUSTOMISE |
102 | select FW_LOADER | 102 | select FW_LOADER |
103 | help | 103 | help |
@@ -110,7 +110,7 @@ config DVB_SP8870 | |||
110 | 110 | ||
111 | config DVB_SP887X | 111 | config DVB_SP887X |
112 | tristate "Spase sp887x based" | 112 | tristate "Spase sp887x based" |
113 | depends on DVB_CORE && I2C | 113 | depends on DVB_CORE && I2C && HOTPLUG |
114 | default m if DVB_FE_CUSTOMISE | 114 | default m if DVB_FE_CUSTOMISE |
115 | select FW_LOADER | 115 | select FW_LOADER |
116 | help | 116 | help |
@@ -144,7 +144,7 @@ config DVB_L64781 | |||
144 | 144 | ||
145 | config DVB_TDA1004X | 145 | config DVB_TDA1004X |
146 | tristate "Philips TDA10045H/TDA10046H based" | 146 | tristate "Philips TDA10045H/TDA10046H based" |
147 | depends on DVB_CORE && I2C | 147 | depends on DVB_CORE && I2C && HOTPLUG |
148 | default m if DVB_FE_CUSTOMISE | 148 | default m if DVB_FE_CUSTOMISE |
149 | select FW_LOADER | 149 | select FW_LOADER |
150 | help | 150 | help |
@@ -211,7 +211,7 @@ config DVB_DIB7000P | |||
211 | 211 | ||
212 | config DVB_TDA10048 | 212 | config DVB_TDA10048 |
213 | tristate "Philips TDA10048HN based" | 213 | tristate "Philips TDA10048HN based" |
214 | depends on DVB_CORE && I2C | 214 | depends on DVB_CORE && I2C && HOTPLUG |
215 | default m if DVB_FE_CUSTOMISE | 215 | default m if DVB_FE_CUSTOMISE |
216 | select FW_LOADER | 216 | select FW_LOADER |
217 | help | 217 | help |
@@ -253,7 +253,7 @@ comment "ATSC (North American/Korean Terrestrial/Cable DTV) frontends" | |||
253 | 253 | ||
254 | config DVB_NXT200X | 254 | config DVB_NXT200X |
255 | tristate "NxtWave Communications NXT2002/NXT2004 based" | 255 | tristate "NxtWave Communications NXT2002/NXT2004 based" |
256 | depends on DVB_CORE && I2C | 256 | depends on DVB_CORE && I2C && HOTPLUG |
257 | default m if DVB_FE_CUSTOMISE | 257 | default m if DVB_FE_CUSTOMISE |
258 | select FW_LOADER | 258 | select FW_LOADER |
259 | help | 259 | help |
@@ -268,7 +268,7 @@ config DVB_NXT200X | |||
268 | 268 | ||
269 | config DVB_OR51211 | 269 | config DVB_OR51211 |
270 | tristate "Oren OR51211 based" | 270 | tristate "Oren OR51211 based" |
271 | depends on DVB_CORE && I2C | 271 | depends on DVB_CORE && I2C && HOTPLUG |
272 | default m if DVB_FE_CUSTOMISE | 272 | default m if DVB_FE_CUSTOMISE |
273 | select FW_LOADER | 273 | select FW_LOADER |
274 | help | 274 | help |
@@ -281,7 +281,7 @@ config DVB_OR51211 | |||
281 | 281 | ||
282 | config DVB_OR51132 | 282 | config DVB_OR51132 |
283 | tristate "Oren OR51132 based" | 283 | tristate "Oren OR51132 based" |
284 | depends on DVB_CORE && I2C | 284 | depends on DVB_CORE && I2C && HOTPLUG |
285 | default m if DVB_FE_CUSTOMISE | 285 | default m if DVB_FE_CUSTOMISE |
286 | select FW_LOADER | 286 | select FW_LOADER |
287 | help | 287 | help |
@@ -297,7 +297,7 @@ config DVB_OR51132 | |||
297 | 297 | ||
298 | config DVB_BCM3510 | 298 | config DVB_BCM3510 |
299 | tristate "Broadcom BCM3510" | 299 | tristate "Broadcom BCM3510" |
300 | depends on DVB_CORE && I2C | 300 | depends on DVB_CORE && I2C && HOTPLUG |
301 | default m if DVB_FE_CUSTOMISE | 301 | default m if DVB_FE_CUSTOMISE |
302 | select FW_LOADER | 302 | select FW_LOADER |
303 | help | 303 | help |
diff --git a/drivers/media/dvb/frontends/itd1000.c b/drivers/media/dvb/frontends/itd1000.c index 04c562ccf990..600dad6b41ea 100644 --- a/drivers/media/dvb/frontends/itd1000.c +++ b/drivers/media/dvb/frontends/itd1000.c | |||
@@ -195,7 +195,7 @@ static void itd1000_set_vco(struct itd1000_state *state, u32 freq_khz) | |||
195 | } | 195 | } |
196 | } | 196 | } |
197 | 197 | ||
198 | struct { | 198 | static const struct { |
199 | u32 freq; | 199 | u32 freq; |
200 | u8 values[10]; /* RFTR, RFST1 - RFST9 */ | 200 | u8 values[10]; /* RFTR, RFST1 - RFST9 */ |
201 | } itd1000_fre_values[] = { | 201 | } itd1000_fre_values[] = { |
diff --git a/drivers/media/dvb/frontends/mt312.c b/drivers/media/dvb/frontends/mt312.c index 081ca3398c76..5ac9b15920f8 100644 --- a/drivers/media/dvb/frontends/mt312.c +++ b/drivers/media/dvb/frontends/mt312.c | |||
@@ -737,7 +737,7 @@ static void mt312_release(struct dvb_frontend *fe) | |||
737 | } | 737 | } |
738 | 738 | ||
739 | #define MT312_SYS_CLK 90000000UL /* 90 MHz */ | 739 | #define MT312_SYS_CLK 90000000UL /* 90 MHz */ |
740 | static struct dvb_frontend_ops vp310_mt312_ops = { | 740 | static struct dvb_frontend_ops mt312_ops = { |
741 | 741 | ||
742 | .info = { | 742 | .info = { |
743 | .name = "Zarlink ???? DVB-S", | 743 | .name = "Zarlink ???? DVB-S", |
@@ -776,7 +776,7 @@ static struct dvb_frontend_ops vp310_mt312_ops = { | |||
776 | .set_voltage = mt312_set_voltage, | 776 | .set_voltage = mt312_set_voltage, |
777 | }; | 777 | }; |
778 | 778 | ||
779 | struct dvb_frontend *vp310_mt312_attach(const struct mt312_config *config, | 779 | struct dvb_frontend *mt312_attach(const struct mt312_config *config, |
780 | struct i2c_adapter *i2c) | 780 | struct i2c_adapter *i2c) |
781 | { | 781 | { |
782 | struct mt312_state *state = NULL; | 782 | struct mt312_state *state = NULL; |
@@ -795,7 +795,7 @@ struct dvb_frontend *vp310_mt312_attach(const struct mt312_config *config, | |||
795 | goto error; | 795 | goto error; |
796 | 796 | ||
797 | /* create dvb_frontend */ | 797 | /* create dvb_frontend */ |
798 | memcpy(&state->frontend.ops, &vp310_mt312_ops, | 798 | memcpy(&state->frontend.ops, &mt312_ops, |
799 | sizeof(struct dvb_frontend_ops)); | 799 | sizeof(struct dvb_frontend_ops)); |
800 | state->frontend.demodulator_priv = state; | 800 | state->frontend.demodulator_priv = state; |
801 | 801 | ||
@@ -827,12 +827,13 @@ error: | |||
827 | kfree(state); | 827 | kfree(state); |
828 | return NULL; | 828 | return NULL; |
829 | } | 829 | } |
830 | EXPORT_SYMBOL(vp310_mt312_attach); | 830 | EXPORT_SYMBOL(mt312_attach); |
831 | 831 | ||
832 | module_param(debug, int, 0644); | 832 | module_param(debug, int, 0644); |
833 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); | 833 | MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off)."); |
834 | 834 | ||
835 | MODULE_DESCRIPTION("Zarlink VP310/MT312/ZL10313 DVB-S Demodulator driver"); | 835 | MODULE_DESCRIPTION("Zarlink VP310/MT312/ZL10313 DVB-S Demodulator driver"); |
836 | MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>"); | 836 | MODULE_AUTHOR("Andreas Oberritter <obi@linuxtv.org>"); |
837 | MODULE_AUTHOR("Matthias Schwarzott <zzam@gentoo.org>"); | ||
837 | MODULE_LICENSE("GPL"); | 838 | MODULE_LICENSE("GPL"); |
838 | 839 | ||
diff --git a/drivers/media/dvb/frontends/mt312.h b/drivers/media/dvb/frontends/mt312.h index de796eab3911..29e3bb5496b8 100644 --- a/drivers/media/dvb/frontends/mt312.h +++ b/drivers/media/dvb/frontends/mt312.h | |||
@@ -37,10 +37,10 @@ struct mt312_config { | |||
37 | }; | 37 | }; |
38 | 38 | ||
39 | #if defined(CONFIG_DVB_MT312) || (defined(CONFIG_DVB_MT312_MODULE) && defined(MODULE)) | 39 | #if defined(CONFIG_DVB_MT312) || (defined(CONFIG_DVB_MT312_MODULE) && defined(MODULE)) |
40 | struct dvb_frontend *vp310_mt312_attach(const struct mt312_config *config, | 40 | struct dvb_frontend *mt312_attach(const struct mt312_config *config, |
41 | struct i2c_adapter *i2c); | 41 | struct i2c_adapter *i2c); |
42 | #else | 42 | #else |
43 | static inline struct dvb_frontend *vp310_mt312_attach( | 43 | static inline struct dvb_frontend *mt312_attach( |
44 | const struct mt312_config *config, struct i2c_adapter *i2c) | 44 | const struct mt312_config *config, struct i2c_adapter *i2c) |
45 | { | 45 | { |
46 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); | 46 | printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); |
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index ae882432dd3d..d4339b1b3b68 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig | |||
@@ -5,6 +5,7 @@ config TTPCI_EEPROM | |||
5 | config DVB_AV7110 | 5 | config DVB_AV7110 |
6 | tristate "AV7110 cards" | 6 | tristate "AV7110 cards" |
7 | depends on DVB_CORE && PCI && I2C | 7 | depends on DVB_CORE && PCI && I2C |
8 | depends on HOTPLUG | ||
8 | select FW_LOADER if !DVB_AV7110_FIRMWARE | 9 | select FW_LOADER if !DVB_AV7110_FIRMWARE |
9 | select TTPCI_EEPROM | 10 | select TTPCI_EEPROM |
10 | select VIDEO_SAA7146_VV | 11 | select VIDEO_SAA7146_VV |
@@ -123,6 +124,7 @@ config DVB_BUDGET_AV | |||
123 | depends on DVB_BUDGET_CORE && I2C | 124 | depends on DVB_BUDGET_CORE && I2C |
124 | select VIDEO_SAA7146_VV | 125 | select VIDEO_SAA7146_VV |
125 | depends on VIDEO_DEV # dependencies of VIDEO_SAA7146_VV | 126 | depends on VIDEO_DEV # dependencies of VIDEO_SAA7146_VV |
127 | depends on HOTPLUG # dependency of FW_LOADER | ||
126 | select DVB_PLL if !DVB_FE_CUSTOMISE | 128 | select DVB_PLL if !DVB_FE_CUSTOMISE |
127 | select DVB_STV0299 if !DVB_FE_CUSTOMISE | 129 | select DVB_STV0299 if !DVB_FE_CUSTOMISE |
128 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE | 130 | select DVB_TDA1004X if !DVB_FE_CUSTOMISE |
diff --git a/drivers/media/dvb/ttusb-dec/Kconfig b/drivers/media/dvb/ttusb-dec/Kconfig index 83611012ef34..0712899e39a4 100644 --- a/drivers/media/dvb/ttusb-dec/Kconfig +++ b/drivers/media/dvb/ttusb-dec/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config DVB_TTUSB_DEC | 1 | config DVB_TTUSB_DEC |
2 | tristate "Technotrend/Hauppauge USB DEC devices" | 2 | tristate "Technotrend/Hauppauge USB DEC devices" |
3 | depends on DVB_CORE && USB | 3 | depends on DVB_CORE && USB |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select FW_LOADER | 5 | select FW_LOADER |
5 | select CRC32 | 6 | select CRC32 |
6 | help | 7 | help |
diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig index fe743aa7f645..89d8d37838a3 100644 --- a/drivers/media/video/Kconfig +++ b/drivers/media/video/Kconfig | |||
@@ -44,6 +44,10 @@ config VIDEO_TVEEPROM | |||
44 | tristate | 44 | tristate |
45 | depends on I2C | 45 | depends on I2C |
46 | 46 | ||
47 | config VIDEO_TUNER | ||
48 | tristate | ||
49 | depends on MEDIA_TUNER | ||
50 | |||
47 | # | 51 | # |
48 | # Multimedia Video device configuration | 52 | # Multimedia Video device configuration |
49 | # | 53 | # |
@@ -690,7 +694,7 @@ config VIDEO_MXB | |||
690 | tristate "Siemens-Nixdorf 'Multimedia eXtension Board'" | 694 | tristate "Siemens-Nixdorf 'Multimedia eXtension Board'" |
691 | depends on PCI && VIDEO_V4L1 && I2C | 695 | depends on PCI && VIDEO_V4L1 && I2C |
692 | select VIDEO_SAA7146_VV | 696 | select VIDEO_SAA7146_VV |
693 | select MEDIA_TUNER | 697 | select VIDEO_TUNER |
694 | select VIDEO_SAA7111 if VIDEO_HELPER_CHIPS_AUTO | 698 | select VIDEO_SAA7111 if VIDEO_HELPER_CHIPS_AUTO |
695 | select VIDEO_TDA9840 if VIDEO_HELPER_CHIPS_AUTO | 699 | select VIDEO_TDA9840 if VIDEO_HELPER_CHIPS_AUTO |
696 | select VIDEO_TEA6415C if VIDEO_HELPER_CHIPS_AUTO | 700 | select VIDEO_TEA6415C if VIDEO_HELPER_CHIPS_AUTO |
@@ -906,7 +910,7 @@ config SOC_CAMERA | |||
906 | 910 | ||
907 | config SOC_CAMERA_MT9M001 | 911 | config SOC_CAMERA_MT9M001 |
908 | tristate "mt9m001 support" | 912 | tristate "mt9m001 support" |
909 | depends on SOC_CAMERA | 913 | depends on SOC_CAMERA && I2C |
910 | select GPIO_PCA953X if MT9M001_PCA9536_SWITCH | 914 | select GPIO_PCA953X if MT9M001_PCA9536_SWITCH |
911 | help | 915 | help |
912 | This driver supports MT9M001 cameras from Micron, monochrome | 916 | This driver supports MT9M001 cameras from Micron, monochrome |
@@ -921,7 +925,7 @@ config MT9M001_PCA9536_SWITCH | |||
921 | 925 | ||
922 | config SOC_CAMERA_MT9V022 | 926 | config SOC_CAMERA_MT9V022 |
923 | tristate "mt9v022 support" | 927 | tristate "mt9v022 support" |
924 | depends on SOC_CAMERA | 928 | depends on SOC_CAMERA && I2C |
925 | select GPIO_PCA953X if MT9V022_PCA9536_SWITCH | 929 | select GPIO_PCA953X if MT9V022_PCA9536_SWITCH |
926 | help | 930 | help |
927 | This driver supports MT9V022 cameras from Micron | 931 | This driver supports MT9V022 cameras from Micron |
diff --git a/drivers/media/video/Makefile b/drivers/media/video/Makefile index a352c6e31f0c..dff0d6abe917 100644 --- a/drivers/media/video/Makefile +++ b/drivers/media/video/Makefile | |||
@@ -84,7 +84,7 @@ obj-$(CONFIG_VIDEO_HEXIUM_GEMINI) += hexium_gemini.o | |||
84 | obj-$(CONFIG_VIDEO_DPC) += dpc7146.o | 84 | obj-$(CONFIG_VIDEO_DPC) += dpc7146.o |
85 | obj-$(CONFIG_TUNER_3036) += tuner-3036.o | 85 | obj-$(CONFIG_TUNER_3036) += tuner-3036.o |
86 | 86 | ||
87 | obj-$(CONFIG_MEDIA_TUNER) += tuner.o | 87 | obj-$(CONFIG_VIDEO_TUNER) += tuner.o |
88 | 88 | ||
89 | obj-$(CONFIG_VIDEOBUF_GEN) += videobuf-core.o | 89 | obj-$(CONFIG_VIDEOBUF_GEN) += videobuf-core.o |
90 | obj-$(CONFIG_VIDEOBUF_DMA_SG) += videobuf-dma-sg.o | 90 | obj-$(CONFIG_VIDEOBUF_DMA_SG) += videobuf-dma-sg.o |
diff --git a/drivers/media/video/au0828/Kconfig b/drivers/media/video/au0828/Kconfig index cab277fafa63..def10d086373 100644 --- a/drivers/media/video/au0828/Kconfig +++ b/drivers/media/video/au0828/Kconfig | |||
@@ -1,8 +1,9 @@ | |||
1 | 1 | ||
2 | config VIDEO_AU0828 | 2 | config VIDEO_AU0828 |
3 | tristate "Auvitek AU0828 support" | 3 | tristate "Auvitek AU0828 support" |
4 | depends on VIDEO_DEV && I2C && INPUT && DVB_CORE | 4 | depends on VIDEO_DEV && I2C && INPUT && DVB_CORE && USB |
5 | select I2C_ALGOBIT | 5 | select I2C_ALGOBIT |
6 | select VIDEO_TVEEPROM | ||
6 | select DVB_AU8522 if !DVB_FE_CUSTOMIZE | 7 | select DVB_AU8522 if !DVB_FE_CUSTOMIZE |
7 | select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMIZE | 8 | select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMIZE |
8 | ---help--- | 9 | ---help--- |
diff --git a/drivers/media/video/au0828/au0828-dvb.c b/drivers/media/video/au0828/au0828-dvb.c index 1371b4e4b5f1..c86a5f17eca8 100644 --- a/drivers/media/video/au0828/au0828-dvb.c +++ b/drivers/media/video/au0828/au0828-dvb.c | |||
@@ -337,12 +337,10 @@ int au0828_dvb_register(struct au0828_dev *dev) | |||
337 | dvb->frontend = dvb_attach(au8522_attach, | 337 | dvb->frontend = dvb_attach(au8522_attach, |
338 | &hauppauge_hvr950q_config, | 338 | &hauppauge_hvr950q_config, |
339 | &dev->i2c_adap); | 339 | &dev->i2c_adap); |
340 | if (dvb->frontend != NULL) { | 340 | if (dvb->frontend != NULL) |
341 | hauppauge_hvr950q_tunerconfig.priv = dev; | ||
342 | dvb_attach(xc5000_attach, dvb->frontend, | 341 | dvb_attach(xc5000_attach, dvb->frontend, |
343 | &dev->i2c_adap, | 342 | &dev->i2c_adap, |
344 | &hauppauge_hvr950q_tunerconfig); | 343 | &hauppauge_hvr950q_tunerconfig, dev); |
345 | } | ||
346 | break; | 344 | break; |
347 | default: | 345 | default: |
348 | printk(KERN_WARNING "The frontend of your DVB/ATSC card " | 346 | printk(KERN_WARNING "The frontend of your DVB/ATSC card " |
diff --git a/drivers/media/video/bt8xx/Kconfig b/drivers/media/video/bt8xx/Kconfig index 7431ef6de9f1..24a34fc1f2b3 100644 --- a/drivers/media/video/bt8xx/Kconfig +++ b/drivers/media/video/bt8xx/Kconfig | |||
@@ -1,12 +1,13 @@ | |||
1 | config VIDEO_BT848 | 1 | config VIDEO_BT848 |
2 | tristate "BT848 Video For Linux" | 2 | tristate "BT848 Video For Linux" |
3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2 && INPUT | 3 | depends on VIDEO_DEV && PCI && I2C && VIDEO_V4L2 && INPUT |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select I2C_ALGOBIT | 5 | select I2C_ALGOBIT |
5 | select FW_LOADER | 6 | select FW_LOADER |
6 | select VIDEO_BTCX | 7 | select VIDEO_BTCX |
7 | select VIDEOBUF_DMA_SG | 8 | select VIDEOBUF_DMA_SG |
8 | select VIDEO_IR | 9 | select VIDEO_IR |
9 | select MEDIA_TUNER | 10 | select VIDEO_TUNER |
10 | select VIDEO_TVEEPROM | 11 | select VIDEO_TVEEPROM |
11 | select VIDEO_MSP3400 if VIDEO_HELPER_CHIPS_AUTO | 12 | select VIDEO_MSP3400 if VIDEO_HELPER_CHIPS_AUTO |
12 | select VIDEO_TVAUDIO if VIDEO_HELPER_CHIPS_AUTO | 13 | select VIDEO_TVAUDIO if VIDEO_HELPER_CHIPS_AUTO |
diff --git a/drivers/media/video/cx18/Kconfig b/drivers/media/video/cx18/Kconfig index acc4b47f1d1d..5f942690570c 100644 --- a/drivers/media/video/cx18/Kconfig +++ b/drivers/media/video/cx18/Kconfig | |||
@@ -1,14 +1,17 @@ | |||
1 | config VIDEO_CX18 | 1 | config VIDEO_CX18 |
2 | tristate "Conexant cx23418 MPEG encoder support" | 2 | tristate "Conexant cx23418 MPEG encoder support" |
3 | depends on VIDEO_V4L2 && DVB_CORE && PCI && I2C && EXPERIMENTAL | 3 | depends on VIDEO_V4L2 && DVB_CORE && PCI && I2C && EXPERIMENTAL |
4 | depends on INPUT # due to VIDEO_IR | ||
5 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select I2C_ALGOBIT | 6 | select I2C_ALGOBIT |
5 | select FW_LOADER | 7 | select FW_LOADER |
6 | select VIDEO_IR | 8 | select VIDEO_IR |
7 | select MEDIA_TUNER | 9 | select VIDEO_TUNER |
8 | select VIDEO_TVEEPROM | 10 | select VIDEO_TVEEPROM |
9 | select VIDEO_CX2341X | 11 | select VIDEO_CX2341X |
10 | select VIDEO_CS5345 | 12 | select VIDEO_CS5345 |
11 | select DVB_S5H1409 | 13 | select DVB_S5H1409 |
14 | select MEDIA_TUNER_MXL5005S | ||
12 | ---help--- | 15 | ---help--- |
13 | This is a video4linux driver for Conexant cx23418 based | 16 | This is a video4linux driver for Conexant cx23418 based |
14 | PCI combo video recorder devices. | 17 | PCI combo video recorder devices. |
diff --git a/drivers/media/video/cx18/cx18-cards.c b/drivers/media/video/cx18/cx18-cards.c index f5e3ba1f5354..553adbf2cd44 100644 --- a/drivers/media/video/cx18/cx18-cards.c +++ b/drivers/media/video/cx18/cx18-cards.c | |||
@@ -47,11 +47,12 @@ static struct cx18_card_tuner_i2c cx18_i2c_std = { | |||
47 | static const struct cx18_card cx18_card_hvr1600_esmt = { | 47 | static const struct cx18_card cx18_card_hvr1600_esmt = { |
48 | .type = CX18_CARD_HVR_1600_ESMT, | 48 | .type = CX18_CARD_HVR_1600_ESMT, |
49 | .name = "Hauppauge HVR-1600", | 49 | .name = "Hauppauge HVR-1600", |
50 | .comment = "DVB & VBI are not yet supported\n", | 50 | .comment = "VBI is not yet supported\n", |
51 | .v4l2_capabilities = CX18_CAP_ENCODER, | 51 | .v4l2_capabilities = CX18_CAP_ENCODER, |
52 | .hw_audio_ctrl = CX18_HW_CX23418, | 52 | .hw_audio_ctrl = CX18_HW_CX23418, |
53 | .hw_muxer = CX18_HW_CS5345, | 53 | .hw_muxer = CX18_HW_CS5345, |
54 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | CX18_HW_CS5345, | 54 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | |
55 | CX18_HW_CS5345 | CX18_HW_DVB, | ||
55 | .video_inputs = { | 56 | .video_inputs = { |
56 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 57 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, |
57 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 58 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, |
@@ -86,11 +87,12 @@ static const struct cx18_card cx18_card_hvr1600_esmt = { | |||
86 | static const struct cx18_card cx18_card_hvr1600_samsung = { | 87 | static const struct cx18_card cx18_card_hvr1600_samsung = { |
87 | .type = CX18_CARD_HVR_1600_SAMSUNG, | 88 | .type = CX18_CARD_HVR_1600_SAMSUNG, |
88 | .name = "Hauppauge HVR-1600 (Preproduction)", | 89 | .name = "Hauppauge HVR-1600 (Preproduction)", |
89 | .comment = "DVB & VBI are not yet supported\n", | 90 | .comment = "VBI is not yet supported\n", |
90 | .v4l2_capabilities = CX18_CAP_ENCODER, | 91 | .v4l2_capabilities = CX18_CAP_ENCODER, |
91 | .hw_audio_ctrl = CX18_HW_CX23418, | 92 | .hw_audio_ctrl = CX18_HW_CX23418, |
92 | .hw_muxer = CX18_HW_CS5345, | 93 | .hw_muxer = CX18_HW_CS5345, |
93 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | CX18_HW_CS5345, | 94 | .hw_all = CX18_HW_TVEEPROM | CX18_HW_TUNER | |
95 | CX18_HW_CS5345 | CX18_HW_DVB, | ||
94 | .video_inputs = { | 96 | .video_inputs = { |
95 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 97 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, |
96 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 98 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, |
@@ -134,14 +136,15 @@ static const struct cx18_card_pci_info cx18_pci_h900[] = { | |||
134 | static const struct cx18_card cx18_card_h900 = { | 136 | static const struct cx18_card cx18_card_h900 = { |
135 | .type = CX18_CARD_COMPRO_H900, | 137 | .type = CX18_CARD_COMPRO_H900, |
136 | .name = "Compro VideoMate H900", | 138 | .name = "Compro VideoMate H900", |
137 | .comment = "Not yet supported!\n", | 139 | .comment = "DVB & VBI are not yet supported\n", |
138 | .v4l2_capabilities = 0, | 140 | .v4l2_capabilities = CX18_CAP_ENCODER, |
139 | .hw_audio_ctrl = CX18_HW_CX23418, | 141 | .hw_audio_ctrl = CX18_HW_CX23418, |
140 | .hw_all = CX18_HW_TUNER, | 142 | .hw_all = CX18_HW_TUNER, |
141 | .video_inputs = { | 143 | .video_inputs = { |
142 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE7 }, | 144 | { CX18_CARD_INPUT_VID_TUNER, 0, CX23418_COMPOSITE2 }, |
143 | { CX18_CARD_INPUT_SVIDEO1, 1, CX23418_SVIDEO1 }, | 145 | { CX18_CARD_INPUT_SVIDEO1, 1, |
144 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE3 }, | 146 | CX23418_SVIDEO_LUMA3 | CX23418_SVIDEO_CHROMA4 }, |
147 | { CX18_CARD_INPUT_COMPOSITE1, 1, CX23418_COMPOSITE1 }, | ||
145 | }, | 148 | }, |
146 | .audio_inputs = { | 149 | .audio_inputs = { |
147 | { CX18_CARD_INPUT_AUD_TUNER, | 150 | { CX18_CARD_INPUT_AUD_TUNER, |
@@ -163,6 +166,7 @@ static const struct cx18_card cx18_card_h900 = { | |||
163 | .tune_lane = 0, | 166 | .tune_lane = 0, |
164 | .initial_emrs = 0, | 167 | .initial_emrs = 0, |
165 | }, | 168 | }, |
169 | .xceive_pin = 15, | ||
166 | .pci_list = cx18_pci_h900, | 170 | .pci_list = cx18_pci_h900, |
167 | .i2c = &cx18_i2c_std, | 171 | .i2c = &cx18_i2c_std, |
168 | }; | 172 | }; |
@@ -200,8 +204,6 @@ static const struct cx18_card cx18_card_mpc718 = { | |||
200 | /* XC3028 tuner */ | 204 | /* XC3028 tuner */ |
201 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, | 205 | { .std = V4L2_STD_ALL, .tuner = TUNER_XC2028 }, |
202 | }, | 206 | }, |
203 | /* tuner reset */ | ||
204 | .gpio_init = { .direction = 0x1000, .initial_value = 0x1000 }, | ||
205 | .ddr = { | 207 | .ddr = { |
206 | /* Probably Samsung K4D263238G-VC33 memory */ | 208 | /* Probably Samsung K4D263238G-VC33 memory */ |
207 | .chip_config = 0x003, | 209 | .chip_config = 0x003, |
@@ -211,6 +213,7 @@ static const struct cx18_card cx18_card_mpc718 = { | |||
211 | .tune_lane = 0, | 213 | .tune_lane = 0, |
212 | .initial_emrs = 2, | 214 | .initial_emrs = 2, |
213 | }, | 215 | }, |
216 | .xceive_pin = 15, | ||
214 | .pci_list = cx18_pci_mpc718, | 217 | .pci_list = cx18_pci_mpc718, |
215 | .i2c = &cx18_i2c_std, | 218 | .i2c = &cx18_i2c_std, |
216 | }; | 219 | }; |
diff --git a/drivers/media/video/cx18/cx18-cards.h b/drivers/media/video/cx18/cx18-cards.h index bca249bdd337..bccb67f0db16 100644 --- a/drivers/media/video/cx18/cx18-cards.h +++ b/drivers/media/video/cx18/cx18-cards.h | |||
@@ -114,8 +114,8 @@ struct cx18_card_pci_info { | |||
114 | /* The mask is the set of bits used by the operation */ | 114 | /* The mask is the set of bits used by the operation */ |
115 | 115 | ||
116 | struct cx18_gpio_init { /* set initial GPIO DIR and OUT values */ | 116 | struct cx18_gpio_init { /* set initial GPIO DIR and OUT values */ |
117 | u16 direction; /* DIR setting. Leave to 0 if no init is needed */ | 117 | u32 direction; /* DIR setting. Leave to 0 if no init is needed */ |
118 | u16 initial_value; | 118 | u32 initial_value; |
119 | }; | 119 | }; |
120 | 120 | ||
121 | struct cx18_card_tuner { | 121 | struct cx18_card_tuner { |
@@ -153,6 +153,7 @@ struct cx18_card { | |||
153 | struct cx18_card_audio_input radio_input; | 153 | struct cx18_card_audio_input radio_input; |
154 | 154 | ||
155 | /* GPIO card-specific settings */ | 155 | /* GPIO card-specific settings */ |
156 | u8 xceive_pin; /* XCeive tuner GPIO reset pin */ | ||
156 | struct cx18_gpio_init gpio_init; | 157 | struct cx18_gpio_init gpio_init; |
157 | 158 | ||
158 | struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS]; | 159 | struct cx18_card_tuner tuners[CX18_CARD_MAX_TUNERS]; |
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 8f5ed9b4bf83..0dd4e0529970 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
@@ -164,16 +164,6 @@ MODULE_LICENSE("GPL"); | |||
164 | 164 | ||
165 | MODULE_VERSION(CX18_VERSION); | 165 | MODULE_VERSION(CX18_VERSION); |
166 | 166 | ||
167 | int cx18_waitq(wait_queue_head_t *waitq) | ||
168 | { | ||
169 | DEFINE_WAIT(wait); | ||
170 | |||
171 | prepare_to_wait(waitq, &wait, TASK_INTERRUPTIBLE); | ||
172 | schedule(); | ||
173 | finish_wait(waitq, &wait); | ||
174 | return signal_pending(current) ? -EINTR : 0; | ||
175 | } | ||
176 | |||
177 | /* Generic utility functions */ | 167 | /* Generic utility functions */ |
178 | int cx18_msleep_timeout(unsigned int msecs, int intr) | 168 | int cx18_msleep_timeout(unsigned int msecs, int intr) |
179 | { | 169 | { |
@@ -220,13 +210,13 @@ static void cx18_process_eeprom(struct cx18 *cx) | |||
220 | 210 | ||
221 | /* Many thanks to Steven Toth from Hauppauge for providing the | 211 | /* Many thanks to Steven Toth from Hauppauge for providing the |
222 | model numbers */ | 212 | model numbers */ |
213 | /* Note: the Samsung memory models cannot be reliably determined | ||
214 | from the model number. Use the cardtype module option if you | ||
215 | have one of these preproduction models. */ | ||
223 | switch (tv.model) { | 216 | switch (tv.model) { |
224 | case 74000 ... 74099: | 217 | case 74000 ... 74999: |
225 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); | 218 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_ESMT); |
226 | break; | 219 | break; |
227 | case 74700 ... 74799: | ||
228 | cx->card = cx18_get_card(CX18_CARD_HVR_1600_SAMSUNG); | ||
229 | break; | ||
230 | case 0: | 220 | case 0: |
231 | CX18_ERR("Invalid EEPROM\n"); | 221 | CX18_ERR("Invalid EEPROM\n"); |
232 | return; | 222 | return; |
@@ -548,6 +538,7 @@ static int cx18_setup_pci(struct cx18 *cx, struct pci_dev *dev, | |||
548 | return 0; | 538 | return 0; |
549 | } | 539 | } |
550 | 540 | ||
541 | #ifdef MODULE | ||
551 | static u32 cx18_request_module(struct cx18 *cx, u32 hw, | 542 | static u32 cx18_request_module(struct cx18 *cx, u32 hw, |
552 | const char *name, u32 id) | 543 | const char *name, u32 id) |
553 | { | 544 | { |
@@ -560,12 +551,14 @@ static u32 cx18_request_module(struct cx18 *cx, u32 hw, | |||
560 | CX18_DEBUG_INFO("Loaded module %s\n", name); | 551 | CX18_DEBUG_INFO("Loaded module %s\n", name); |
561 | return hw; | 552 | return hw; |
562 | } | 553 | } |
554 | #endif | ||
563 | 555 | ||
564 | static void cx18_load_and_init_modules(struct cx18 *cx) | 556 | static void cx18_load_and_init_modules(struct cx18 *cx) |
565 | { | 557 | { |
566 | u32 hw = cx->card->hw_all; | 558 | u32 hw = cx->card->hw_all; |
567 | int i; | 559 | int i; |
568 | 560 | ||
561 | #ifdef MODULE | ||
569 | /* load modules */ | 562 | /* load modules */ |
570 | #ifndef CONFIG_MEDIA_TUNER | 563 | #ifndef CONFIG_MEDIA_TUNER |
571 | hw = cx18_request_module(cx, hw, "tuner", CX18_HW_TUNER); | 564 | hw = cx18_request_module(cx, hw, "tuner", CX18_HW_TUNER); |
@@ -573,6 +566,7 @@ static void cx18_load_and_init_modules(struct cx18 *cx) | |||
573 | #ifndef CONFIG_VIDEO_CS5345 | 566 | #ifndef CONFIG_VIDEO_CS5345 |
574 | hw = cx18_request_module(cx, hw, "cs5345", CX18_HW_CS5345); | 567 | hw = cx18_request_module(cx, hw, "cs5345", CX18_HW_CS5345); |
575 | #endif | 568 | #endif |
569 | #endif | ||
576 | 570 | ||
577 | /* check which i2c devices are actually found */ | 571 | /* check which i2c devices are actually found */ |
578 | for (i = 0; i < 32; i++) { | 572 | for (i = 0; i < 32; i++) { |
@@ -613,7 +607,7 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
613 | } | 607 | } |
614 | 608 | ||
615 | cx = kzalloc(sizeof(struct cx18), GFP_ATOMIC); | 609 | cx = kzalloc(sizeof(struct cx18), GFP_ATOMIC); |
616 | if (cx == 0) { | 610 | if (!cx) { |
617 | spin_unlock(&cx18_cards_lock); | 611 | spin_unlock(&cx18_cards_lock); |
618 | return -ENOMEM; | 612 | return -ENOMEM; |
619 | } | 613 | } |
@@ -801,7 +795,7 @@ static int __devinit cx18_probe(struct pci_dev *dev, | |||
801 | return 0; | 795 | return 0; |
802 | 796 | ||
803 | free_streams: | 797 | free_streams: |
804 | cx18_streams_cleanup(cx); | 798 | cx18_streams_cleanup(cx, 1); |
805 | free_irq: | 799 | free_irq: |
806 | free_irq(cx->dev->irq, (void *)cx); | 800 | free_irq(cx->dev->irq, (void *)cx); |
807 | free_i2c: | 801 | free_i2c: |
@@ -904,14 +898,13 @@ static void cx18_remove(struct pci_dev *pci_dev) | |||
904 | 898 | ||
905 | cx18_halt_firmware(cx); | 899 | cx18_halt_firmware(cx); |
906 | 900 | ||
907 | cx18_streams_cleanup(cx); | 901 | cx18_streams_cleanup(cx, 1); |
908 | 902 | ||
909 | exit_cx18_i2c(cx); | 903 | exit_cx18_i2c(cx); |
910 | 904 | ||
911 | free_irq(cx->dev->irq, (void *)cx); | 905 | free_irq(cx->dev->irq, (void *)cx); |
912 | 906 | ||
913 | if (cx->dev) | 907 | cx18_iounmap(cx); |
914 | cx18_iounmap(cx); | ||
915 | 908 | ||
916 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); | 909 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); |
917 | 910 | ||
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index 2ee939193bb7..a2a6c58d12fe 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
@@ -444,9 +444,6 @@ extern spinlock_t cx18_cards_lock; | |||
444 | /* Return non-zero if a signal is pending */ | 444 | /* Return non-zero if a signal is pending */ |
445 | int cx18_msleep_timeout(unsigned int msecs, int intr); | 445 | int cx18_msleep_timeout(unsigned int msecs, int intr); |
446 | 446 | ||
447 | /* Wait on queue, returns -EINTR if interrupted */ | ||
448 | int cx18_waitq(wait_queue_head_t *waitq); | ||
449 | |||
450 | /* Read Hauppauge eeprom */ | 447 | /* Read Hauppauge eeprom */ |
451 | struct tveeprom; /* forward reference */ | 448 | struct tveeprom; /* forward reference */ |
452 | void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv); | 449 | void cx18_read_eeprom(struct cx18 *cx, struct tveeprom *tv); |
diff --git a/drivers/media/video/cx18/cx18-dvb.c b/drivers/media/video/cx18/cx18-dvb.c index 65efe69d939a..c9744173f969 100644 --- a/drivers/media/video/cx18/cx18-dvb.c +++ b/drivers/media/video/cx18/cx18-dvb.c | |||
@@ -24,25 +24,27 @@ | |||
24 | #include "cx18-streams.h" | 24 | #include "cx18-streams.h" |
25 | #include "cx18-cards.h" | 25 | #include "cx18-cards.h" |
26 | #include "s5h1409.h" | 26 | #include "s5h1409.h" |
27 | 27 | #include "mxl5005s.h" | |
28 | /* Wait until the MXL500X driver is merged */ | ||
29 | #ifdef HAVE_MXL500X | ||
30 | #include "mxl500x.h" | ||
31 | #endif | ||
32 | 28 | ||
33 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 29 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
34 | 30 | ||
35 | #define CX18_REG_DMUX_NUM_PORT_0_CONTROL 0xd5a000 | 31 | #define CX18_REG_DMUX_NUM_PORT_0_CONTROL 0xd5a000 |
36 | 32 | ||
37 | #ifdef HAVE_MXL500X | 33 | static struct mxl5005s_config hauppauge_hvr1600_tuner = { |
38 | static struct mxl500x_config hauppauge_hvr1600_tuner = { | 34 | .i2c_address = 0xC6 >> 1, |
39 | .delsys = MXL500x_MODE_ATSC, | 35 | .if_freq = IF_FREQ_5380000HZ, |
40 | .octf = MXL500x_OCTF_CH, | 36 | .xtal_freq = CRYSTAL_FREQ_16000000HZ, |
41 | .xtal_freq = 16000000, | 37 | .agc_mode = MXL_SINGLE_AGC, |
42 | .iflo_freq = 5380000, | 38 | .tracking_filter = MXL_TF_C_H, |
43 | .ref_freq = 322800000, | 39 | .rssi_enable = MXL_RSSI_ENABLE, |
44 | .rssi_ena = MXL_RSSI_ENABLE, | 40 | .cap_select = MXL_CAP_SEL_ENABLE, |
45 | .addr = 0xC6 >> 1, | 41 | .div_out = MXL_DIV_OUT_4, |
42 | .clock_out = MXL_CLOCK_OUT_DISABLE, | ||
43 | .output_load = MXL5005S_IF_OUTPUT_LOAD_200_OHM, | ||
44 | .top = MXL5005S_TOP_25P2, | ||
45 | .mod_mode = MXL_DIGITAL_MODE, | ||
46 | .if_mode = MXL_ZERO_IF, | ||
47 | .AgcMasterByte = 0x00, | ||
46 | }; | 48 | }; |
47 | 49 | ||
48 | static struct s5h1409_config hauppauge_hvr1600_config = { | 50 | static struct s5h1409_config hauppauge_hvr1600_config = { |
@@ -55,7 +57,6 @@ static struct s5h1409_config hauppauge_hvr1600_config = { | |||
55 | .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK | 57 | .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK |
56 | 58 | ||
57 | }; | 59 | }; |
58 | #endif | ||
59 | 60 | ||
60 | static int dvb_register(struct cx18_stream *stream); | 61 | static int dvb_register(struct cx18_stream *stream); |
61 | 62 | ||
@@ -252,21 +253,18 @@ static int dvb_register(struct cx18_stream *stream) | |||
252 | int ret = 0; | 253 | int ret = 0; |
253 | 254 | ||
254 | switch (cx->card->type) { | 255 | switch (cx->card->type) { |
255 | /* Wait until the MXL500X driver is merged */ | ||
256 | #ifdef HAVE_MXL500X | ||
257 | case CX18_CARD_HVR_1600_ESMT: | 256 | case CX18_CARD_HVR_1600_ESMT: |
258 | case CX18_CARD_HVR_1600_SAMSUNG: | 257 | case CX18_CARD_HVR_1600_SAMSUNG: |
259 | dvb->fe = dvb_attach(s5h1409_attach, | 258 | dvb->fe = dvb_attach(s5h1409_attach, |
260 | &hauppauge_hvr1600_config, | 259 | &hauppauge_hvr1600_config, |
261 | &cx->i2c_adap[0]); | 260 | &cx->i2c_adap[0]); |
262 | if (dvb->fe != NULL) { | 261 | if (dvb->fe != NULL) { |
263 | dvb_attach(mxl500x_attach, dvb->fe, | 262 | dvb_attach(mxl5005s_attach, dvb->fe, |
264 | &hauppauge_hvr1600_tuner, | 263 | &cx->i2c_adap[0], |
265 | &cx->i2c_adap[0]); | 264 | &hauppauge_hvr1600_tuner); |
266 | ret = 0; | 265 | ret = 0; |
267 | } | 266 | } |
268 | break; | 267 | break; |
269 | #endif | ||
270 | default: | 268 | default: |
271 | /* No Digital Tv Support */ | 269 | /* No Digital Tv Support */ |
272 | break; | 270 | break; |
diff --git a/drivers/media/video/cx18/cx18-fileops.c b/drivers/media/video/cx18/cx18-fileops.c index 69303065a294..0b3141db174b 100644 --- a/drivers/media/video/cx18/cx18-fileops.c +++ b/drivers/media/video/cx18/cx18-fileops.c | |||
@@ -39,7 +39,7 @@ | |||
39 | associated VBI streams are also automatically claimed. | 39 | associated VBI streams are also automatically claimed. |
40 | Possible error returns: -EBUSY if someone else has claimed | 40 | Possible error returns: -EBUSY if someone else has claimed |
41 | the stream or 0 on success. */ | 41 | the stream or 0 on success. */ |
42 | int cx18_claim_stream(struct cx18_open_id *id, int type) | 42 | static int cx18_claim_stream(struct cx18_open_id *id, int type) |
43 | { | 43 | { |
44 | struct cx18 *cx = id->cx; | 44 | struct cx18 *cx = id->cx; |
45 | struct cx18_stream *s = &cx->streams[type]; | 45 | struct cx18_stream *s = &cx->streams[type]; |
@@ -87,7 +87,7 @@ int cx18_claim_stream(struct cx18_open_id *id, int type) | |||
87 | 87 | ||
88 | /* This function releases a previously claimed stream. It will take into | 88 | /* This function releases a previously claimed stream. It will take into |
89 | account associated VBI streams. */ | 89 | account associated VBI streams. */ |
90 | void cx18_release_stream(struct cx18_stream *s) | 90 | static void cx18_release_stream(struct cx18_stream *s) |
91 | { | 91 | { |
92 | struct cx18 *cx = s->cx; | 92 | struct cx18 *cx = s->cx; |
93 | struct cx18_stream *s_vbi; | 93 | struct cx18_stream *s_vbi; |
@@ -662,6 +662,8 @@ int cx18_v4l2_open(struct inode *inode, struct file *filp) | |||
662 | for (x = 0; cx == NULL && x < cx18_cards_active; x++) { | 662 | for (x = 0; cx == NULL && x < cx18_cards_active; x++) { |
663 | /* find out which stream this open was on */ | 663 | /* find out which stream this open was on */ |
664 | for (y = 0; y < CX18_MAX_STREAMS; y++) { | 664 | for (y = 0; y < CX18_MAX_STREAMS; y++) { |
665 | if (cx18_cards[x] == NULL) | ||
666 | continue; | ||
665 | s = &cx18_cards[x]->streams[y]; | 667 | s = &cx18_cards[x]->streams[y]; |
666 | if (s->v4l2dev && s->v4l2dev->minor == minor) { | 668 | if (s->v4l2dev && s->v4l2dev->minor == minor) { |
667 | cx = cx18_cards[x]; | 669 | cx = cx18_cards[x]; |
diff --git a/drivers/media/video/cx18/cx18-fileops.h b/drivers/media/video/cx18/cx18-fileops.h index 16cdafbd24c5..46da0282fc7d 100644 --- a/drivers/media/video/cx18/cx18-fileops.h +++ b/drivers/media/video/cx18/cx18-fileops.h | |||
@@ -34,12 +34,3 @@ void cx18_stop_capture(struct cx18_open_id *id, int gop_end); | |||
34 | void cx18_mute(struct cx18 *cx); | 34 | void cx18_mute(struct cx18 *cx); |
35 | void cx18_unmute(struct cx18 *cx); | 35 | void cx18_unmute(struct cx18 *cx); |
36 | 36 | ||
37 | /* Utilities */ | ||
38 | |||
39 | /* Try to claim a stream for the filehandle. Return 0 on success, | ||
40 | -EBUSY if stream already claimed. Once a stream is claimed, it | ||
41 | remains claimed until the associated filehandle is closed. */ | ||
42 | int cx18_claim_stream(struct cx18_open_id *id, int type); | ||
43 | |||
44 | /* Release a previously claimed stream. */ | ||
45 | void cx18_release_stream(struct cx18_stream *s); | ||
diff --git a/drivers/media/video/cx18/cx18-gpio.c b/drivers/media/video/cx18/cx18-gpio.c index 19253e6b8673..bb8bc86086d0 100644 --- a/drivers/media/video/cx18/cx18-gpio.c +++ b/drivers/media/video/cx18/cx18-gpio.c | |||
@@ -35,6 +35,9 @@ | |||
35 | #define CX18_REG_GPIO_OUT2 0xc78104 | 35 | #define CX18_REG_GPIO_OUT2 0xc78104 |
36 | #define CX18_REG_GPIO_DIR2 0xc7810c | 36 | #define CX18_REG_GPIO_DIR2 0xc7810c |
37 | 37 | ||
38 | static u32 gpio_dir; | ||
39 | static u32 gpio_val; | ||
40 | |||
38 | /* | 41 | /* |
39 | * HVR-1600 GPIO pins, courtesy of Hauppauge: | 42 | * HVR-1600 GPIO pins, courtesy of Hauppauge: |
40 | * | 43 | * |
@@ -44,31 +47,53 @@ | |||
44 | * gpio13: cs5345 reset pin | 47 | * gpio13: cs5345 reset pin |
45 | */ | 48 | */ |
46 | 49 | ||
50 | static void gpio_write(struct cx18 *cx) | ||
51 | { | ||
52 | write_reg((gpio_dir & 0xffff) << 16, CX18_REG_GPIO_DIR1); | ||
53 | write_reg(((gpio_dir & 0xffff) << 16) | (gpio_val & 0xffff), | ||
54 | CX18_REG_GPIO_OUT1); | ||
55 | write_reg(gpio_dir & 0xffff0000, CX18_REG_GPIO_DIR2); | ||
56 | write_reg((gpio_dir & 0xffff0000) | ((gpio_val & 0xffff0000) >> 16), | ||
57 | CX18_REG_GPIO_OUT2); | ||
58 | } | ||
59 | |||
47 | void cx18_gpio_init(struct cx18 *cx) | 60 | void cx18_gpio_init(struct cx18 *cx) |
48 | { | 61 | { |
49 | if (cx->card->gpio_init.direction == 0) | 62 | gpio_dir = cx->card->gpio_init.direction; |
63 | gpio_val = cx->card->gpio_init.initial_value; | ||
64 | |||
65 | if (gpio_dir == 0) | ||
50 | return; | 66 | return; |
51 | 67 | ||
52 | CX18_DEBUG_INFO("GPIO initial dir: %08x out: %08x\n", | 68 | gpio_dir |= 1 << cx->card->xceive_pin; |
53 | read_reg(CX18_REG_GPIO_DIR1), read_reg(CX18_REG_GPIO_OUT1)); | 69 | gpio_val |= 1 << cx->card->xceive_pin; |
54 | 70 | ||
55 | /* init output data then direction */ | 71 | CX18_DEBUG_INFO("GPIO initial dir: %08x/%08x out: %08x/%08x\n", |
56 | write_reg(cx->card->gpio_init.direction << 16, CX18_REG_GPIO_DIR1); | 72 | read_reg(CX18_REG_GPIO_DIR1), read_reg(CX18_REG_GPIO_DIR2), |
57 | write_reg(0, CX18_REG_GPIO_DIR2); | 73 | read_reg(CX18_REG_GPIO_OUT1), read_reg(CX18_REG_GPIO_OUT2)); |
58 | write_reg((cx->card->gpio_init.direction << 16) | | 74 | |
59 | cx->card->gpio_init.initial_value, CX18_REG_GPIO_OUT1); | 75 | gpio_write(cx); |
60 | write_reg(0, CX18_REG_GPIO_OUT2); | ||
61 | } | 76 | } |
62 | 77 | ||
63 | /* Xceive tuner reset function */ | 78 | /* Xceive tuner reset function */ |
64 | int cx18_reset_tuner_gpio(void *dev, int cmd, int value) | 79 | int cx18_reset_tuner_gpio(void *dev, int cmd, int value) |
65 | { | 80 | { |
66 | struct i2c_algo_bit_data *algo = dev; | 81 | struct i2c_algo_bit_data *algo = dev; |
67 | struct cx18 *cx = algo->data; | 82 | struct cx18_i2c_algo_callback_data *cb_data = algo->data; |
68 | /* int curdir, curout;*/ | 83 | struct cx18 *cx = cb_data->cx; |
69 | 84 | ||
70 | if (cmd != XC2028_TUNER_RESET) | 85 | if (cmd != XC2028_TUNER_RESET) |
71 | return 0; | 86 | return 0; |
72 | CX18_DEBUG_INFO("Resetting tuner\n"); | 87 | CX18_DEBUG_INFO("Resetting tuner\n"); |
88 | |||
89 | gpio_dir |= 1 << cx->card->xceive_pin; | ||
90 | gpio_val &= ~(1 << cx->card->xceive_pin); | ||
91 | |||
92 | gpio_write(cx); | ||
93 | schedule_timeout_interruptible(msecs_to_jiffies(1)); | ||
94 | |||
95 | gpio_val |= 1 << cx->card->xceive_pin; | ||
96 | gpio_write(cx); | ||
97 | schedule_timeout_interruptible(msecs_to_jiffies(1)); | ||
73 | return 0; | 98 | return 0; |
74 | } | 99 | } |
diff --git a/drivers/media/video/cx18/cx18-i2c.c b/drivers/media/video/cx18/cx18-i2c.c index 18c88d1e4833..4f08a4058d1a 100644 --- a/drivers/media/video/cx18/cx18-i2c.c +++ b/drivers/media/video/cx18/cx18-i2c.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include "cx18-cards.h" | 25 | #include "cx18-cards.h" |
26 | #include "cx18-gpio.h" | 26 | #include "cx18-gpio.h" |
27 | #include "cx18-av-core.h" | 27 | #include "cx18-av-core.h" |
28 | #include "cx18-i2c.h" | ||
28 | 29 | ||
29 | #include <media/ir-kbd-i2c.h> | 30 | #include <media/ir-kbd-i2c.h> |
30 | 31 | ||
diff --git a/drivers/media/video/cx18/cx18-queue.c b/drivers/media/video/cx18/cx18-queue.c index 65af1bb507ca..6990b77c6200 100644 --- a/drivers/media/video/cx18/cx18-queue.c +++ b/drivers/media/video/cx18/cx18-queue.c | |||
@@ -26,17 +26,6 @@ | |||
26 | #include "cx18-queue.h" | 26 | #include "cx18-queue.h" |
27 | #include "cx18-scb.h" | 27 | #include "cx18-scb.h" |
28 | 28 | ||
29 | int cx18_buf_copy_from_user(struct cx18_stream *s, struct cx18_buffer *buf, | ||
30 | const char __user *src, int copybytes) | ||
31 | { | ||
32 | if (s->buf_size - buf->bytesused < copybytes) | ||
33 | copybytes = s->buf_size - buf->bytesused; | ||
34 | if (copy_from_user(buf->buf + buf->bytesused, src, copybytes)) | ||
35 | return -EFAULT; | ||
36 | buf->bytesused += copybytes; | ||
37 | return copybytes; | ||
38 | } | ||
39 | |||
40 | void cx18_buf_swap(struct cx18_buffer *buf) | 29 | void cx18_buf_swap(struct cx18_buffer *buf) |
41 | { | 30 | { |
42 | int i; | 31 | int i; |
@@ -159,8 +148,9 @@ static void cx18_queue_move_buf(struct cx18_stream *s, struct cx18_queue *from, | |||
159 | -ENOMEM is returned if the buffers could not be obtained, 0 if all | 148 | -ENOMEM is returned if the buffers could not be obtained, 0 if all |
160 | buffers where obtained from the 'from' list and if non-zero then | 149 | buffers where obtained from the 'from' list and if non-zero then |
161 | the number of stolen buffers is returned. */ | 150 | the number of stolen buffers is returned. */ |
162 | int cx18_queue_move(struct cx18_stream *s, struct cx18_queue *from, | 151 | static int cx18_queue_move(struct cx18_stream *s, struct cx18_queue *from, |
163 | struct cx18_queue *steal, struct cx18_queue *to, int needed_bytes) | 152 | struct cx18_queue *steal, struct cx18_queue *to, |
153 | int needed_bytes) | ||
164 | { | 154 | { |
165 | unsigned long flags; | 155 | unsigned long flags; |
166 | int rc = 0; | 156 | int rc = 0; |
@@ -239,12 +229,12 @@ int cx18_stream_alloc(struct cx18_stream *s) | |||
239 | 229 | ||
240 | /* allocate stream buffers. Initially all buffers are in q_free. */ | 230 | /* allocate stream buffers. Initially all buffers are in q_free. */ |
241 | for (i = 0; i < s->buffers; i++) { | 231 | for (i = 0; i < s->buffers; i++) { |
242 | struct cx18_buffer *buf = | 232 | struct cx18_buffer *buf = kzalloc(sizeof(struct cx18_buffer), |
243 | kzalloc(sizeof(struct cx18_buffer), GFP_KERNEL); | 233 | GFP_KERNEL|__GFP_NOWARN); |
244 | 234 | ||
245 | if (buf == NULL) | 235 | if (buf == NULL) |
246 | break; | 236 | break; |
247 | buf->buf = kmalloc(s->buf_size, GFP_KERNEL); | 237 | buf->buf = kmalloc(s->buf_size, GFP_KERNEL|__GFP_NOWARN); |
248 | if (buf->buf == NULL) { | 238 | if (buf->buf == NULL) { |
249 | kfree(buf); | 239 | kfree(buf); |
250 | break; | 240 | break; |
diff --git a/drivers/media/video/cx18/cx18-queue.h b/drivers/media/video/cx18/cx18-queue.h index f86c8a6fa6e7..91423b9863a4 100644 --- a/drivers/media/video/cx18/cx18-queue.h +++ b/drivers/media/video/cx18/cx18-queue.h | |||
@@ -39,8 +39,6 @@ static inline void cx18_buf_sync_for_device(struct cx18_stream *s, | |||
39 | s->buf_size, s->dma); | 39 | s->buf_size, s->dma); |
40 | } | 40 | } |
41 | 41 | ||
42 | int cx18_buf_copy_from_user(struct cx18_stream *s, struct cx18_buffer *buf, | ||
43 | const char __user *src, int copybytes); | ||
44 | void cx18_buf_swap(struct cx18_buffer *buf); | 42 | void cx18_buf_swap(struct cx18_buffer *buf); |
45 | 43 | ||
46 | /* cx18_queue utility functions */ | 44 | /* cx18_queue utility functions */ |
@@ -48,8 +46,6 @@ void cx18_queue_init(struct cx18_queue *q); | |||
48 | void cx18_enqueue(struct cx18_stream *s, struct cx18_buffer *buf, | 46 | void cx18_enqueue(struct cx18_stream *s, struct cx18_buffer *buf, |
49 | struct cx18_queue *q); | 47 | struct cx18_queue *q); |
50 | struct cx18_buffer *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q); | 48 | struct cx18_buffer *cx18_dequeue(struct cx18_stream *s, struct cx18_queue *q); |
51 | int cx18_queue_move(struct cx18_stream *s, struct cx18_queue *from, | ||
52 | struct cx18_queue *steal, struct cx18_queue *to, int needed_bytes); | ||
53 | struct cx18_buffer *cx18_queue_find_buf(struct cx18_stream *s, u32 id, | 49 | struct cx18_buffer *cx18_queue_find_buf(struct cx18_stream *s, u32 id, |
54 | u32 bytesused); | 50 | u32 bytesused); |
55 | void cx18_flush_queues(struct cx18_stream *s); | 51 | void cx18_flush_queues(struct cx18_stream *s); |
diff --git a/drivers/media/video/cx18/cx18-streams.c b/drivers/media/video/cx18/cx18-streams.c index afb141b2027a..4ca9d847f1b1 100644 --- a/drivers/media/video/cx18/cx18-streams.c +++ b/drivers/media/video/cx18/cx18-streams.c | |||
@@ -218,7 +218,7 @@ int cx18_streams_setup(struct cx18 *cx) | |||
218 | return 0; | 218 | return 0; |
219 | 219 | ||
220 | /* One or more streams could not be initialized. Clean 'em all up. */ | 220 | /* One or more streams could not be initialized. Clean 'em all up. */ |
221 | cx18_streams_cleanup(cx); | 221 | cx18_streams_cleanup(cx, 0); |
222 | return -ENOMEM; | 222 | return -ENOMEM; |
223 | } | 223 | } |
224 | 224 | ||
@@ -296,12 +296,12 @@ int cx18_streams_register(struct cx18 *cx) | |||
296 | return 0; | 296 | return 0; |
297 | 297 | ||
298 | /* One or more streams could not be initialized. Clean 'em all up. */ | 298 | /* One or more streams could not be initialized. Clean 'em all up. */ |
299 | cx18_streams_cleanup(cx); | 299 | cx18_streams_cleanup(cx, 1); |
300 | return -ENOMEM; | 300 | return -ENOMEM; |
301 | } | 301 | } |
302 | 302 | ||
303 | /* Unregister v4l2 devices */ | 303 | /* Unregister v4l2 devices */ |
304 | void cx18_streams_cleanup(struct cx18 *cx) | 304 | void cx18_streams_cleanup(struct cx18 *cx, int unregister) |
305 | { | 305 | { |
306 | struct video_device *vdev; | 306 | struct video_device *vdev; |
307 | int type; | 307 | int type; |
@@ -319,8 +319,11 @@ void cx18_streams_cleanup(struct cx18 *cx) | |||
319 | 319 | ||
320 | cx18_stream_free(&cx->streams[type]); | 320 | cx18_stream_free(&cx->streams[type]); |
321 | 321 | ||
322 | /* Unregister device */ | 322 | /* Unregister or release device */ |
323 | video_unregister_device(vdev); | 323 | if (unregister) |
324 | video_unregister_device(vdev); | ||
325 | else | ||
326 | video_device_release(vdev); | ||
324 | } | 327 | } |
325 | } | 328 | } |
326 | 329 | ||
diff --git a/drivers/media/video/cx18/cx18-streams.h b/drivers/media/video/cx18/cx18-streams.h index 8c7ba7d2fa79..f327e947b24f 100644 --- a/drivers/media/video/cx18/cx18-streams.h +++ b/drivers/media/video/cx18/cx18-streams.h | |||
@@ -24,7 +24,7 @@ | |||
24 | u32 cx18_find_handle(struct cx18 *cx); | 24 | u32 cx18_find_handle(struct cx18 *cx); |
25 | int cx18_streams_setup(struct cx18 *cx); | 25 | int cx18_streams_setup(struct cx18 *cx); |
26 | int cx18_streams_register(struct cx18 *cx); | 26 | int cx18_streams_register(struct cx18 *cx); |
27 | void cx18_streams_cleanup(struct cx18 *cx); | 27 | void cx18_streams_cleanup(struct cx18 *cx, int unregister); |
28 | 28 | ||
29 | /* Capture related */ | 29 | /* Capture related */ |
30 | int cx18_start_v4l2_encode_stream(struct cx18_stream *s); | 30 | int cx18_start_v4l2_encode_stream(struct cx18_stream *s); |
diff --git a/drivers/media/video/cx23885/Kconfig b/drivers/media/video/cx23885/Kconfig index cadf936c3673..7bf14c9a15c7 100644 --- a/drivers/media/video/cx23885/Kconfig +++ b/drivers/media/video/cx23885/Kconfig | |||
@@ -1,18 +1,20 @@ | |||
1 | config VIDEO_CX23885 | 1 | config VIDEO_CX23885 |
2 | tristate "Conexant cx23885 (2388x successor) support" | 2 | tristate "Conexant cx23885 (2388x successor) support" |
3 | depends on DVB_CORE && VIDEO_DEV && PCI && I2C && INPUT | 3 | depends on DVB_CORE && VIDEO_DEV && PCI && I2C && INPUT |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select I2C_ALGOBIT | 5 | select I2C_ALGOBIT |
5 | select FW_LOADER | 6 | select FW_LOADER |
6 | select VIDEO_BTCX | 7 | select VIDEO_BTCX |
7 | select MEDIA_TUNER | 8 | select VIDEO_TUNER |
8 | select VIDEO_TVEEPROM | 9 | select VIDEO_TVEEPROM |
9 | select VIDEO_IR | 10 | select VIDEO_IR |
10 | select VIDEOBUF_DVB | 11 | select VIDEOBUF_DVB |
11 | select VIDEO_CX25840 | 12 | select VIDEO_CX25840 |
13 | select VIDEO_CX2341X | ||
14 | select DVB_DIB7000P if !DVB_FE_CUSTOMISE | ||
12 | select MEDIA_TUNER_MT2131 if !DVB_FE_CUSTOMISE | 15 | select MEDIA_TUNER_MT2131 if !DVB_FE_CUSTOMISE |
13 | select DVB_S5H1409 if !DVB_FE_CUSTOMISE | 16 | select DVB_S5H1409 if !DVB_FE_CUSTOMISE |
14 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE | 17 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE |
15 | select DVB_PLL if !DVB_FE_CUSTOMISE | ||
16 | select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE | 18 | select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMIZE |
17 | select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE | 19 | select MEDIA_TUNER_TDA8290 if !DVB_FE_CUSTOMIZE |
18 | select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE | 20 | select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMIZE |
diff --git a/drivers/media/video/cx23885/cx23885-cards.c b/drivers/media/video/cx23885/cx23885-cards.c index 6ebf58724a01..20e05f230546 100644 --- a/drivers/media/video/cx23885/cx23885-cards.c +++ b/drivers/media/video/cx23885/cx23885-cards.c | |||
@@ -200,6 +200,10 @@ struct cx23885_subid cx23885_subids[] = { | |||
200 | .card = CX23885_BOARD_HAUPPAUGE_HVR1200, | 200 | .card = CX23885_BOARD_HAUPPAUGE_HVR1200, |
201 | }, { | 201 | }, { |
202 | .subvendor = 0x0070, | 202 | .subvendor = 0x0070, |
203 | .subdevice = 0x71d3, | ||
204 | .card = CX23885_BOARD_HAUPPAUGE_HVR1200, | ||
205 | }, { | ||
206 | .subvendor = 0x0070, | ||
203 | .subdevice = 0x8101, | 207 | .subdevice = 0x8101, |
204 | .card = CX23885_BOARD_HAUPPAUGE_HVR1700, | 208 | .card = CX23885_BOARD_HAUPPAUGE_HVR1700, |
205 | }, { | 209 | }, { |
@@ -245,6 +249,33 @@ static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data) | |||
245 | /* Make sure we support the board model */ | 249 | /* Make sure we support the board model */ |
246 | switch (tv.model) | 250 | switch (tv.model) |
247 | { | 251 | { |
252 | case 71009: | ||
253 | /* WinTV-HVR1200 (PCIe, Retail, full height) | ||
254 | * DVB-T and basic analog */ | ||
255 | case 71359: | ||
256 | /* WinTV-HVR1200 (PCIe, OEM, half height) | ||
257 | * DVB-T and basic analog */ | ||
258 | case 71439: | ||
259 | /* WinTV-HVR1200 (PCIe, OEM, half height) | ||
260 | * DVB-T and basic analog */ | ||
261 | case 71449: | ||
262 | /* WinTV-HVR1200 (PCIe, OEM, full height) | ||
263 | * DVB-T and basic analog */ | ||
264 | case 71939: | ||
265 | /* WinTV-HVR1200 (PCIe, OEM, half height) | ||
266 | * DVB-T and basic analog */ | ||
267 | case 71949: | ||
268 | /* WinTV-HVR1200 (PCIe, OEM, full height) | ||
269 | * DVB-T and basic analog */ | ||
270 | case 71959: | ||
271 | /* WinTV-HVR1200 (PCIe, OEM, full height) | ||
272 | * DVB-T and basic analog */ | ||
273 | case 71979: | ||
274 | /* WinTV-HVR1200 (PCIe, OEM, half height) | ||
275 | * DVB-T and basic analog */ | ||
276 | case 71999: | ||
277 | /* WinTV-HVR1200 (PCIe, OEM, full height) | ||
278 | * DVB-T and basic analog */ | ||
248 | case 76601: /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual channel ATSC and MPEG2 HW Encoder */ | 279 | case 76601: /* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual channel ATSC and MPEG2 HW Encoder */ |
249 | case 77001: /* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC and Basic analog */ | 280 | case 77001: /* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC and Basic analog */ |
250 | case 77011: /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC and Basic analog */ | 281 | case 77011: /* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC and Basic analog */ |
@@ -263,8 +294,11 @@ static void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data) | |||
263 | case 80019: | 294 | case 80019: |
264 | /* WinTV-HVR1400 (Express Card, Retail, IR, | 295 | /* WinTV-HVR1400 (Express Card, Retail, IR, |
265 | * DVB-T and Basic analog */ | 296 | * DVB-T and Basic analog */ |
297 | case 81509: | ||
298 | /* WinTV-HVR1700 (PCIe, OEM, No IR, half height) | ||
299 | * DVB-T and MPEG2 HW Encoder */ | ||
266 | case 81519: | 300 | case 81519: |
267 | /* WinTV-HVR1700 (PCIe, Retail, No IR, half height, | 301 | /* WinTV-HVR1700 (PCIe, OEM, No IR, full height) |
268 | * DVB-T and MPEG2 HW Encoder */ | 302 | * DVB-T and MPEG2 HW Encoder */ |
269 | break; | 303 | break; |
270 | default: | 304 | default: |
diff --git a/drivers/media/video/cx23885/cx23885-dvb.c b/drivers/media/video/cx23885/cx23885-dvb.c index f05649727b60..022aa391937a 100644 --- a/drivers/media/video/cx23885/cx23885-dvb.c +++ b/drivers/media/video/cx23885/cx23885-dvb.c | |||
@@ -37,7 +37,6 @@ | |||
37 | #include "lgdt330x.h" | 37 | #include "lgdt330x.h" |
38 | #include "xc5000.h" | 38 | #include "xc5000.h" |
39 | #include "tda10048.h" | 39 | #include "tda10048.h" |
40 | #include "dvb-pll.h" | ||
41 | #include "tuner-xc2028.h" | 40 | #include "tuner-xc2028.h" |
42 | #include "tuner-simple.h" | 41 | #include "tuner-simple.h" |
43 | #include "dib7000p.h" | 42 | #include "dib7000p.h" |
@@ -385,12 +384,10 @@ static int dvb_register(struct cx23885_tsport *port) | |||
385 | port->dvb.frontend = dvb_attach(s5h1409_attach, | 384 | port->dvb.frontend = dvb_attach(s5h1409_attach, |
386 | &hauppauge_hvr1500q_config, | 385 | &hauppauge_hvr1500q_config, |
387 | &dev->i2c_bus[0].i2c_adap); | 386 | &dev->i2c_bus[0].i2c_adap); |
388 | if (port->dvb.frontend != NULL) { | 387 | if (port->dvb.frontend != NULL) |
389 | hauppauge_hvr1500q_tunerconfig.priv = i2c_bus; | ||
390 | dvb_attach(xc5000_attach, port->dvb.frontend, | 388 | dvb_attach(xc5000_attach, port->dvb.frontend, |
391 | &i2c_bus->i2c_adap, | 389 | &i2c_bus->i2c_adap, |
392 | &hauppauge_hvr1500q_tunerconfig); | 390 | &hauppauge_hvr1500q_tunerconfig, i2c_bus); |
393 | } | ||
394 | break; | 391 | break; |
395 | case CX23885_BOARD_HAUPPAUGE_HVR1500: | 392 | case CX23885_BOARD_HAUPPAUGE_HVR1500: |
396 | i2c_bus = &dev->i2c_bus[1]; | 393 | i2c_bus = &dev->i2c_bus[1]; |
diff --git a/drivers/media/video/cx25840/Kconfig b/drivers/media/video/cx25840/Kconfig index 7cf29a03ed63..448f4cd0ce34 100644 --- a/drivers/media/video/cx25840/Kconfig +++ b/drivers/media/video/cx25840/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config VIDEO_CX25840 | 1 | config VIDEO_CX25840 |
2 | tristate "Conexant CX2584x audio/video decoders" | 2 | tristate "Conexant CX2584x audio/video decoders" |
3 | depends on VIDEO_V4L2 && I2C && EXPERIMENTAL | 3 | depends on VIDEO_V4L2 && I2C && EXPERIMENTAL |
4 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select FW_LOADER | 5 | select FW_LOADER |
5 | ---help--- | 6 | ---help--- |
6 | Support for the Conexant CX2584x audio/video decoders. | 7 | Support for the Conexant CX2584x audio/video decoders. |
diff --git a/drivers/media/video/cx88/Kconfig b/drivers/media/video/cx88/Kconfig index b0d7d6a7a4cc..10e20d8196dc 100644 --- a/drivers/media/video/cx88/Kconfig +++ b/drivers/media/video/cx88/Kconfig | |||
@@ -2,10 +2,9 @@ config VIDEO_CX88 | |||
2 | tristate "Conexant 2388x (bt878 successor) support" | 2 | tristate "Conexant 2388x (bt878 successor) support" |
3 | depends on VIDEO_DEV && PCI && I2C && INPUT | 3 | depends on VIDEO_DEV && PCI && I2C && INPUT |
4 | select I2C_ALGOBIT | 4 | select I2C_ALGOBIT |
5 | select FW_LOADER | ||
6 | select VIDEO_BTCX | 5 | select VIDEO_BTCX |
7 | select VIDEOBUF_DMA_SG | 6 | select VIDEOBUF_DMA_SG |
8 | select MEDIA_TUNER | 7 | select VIDEO_TUNER |
9 | select VIDEO_TVEEPROM | 8 | select VIDEO_TVEEPROM |
10 | select VIDEO_IR | 9 | select VIDEO_IR |
11 | select VIDEO_WM8775 if VIDEO_HELPER_CHIPS_AUTO | 10 | select VIDEO_WM8775 if VIDEO_HELPER_CHIPS_AUTO |
@@ -34,8 +33,9 @@ config VIDEO_CX88_ALSA | |||
34 | 33 | ||
35 | config VIDEO_CX88_BLACKBIRD | 34 | config VIDEO_CX88_BLACKBIRD |
36 | tristate "Blackbird MPEG encoder support (cx2388x + cx23416)" | 35 | tristate "Blackbird MPEG encoder support (cx2388x + cx23416)" |
37 | depends on VIDEO_CX88 | 36 | depends on VIDEO_CX88 && HOTPLUG |
38 | select VIDEO_CX2341X | 37 | select VIDEO_CX2341X |
38 | select FW_LOADER | ||
39 | ---help--- | 39 | ---help--- |
40 | This adds support for MPEG encoder cards based on the | 40 | This adds support for MPEG encoder cards based on the |
41 | Blackbird reference design, using the Conexant 2388x | 41 | Blackbird reference design, using the Conexant 2388x |
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index 1c7fe6862a60..d96173ff1dba 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
@@ -509,9 +509,6 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev) | |||
509 | if (!fe) { | 509 | if (!fe) { |
510 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", | 510 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", |
511 | dev->core->name); | 511 | dev->core->name); |
512 | dvb_frontend_detach(dev->dvb.frontend); | ||
513 | dvb_unregister_frontend(dev->dvb.frontend); | ||
514 | dev->dvb.frontend = NULL; | ||
515 | return -EINVAL; | 512 | return -EINVAL; |
516 | } | 513 | } |
517 | 514 | ||
@@ -523,20 +520,23 @@ static int attach_xc3028(u8 addr, struct cx8802_dev *dev) | |||
523 | 520 | ||
524 | static int dvb_register(struct cx8802_dev *dev) | 521 | static int dvb_register(struct cx8802_dev *dev) |
525 | { | 522 | { |
523 | struct cx88_core *core = dev->core; | ||
524 | |||
526 | /* init struct videobuf_dvb */ | 525 | /* init struct videobuf_dvb */ |
527 | dev->dvb.name = dev->core->name; | 526 | dev->dvb.name = core->name; |
528 | dev->ts_gen_cntrl = 0x0c; | 527 | dev->ts_gen_cntrl = 0x0c; |
529 | 528 | ||
530 | /* init frontend */ | 529 | /* init frontend */ |
531 | switch (dev->core->boardnr) { | 530 | switch (core->boardnr) { |
532 | case CX88_BOARD_HAUPPAUGE_DVB_T1: | 531 | case CX88_BOARD_HAUPPAUGE_DVB_T1: |
533 | dev->dvb.frontend = dvb_attach(cx22702_attach, | 532 | dev->dvb.frontend = dvb_attach(cx22702_attach, |
534 | &connexant_refboard_config, | 533 | &connexant_refboard_config, |
535 | &dev->core->i2c_adap); | 534 | &core->i2c_adap); |
536 | if (dev->dvb.frontend != NULL) { | 535 | if (dev->dvb.frontend != NULL) { |
537 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 536 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
538 | &dev->core->i2c_adap, | 537 | 0x61, &core->i2c_adap, |
539 | DVB_PLL_THOMSON_DTT759X); | 538 | DVB_PLL_THOMSON_DTT759X)) |
539 | goto frontend_detach; | ||
540 | } | 540 | } |
541 | break; | 541 | break; |
542 | case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: | 542 | case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1: |
@@ -545,11 +545,12 @@ static int dvb_register(struct cx8802_dev *dev) | |||
545 | case CX88_BOARD_WINFAST_DTV1000: | 545 | case CX88_BOARD_WINFAST_DTV1000: |
546 | dev->dvb.frontend = dvb_attach(cx22702_attach, | 546 | dev->dvb.frontend = dvb_attach(cx22702_attach, |
547 | &connexant_refboard_config, | 547 | &connexant_refboard_config, |
548 | &dev->core->i2c_adap); | 548 | &core->i2c_adap); |
549 | if (dev->dvb.frontend != NULL) { | 549 | if (dev->dvb.frontend != NULL) { |
550 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, | 550 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
551 | &dev->core->i2c_adap, | 551 | 0x60, &core->i2c_adap, |
552 | DVB_PLL_THOMSON_DTT7579); | 552 | DVB_PLL_THOMSON_DTT7579)) |
553 | goto frontend_detach; | ||
553 | } | 554 | } |
554 | break; | 555 | break; |
555 | case CX88_BOARD_WINFAST_DTV2000H: | 556 | case CX88_BOARD_WINFAST_DTV2000H: |
@@ -559,29 +560,32 @@ static int dvb_register(struct cx8802_dev *dev) | |||
559 | case CX88_BOARD_HAUPPAUGE_HVR3000: | 560 | case CX88_BOARD_HAUPPAUGE_HVR3000: |
560 | dev->dvb.frontend = dvb_attach(cx22702_attach, | 561 | dev->dvb.frontend = dvb_attach(cx22702_attach, |
561 | &hauppauge_hvr_config, | 562 | &hauppauge_hvr_config, |
562 | &dev->core->i2c_adap); | 563 | &core->i2c_adap); |
563 | if (dev->dvb.frontend != NULL) { | 564 | if (dev->dvb.frontend != NULL) { |
564 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 565 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
565 | &dev->core->i2c_adap, 0x61, | 566 | &core->i2c_adap, 0x61, |
566 | TUNER_PHILIPS_FMD1216ME_MK3); | 567 | TUNER_PHILIPS_FMD1216ME_MK3)) |
568 | goto frontend_detach; | ||
567 | } | 569 | } |
568 | break; | 570 | break; |
569 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: | 571 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: |
570 | dev->dvb.frontend = dvb_attach(mt352_attach, | 572 | dev->dvb.frontend = dvb_attach(mt352_attach, |
571 | &dvico_fusionhdtv, | 573 | &dvico_fusionhdtv, |
572 | &dev->core->i2c_adap); | 574 | &core->i2c_adap); |
573 | if (dev->dvb.frontend != NULL) { | 575 | if (dev->dvb.frontend != NULL) { |
574 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, | 576 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
575 | NULL, DVB_PLL_THOMSON_DTT7579); | 577 | 0x60, NULL, DVB_PLL_THOMSON_DTT7579)) |
578 | goto frontend_detach; | ||
576 | break; | 579 | break; |
577 | } | 580 | } |
578 | /* ZL10353 replaces MT352 on later cards */ | 581 | /* ZL10353 replaces MT352 on later cards */ |
579 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 582 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
580 | &dvico_fusionhdtv_plus_v1_1, | 583 | &dvico_fusionhdtv_plus_v1_1, |
581 | &dev->core->i2c_adap); | 584 | &core->i2c_adap); |
582 | if (dev->dvb.frontend != NULL) { | 585 | if (dev->dvb.frontend != NULL) { |
583 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, | 586 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
584 | NULL, DVB_PLL_THOMSON_DTT7579); | 587 | 0x60, NULL, DVB_PLL_THOMSON_DTT7579)) |
588 | goto frontend_detach; | ||
585 | } | 589 | } |
586 | break; | 590 | break; |
587 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: | 591 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: |
@@ -589,28 +593,31 @@ static int dvb_register(struct cx8802_dev *dev) | |||
589 | * compatible, with a slightly different MT352 AGC gain. */ | 593 | * compatible, with a slightly different MT352 AGC gain. */ |
590 | dev->dvb.frontend = dvb_attach(mt352_attach, | 594 | dev->dvb.frontend = dvb_attach(mt352_attach, |
591 | &dvico_fusionhdtv_dual, | 595 | &dvico_fusionhdtv_dual, |
592 | &dev->core->i2c_adap); | 596 | &core->i2c_adap); |
593 | if (dev->dvb.frontend != NULL) { | 597 | if (dev->dvb.frontend != NULL) { |
594 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 598 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
595 | NULL, DVB_PLL_THOMSON_DTT7579); | 599 | 0x61, NULL, DVB_PLL_THOMSON_DTT7579)) |
600 | goto frontend_detach; | ||
596 | break; | 601 | break; |
597 | } | 602 | } |
598 | /* ZL10353 replaces MT352 on later cards */ | 603 | /* ZL10353 replaces MT352 on later cards */ |
599 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 604 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
600 | &dvico_fusionhdtv_plus_v1_1, | 605 | &dvico_fusionhdtv_plus_v1_1, |
601 | &dev->core->i2c_adap); | 606 | &core->i2c_adap); |
602 | if (dev->dvb.frontend != NULL) { | 607 | if (dev->dvb.frontend != NULL) { |
603 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 608 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
604 | NULL, DVB_PLL_THOMSON_DTT7579); | 609 | 0x61, NULL, DVB_PLL_THOMSON_DTT7579)) |
610 | goto frontend_detach; | ||
605 | } | 611 | } |
606 | break; | 612 | break; |
607 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: | 613 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: |
608 | dev->dvb.frontend = dvb_attach(mt352_attach, | 614 | dev->dvb.frontend = dvb_attach(mt352_attach, |
609 | &dvico_fusionhdtv, | 615 | &dvico_fusionhdtv, |
610 | &dev->core->i2c_adap); | 616 | &core->i2c_adap); |
611 | if (dev->dvb.frontend != NULL) { | 617 | if (dev->dvb.frontend != NULL) { |
612 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 618 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
613 | NULL, DVB_PLL_LG_Z201); | 619 | 0x61, NULL, DVB_PLL_LG_Z201)) |
620 | goto frontend_detach; | ||
614 | } | 621 | } |
615 | break; | 622 | break; |
616 | case CX88_BOARD_KWORLD_DVB_T: | 623 | case CX88_BOARD_KWORLD_DVB_T: |
@@ -618,10 +625,11 @@ static int dvb_register(struct cx8802_dev *dev) | |||
618 | case CX88_BOARD_ADSTECH_DVB_T_PCI: | 625 | case CX88_BOARD_ADSTECH_DVB_T_PCI: |
619 | dev->dvb.frontend = dvb_attach(mt352_attach, | 626 | dev->dvb.frontend = dvb_attach(mt352_attach, |
620 | &dntv_live_dvbt_config, | 627 | &dntv_live_dvbt_config, |
621 | &dev->core->i2c_adap); | 628 | &core->i2c_adap); |
622 | if (dev->dvb.frontend != NULL) { | 629 | if (dev->dvb.frontend != NULL) { |
623 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 630 | if (!dvb_attach(dvb_pll_attach, dev->dvb.frontend, |
624 | NULL, DVB_PLL_UNKNOWN_1); | 631 | 0x61, NULL, DVB_PLL_UNKNOWN_1)) |
632 | goto frontend_detach; | ||
625 | } | 633 | } |
626 | break; | 634 | break; |
627 | case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: | 635 | case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: |
@@ -630,32 +638,35 @@ static int dvb_register(struct cx8802_dev *dev) | |||
630 | dev->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config, | 638 | dev->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config, |
631 | &dev->vp3054->adap); | 639 | &dev->vp3054->adap); |
632 | if (dev->dvb.frontend != NULL) { | 640 | if (dev->dvb.frontend != NULL) { |
633 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 641 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
634 | &dev->core->i2c_adap, 0x61, | 642 | &core->i2c_adap, 0x61, |
635 | TUNER_PHILIPS_FMD1216ME_MK3); | 643 | TUNER_PHILIPS_FMD1216ME_MK3)) |
644 | goto frontend_detach; | ||
636 | } | 645 | } |
637 | #else | 646 | #else |
638 | printk(KERN_ERR "%s/2: built without vp3054 support\n", dev->core->name); | 647 | printk(KERN_ERR "%s/2: built without vp3054 support\n", |
648 | core->name); | ||
639 | #endif | 649 | #endif |
640 | break; | 650 | break; |
641 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: | 651 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: |
642 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 652 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
643 | &dvico_fusionhdtv_hybrid, | 653 | &dvico_fusionhdtv_hybrid, |
644 | &dev->core->i2c_adap); | 654 | &core->i2c_adap); |
645 | if (dev->dvb.frontend != NULL) { | 655 | if (dev->dvb.frontend != NULL) { |
646 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 656 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
647 | &dev->core->i2c_adap, 0x61, | 657 | &core->i2c_adap, 0x61, |
648 | TUNER_THOMSON_FE6600); | 658 | TUNER_THOMSON_FE6600)) |
659 | goto frontend_detach; | ||
649 | } | 660 | } |
650 | break; | 661 | break; |
651 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: | 662 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: |
652 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 663 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
653 | &dvico_fusionhdtv_xc3028, | 664 | &dvico_fusionhdtv_xc3028, |
654 | &dev->core->i2c_adap); | 665 | &core->i2c_adap); |
655 | if (dev->dvb.frontend == NULL) | 666 | if (dev->dvb.frontend == NULL) |
656 | dev->dvb.frontend = dvb_attach(mt352_attach, | 667 | dev->dvb.frontend = dvb_attach(mt352_attach, |
657 | &dvico_fusionhdtv_mt352_xc3028, | 668 | &dvico_fusionhdtv_mt352_xc3028, |
658 | &dev->core->i2c_adap); | 669 | &core->i2c_adap); |
659 | /* | 670 | /* |
660 | * On this board, the demod provides the I2C bus pullup. | 671 | * On this board, the demod provides the I2C bus pullup. |
661 | * We must not permit gate_ctrl to be performed, or | 672 | * We must not permit gate_ctrl to be performed, or |
@@ -668,19 +679,18 @@ static int dvb_register(struct cx8802_dev *dev) | |||
668 | break; | 679 | break; |
669 | case CX88_BOARD_PCHDTV_HD3000: | 680 | case CX88_BOARD_PCHDTV_HD3000: |
670 | dev->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000, | 681 | dev->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000, |
671 | &dev->core->i2c_adap); | 682 | &core->i2c_adap); |
672 | if (dev->dvb.frontend != NULL) { | 683 | if (dev->dvb.frontend != NULL) { |
673 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 684 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
674 | &dev->core->i2c_adap, 0x61, | 685 | &core->i2c_adap, 0x61, |
675 | TUNER_THOMSON_DTT761X); | 686 | TUNER_THOMSON_DTT761X)) |
687 | goto frontend_detach; | ||
676 | } | 688 | } |
677 | break; | 689 | break; |
678 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: | 690 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q: |
679 | dev->ts_gen_cntrl = 0x08; | 691 | dev->ts_gen_cntrl = 0x08; |
680 | { | ||
681 | /* Do a hardware reset of chip before using it. */ | ||
682 | struct cx88_core *core = dev->core; | ||
683 | 692 | ||
693 | /* Do a hardware reset of chip before using it. */ | ||
684 | cx_clear(MO_GP0_IO, 1); | 694 | cx_clear(MO_GP0_IO, 1); |
685 | mdelay(100); | 695 | mdelay(100); |
686 | cx_set(MO_GP0_IO, 1); | 696 | cx_set(MO_GP0_IO, 1); |
@@ -690,139 +700,137 @@ static int dvb_register(struct cx8802_dev *dev) | |||
690 | fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set; | 700 | fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set; |
691 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, | 701 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, |
692 | &fusionhdtv_3_gold, | 702 | &fusionhdtv_3_gold, |
693 | &dev->core->i2c_adap); | 703 | &core->i2c_adap); |
694 | if (dev->dvb.frontend != NULL) { | 704 | if (dev->dvb.frontend != NULL) { |
695 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 705 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
696 | &dev->core->i2c_adap, 0x61, | 706 | &core->i2c_adap, 0x61, |
697 | TUNER_MICROTUNE_4042FI5); | 707 | TUNER_MICROTUNE_4042FI5)) |
698 | } | 708 | goto frontend_detach; |
699 | } | 709 | } |
700 | break; | 710 | break; |
701 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T: | 711 | case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T: |
702 | dev->ts_gen_cntrl = 0x08; | 712 | dev->ts_gen_cntrl = 0x08; |
703 | { | ||
704 | /* Do a hardware reset of chip before using it. */ | ||
705 | struct cx88_core *core = dev->core; | ||
706 | 713 | ||
714 | /* Do a hardware reset of chip before using it. */ | ||
707 | cx_clear(MO_GP0_IO, 1); | 715 | cx_clear(MO_GP0_IO, 1); |
708 | mdelay(100); | 716 | mdelay(100); |
709 | cx_set(MO_GP0_IO, 9); | 717 | cx_set(MO_GP0_IO, 9); |
710 | mdelay(200); | 718 | mdelay(200); |
711 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, | 719 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, |
712 | &fusionhdtv_3_gold, | 720 | &fusionhdtv_3_gold, |
713 | &dev->core->i2c_adap); | 721 | &core->i2c_adap); |
714 | if (dev->dvb.frontend != NULL) { | 722 | if (dev->dvb.frontend != NULL) { |
715 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 723 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
716 | &dev->core->i2c_adap, 0x61, | 724 | &core->i2c_adap, 0x61, |
717 | TUNER_THOMSON_DTT761X); | 725 | TUNER_THOMSON_DTT761X)) |
718 | } | 726 | goto frontend_detach; |
719 | } | 727 | } |
720 | break; | 728 | break; |
721 | case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD: | 729 | case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD: |
722 | dev->ts_gen_cntrl = 0x08; | 730 | dev->ts_gen_cntrl = 0x08; |
723 | { | ||
724 | /* Do a hardware reset of chip before using it. */ | ||
725 | struct cx88_core *core = dev->core; | ||
726 | 731 | ||
732 | /* Do a hardware reset of chip before using it. */ | ||
727 | cx_clear(MO_GP0_IO, 1); | 733 | cx_clear(MO_GP0_IO, 1); |
728 | mdelay(100); | 734 | mdelay(100); |
729 | cx_set(MO_GP0_IO, 1); | 735 | cx_set(MO_GP0_IO, 1); |
730 | mdelay(200); | 736 | mdelay(200); |
731 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, | 737 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, |
732 | &fusionhdtv_5_gold, | 738 | &fusionhdtv_5_gold, |
733 | &dev->core->i2c_adap); | 739 | &core->i2c_adap); |
734 | if (dev->dvb.frontend != NULL) { | 740 | if (dev->dvb.frontend != NULL) { |
735 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 741 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
736 | &dev->core->i2c_adap, 0x61, | 742 | &core->i2c_adap, 0x61, |
737 | TUNER_LG_TDVS_H06XF); | 743 | TUNER_LG_TDVS_H06XF)) |
738 | dvb_attach(tda9887_attach, dev->dvb.frontend, | 744 | goto frontend_detach; |
739 | &dev->core->i2c_adap, 0x43); | 745 | if (!dvb_attach(tda9887_attach, dev->dvb.frontend, |
740 | } | 746 | &core->i2c_adap, 0x43)) |
747 | goto frontend_detach; | ||
741 | } | 748 | } |
742 | break; | 749 | break; |
743 | case CX88_BOARD_PCHDTV_HD5500: | 750 | case CX88_BOARD_PCHDTV_HD5500: |
744 | dev->ts_gen_cntrl = 0x08; | 751 | dev->ts_gen_cntrl = 0x08; |
745 | { | ||
746 | /* Do a hardware reset of chip before using it. */ | ||
747 | struct cx88_core *core = dev->core; | ||
748 | 752 | ||
753 | /* Do a hardware reset of chip before using it. */ | ||
749 | cx_clear(MO_GP0_IO, 1); | 754 | cx_clear(MO_GP0_IO, 1); |
750 | mdelay(100); | 755 | mdelay(100); |
751 | cx_set(MO_GP0_IO, 1); | 756 | cx_set(MO_GP0_IO, 1); |
752 | mdelay(200); | 757 | mdelay(200); |
753 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, | 758 | dev->dvb.frontend = dvb_attach(lgdt330x_attach, |
754 | &pchdtv_hd5500, | 759 | &pchdtv_hd5500, |
755 | &dev->core->i2c_adap); | 760 | &core->i2c_adap); |
756 | if (dev->dvb.frontend != NULL) { | 761 | if (dev->dvb.frontend != NULL) { |
757 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 762 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
758 | &dev->core->i2c_adap, 0x61, | 763 | &core->i2c_adap, 0x61, |
759 | TUNER_LG_TDVS_H06XF); | 764 | TUNER_LG_TDVS_H06XF)) |
760 | dvb_attach(tda9887_attach, dev->dvb.frontend, | 765 | goto frontend_detach; |
761 | &dev->core->i2c_adap, 0x43); | 766 | if (!dvb_attach(tda9887_attach, dev->dvb.frontend, |
762 | } | 767 | &core->i2c_adap, 0x43)) |
768 | goto frontend_detach; | ||
763 | } | 769 | } |
764 | break; | 770 | break; |
765 | case CX88_BOARD_ATI_HDTVWONDER: | 771 | case CX88_BOARD_ATI_HDTVWONDER: |
766 | dev->dvb.frontend = dvb_attach(nxt200x_attach, | 772 | dev->dvb.frontend = dvb_attach(nxt200x_attach, |
767 | &ati_hdtvwonder, | 773 | &ati_hdtvwonder, |
768 | &dev->core->i2c_adap); | 774 | &core->i2c_adap); |
769 | if (dev->dvb.frontend != NULL) { | 775 | if (dev->dvb.frontend != NULL) { |
770 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 776 | if (!dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
771 | &dev->core->i2c_adap, 0x61, | 777 | &core->i2c_adap, 0x61, |
772 | TUNER_PHILIPS_TUV1236D); | 778 | TUNER_PHILIPS_TUV1236D)) |
779 | goto frontend_detach; | ||
773 | } | 780 | } |
774 | break; | 781 | break; |
775 | case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: | 782 | case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: |
776 | case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: | 783 | case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: |
777 | dev->dvb.frontend = dvb_attach(cx24123_attach, | 784 | dev->dvb.frontend = dvb_attach(cx24123_attach, |
778 | &hauppauge_novas_config, | 785 | &hauppauge_novas_config, |
779 | &dev->core->i2c_adap); | 786 | &core->i2c_adap); |
780 | if (dev->dvb.frontend) { | 787 | if (dev->dvb.frontend) { |
781 | dvb_attach(isl6421_attach, dev->dvb.frontend, | 788 | if (!dvb_attach(isl6421_attach, dev->dvb.frontend, |
782 | &dev->core->i2c_adap, 0x08, 0x00, 0x00); | 789 | &core->i2c_adap, 0x08, 0x00, 0x00)) |
790 | goto frontend_detach; | ||
783 | } | 791 | } |
784 | break; | 792 | break; |
785 | case CX88_BOARD_KWORLD_DVBS_100: | 793 | case CX88_BOARD_KWORLD_DVBS_100: |
786 | dev->dvb.frontend = dvb_attach(cx24123_attach, | 794 | dev->dvb.frontend = dvb_attach(cx24123_attach, |
787 | &kworld_dvbs_100_config, | 795 | &kworld_dvbs_100_config, |
788 | &dev->core->i2c_adap); | 796 | &core->i2c_adap); |
789 | if (dev->dvb.frontend) { | 797 | if (dev->dvb.frontend) { |
790 | dev->core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; | 798 | core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; |
791 | dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage; | 799 | dev->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage; |
792 | } | 800 | } |
793 | break; | 801 | break; |
794 | case CX88_BOARD_GENIATECH_DVBS: | 802 | case CX88_BOARD_GENIATECH_DVBS: |
795 | dev->dvb.frontend = dvb_attach(cx24123_attach, | 803 | dev->dvb.frontend = dvb_attach(cx24123_attach, |
796 | &geniatech_dvbs_config, | 804 | &geniatech_dvbs_config, |
797 | &dev->core->i2c_adap); | 805 | &core->i2c_adap); |
798 | if (dev->dvb.frontend) { | 806 | if (dev->dvb.frontend) { |
799 | dev->core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; | 807 | core->prev_set_voltage = dev->dvb.frontend->ops.set_voltage; |
800 | dev->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage; | 808 | dev->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage; |
801 | } | 809 | } |
802 | break; | 810 | break; |
803 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: | 811 | case CX88_BOARD_PINNACLE_PCTV_HD_800i: |
804 | dev->dvb.frontend = dvb_attach(s5h1409_attach, | 812 | dev->dvb.frontend = dvb_attach(s5h1409_attach, |
805 | &pinnacle_pctv_hd_800i_config, | 813 | &pinnacle_pctv_hd_800i_config, |
806 | &dev->core->i2c_adap); | 814 | &core->i2c_adap); |
807 | if (dev->dvb.frontend != NULL) { | 815 | if (dev->dvb.frontend != NULL) { |
808 | /* tuner_config.video_dev must point to | 816 | /* tuner_config.video_dev must point to |
809 | * i2c_adap.algo_data | 817 | * i2c_adap.algo_data |
810 | */ | 818 | */ |
811 | pinnacle_pctv_hd_800i_tuner_config.priv = | 819 | if (!dvb_attach(xc5000_attach, dev->dvb.frontend, |
812 | dev->core->i2c_adap.algo_data; | 820 | &core->i2c_adap, |
813 | dvb_attach(xc5000_attach, dev->dvb.frontend, | 821 | &pinnacle_pctv_hd_800i_tuner_config, |
814 | &dev->core->i2c_adap, | 822 | core->i2c_adap.algo_data)) |
815 | &pinnacle_pctv_hd_800i_tuner_config); | 823 | goto frontend_detach; |
816 | } | 824 | } |
817 | break; | 825 | break; |
818 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: | 826 | case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: |
819 | dev->dvb.frontend = dvb_attach(s5h1409_attach, | 827 | dev->dvb.frontend = dvb_attach(s5h1409_attach, |
820 | &dvico_hdtv5_pci_nano_config, | 828 | &dvico_hdtv5_pci_nano_config, |
821 | &dev->core->i2c_adap); | 829 | &core->i2c_adap); |
822 | if (dev->dvb.frontend != NULL) { | 830 | if (dev->dvb.frontend != NULL) { |
823 | struct dvb_frontend *fe; | 831 | struct dvb_frontend *fe; |
824 | struct xc2028_config cfg = { | 832 | struct xc2028_config cfg = { |
825 | .i2c_adap = &dev->core->i2c_adap, | 833 | .i2c_adap = &core->i2c_adap, |
826 | .i2c_addr = 0x61, | 834 | .i2c_addr = 0x61, |
827 | .callback = cx88_pci_nano_callback, | 835 | .callback = cx88_pci_nano_callback, |
828 | }; | 836 | }; |
@@ -841,50 +849,50 @@ static int dvb_register(struct cx8802_dev *dev) | |||
841 | case CX88_BOARD_PINNACLE_HYBRID_PCTV: | 849 | case CX88_BOARD_PINNACLE_HYBRID_PCTV: |
842 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 850 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
843 | &cx88_geniatech_x8000_mt, | 851 | &cx88_geniatech_x8000_mt, |
844 | &dev->core->i2c_adap); | 852 | &core->i2c_adap); |
845 | if (attach_xc3028(0x61, dev) < 0) | 853 | if (attach_xc3028(0x61, dev) < 0) |
846 | return -EINVAL; | 854 | goto frontend_detach; |
847 | break; | 855 | break; |
848 | case CX88_BOARD_GENIATECH_X8000_MT: | 856 | case CX88_BOARD_GENIATECH_X8000_MT: |
849 | dev->ts_gen_cntrl = 0x00; | 857 | dev->ts_gen_cntrl = 0x00; |
850 | 858 | ||
851 | dev->dvb.frontend = dvb_attach(zl10353_attach, | 859 | dev->dvb.frontend = dvb_attach(zl10353_attach, |
852 | &cx88_geniatech_x8000_mt, | 860 | &cx88_geniatech_x8000_mt, |
853 | &dev->core->i2c_adap); | 861 | &core->i2c_adap); |
854 | if (attach_xc3028(0x61, dev) < 0) | 862 | if (attach_xc3028(0x61, dev) < 0) |
855 | return -EINVAL; | 863 | goto frontend_detach; |
856 | break; | 864 | break; |
857 | case CX88_BOARD_KWORLD_ATSC_120: | 865 | case CX88_BOARD_KWORLD_ATSC_120: |
858 | dev->dvb.frontend = dvb_attach(s5h1409_attach, | 866 | dev->dvb.frontend = dvb_attach(s5h1409_attach, |
859 | &kworld_atsc_120_config, | 867 | &kworld_atsc_120_config, |
860 | &dev->core->i2c_adap); | 868 | &core->i2c_adap); |
861 | if (attach_xc3028(0x61, dev) < 0) | 869 | if (attach_xc3028(0x61, dev) < 0) |
862 | return -EINVAL; | 870 | goto frontend_detach; |
863 | break; | 871 | break; |
864 | case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: | 872 | case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: |
865 | dev->dvb.frontend = dvb_attach(s5h1411_attach, | 873 | dev->dvb.frontend = dvb_attach(s5h1411_attach, |
866 | &dvico_fusionhdtv7_config, | 874 | &dvico_fusionhdtv7_config, |
867 | &dev->core->i2c_adap); | 875 | &core->i2c_adap); |
868 | if (dev->dvb.frontend != NULL) { | 876 | if (dev->dvb.frontend != NULL) { |
869 | /* tuner_config.video_dev must point to | 877 | /* tuner_config.video_dev must point to |
870 | * i2c_adap.algo_data | 878 | * i2c_adap.algo_data |
871 | */ | 879 | */ |
872 | dvico_fusionhdtv7_tuner_config.priv = | 880 | if (!dvb_attach(xc5000_attach, dev->dvb.frontend, |
873 | dev->core->i2c_adap.algo_data; | 881 | &core->i2c_adap, |
874 | dvb_attach(xc5000_attach, dev->dvb.frontend, | 882 | &dvico_fusionhdtv7_tuner_config, |
875 | &dev->core->i2c_adap, | 883 | core->i2c_adap.algo_data)) |
876 | &dvico_fusionhdtv7_tuner_config); | 884 | goto frontend_detach; |
877 | } | 885 | } |
878 | break; | 886 | break; |
879 | default: | 887 | default: |
880 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", | 888 | printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n", |
881 | dev->core->name); | 889 | core->name); |
882 | break; | 890 | break; |
883 | } | 891 | } |
884 | if (NULL == dev->dvb.frontend) { | 892 | if (NULL == dev->dvb.frontend) { |
885 | printk(KERN_ERR | 893 | printk(KERN_ERR |
886 | "%s/2: frontend initialization failed\n", | 894 | "%s/2: frontend initialization failed\n", |
887 | dev->core->name); | 895 | core->name); |
888 | return -EINVAL; | 896 | return -EINVAL; |
889 | } | 897 | } |
890 | 898 | ||
@@ -892,11 +900,18 @@ static int dvb_register(struct cx8802_dev *dev) | |||
892 | dev->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl; | 900 | dev->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl; |
893 | 901 | ||
894 | /* Put the analog decoder in standby to keep it quiet */ | 902 | /* Put the analog decoder in standby to keep it quiet */ |
895 | cx88_call_i2c_clients (dev->core, TUNER_SET_STANDBY, NULL); | 903 | cx88_call_i2c_clients(core, TUNER_SET_STANDBY, NULL); |
896 | 904 | ||
897 | /* register everything */ | 905 | /* register everything */ |
898 | return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, | 906 | return videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, |
899 | &dev->pci->dev, adapter_nr); | 907 | &dev->pci->dev, adapter_nr); |
908 | |||
909 | frontend_detach: | ||
910 | if (dev->dvb.frontend) { | ||
911 | dvb_frontend_detach(dev->dvb.frontend); | ||
912 | dev->dvb.frontend = NULL; | ||
913 | } | ||
914 | return -EINVAL; | ||
900 | } | 915 | } |
901 | 916 | ||
902 | /* ----------------------------------------------------------- */ | 917 | /* ----------------------------------------------------------- */ |
diff --git a/drivers/media/video/em28xx/Kconfig b/drivers/media/video/em28xx/Kconfig index c7c2896bbd8b..16a5af30e9d1 100644 --- a/drivers/media/video/em28xx/Kconfig +++ b/drivers/media/video/em28xx/Kconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | config VIDEO_EM28XX | 1 | config VIDEO_EM28XX |
2 | tristate "Empia EM28xx USB video capture support" | 2 | tristate "Empia EM28xx USB video capture support" |
3 | depends on VIDEO_DEV && I2C && INPUT | 3 | depends on VIDEO_DEV && I2C && INPUT |
4 | select MEDIA_TUNER | 4 | select VIDEO_TUNER |
5 | select VIDEO_TVEEPROM | 5 | select VIDEO_TVEEPROM |
6 | select VIDEO_IR | 6 | select VIDEO_IR |
7 | select VIDEOBUF_VMALLOC | 7 | select VIDEOBUF_VMALLOC |
@@ -35,7 +35,6 @@ config VIDEO_EM28XX_DVB | |||
35 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE | 35 | select DVB_LGDT330X if !DVB_FE_CUSTOMISE |
36 | select DVB_ZL10353 if !DVB_FE_CUSTOMISE | 36 | select DVB_ZL10353 if !DVB_FE_CUSTOMISE |
37 | select VIDEOBUF_DVB | 37 | select VIDEOBUF_DVB |
38 | select FW_LOADER | ||
39 | ---help--- | 38 | ---help--- |
40 | This adds support for DVB cards based on the | 39 | This adds support for DVB cards based on the |
41 | Empiatech em28xx chips. | 40 | Empiatech em28xx chips. |
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 50ccf3771204..3e4f3c7e92e7 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -420,7 +420,13 @@ struct usb_device_id em28xx_id_table [] = { | |||
420 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, | 420 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, |
421 | { USB_DEVICE(0x2040, 0x6502), | 421 | { USB_DEVICE(0x2040, 0x6502), |
422 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, | 422 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, |
423 | { USB_DEVICE(0x2040, 0x6513), | 423 | { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ |
424 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | ||
425 | { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ | ||
426 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | ||
427 | { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ | ||
428 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | ||
429 | { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */ | ||
424 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | 430 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
425 | { USB_DEVICE(0x0ccd, 0x0042), | 431 | { USB_DEVICE(0x0ccd, 0x0042), |
426 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, | 432 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index 7df81575b7f2..8cf4983f0039 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -251,7 +251,6 @@ static int attach_xc3028(u8 addr, struct em28xx *dev) | |||
251 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", | 251 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", |
252 | dev->name); | 252 | dev->name); |
253 | dvb_frontend_detach(dev->dvb->frontend); | 253 | dvb_frontend_detach(dev->dvb->frontend); |
254 | dvb_unregister_frontend(dev->dvb->frontend); | ||
255 | dev->dvb->frontend = NULL; | 254 | dev->dvb->frontend = NULL; |
256 | return -EINVAL; | 255 | return -EINVAL; |
257 | } | 256 | } |
diff --git a/drivers/media/video/ivtv/Kconfig b/drivers/media/video/ivtv/Kconfig index eec115bf9517..5d7ee8fcdd50 100644 --- a/drivers/media/video/ivtv/Kconfig +++ b/drivers/media/video/ivtv/Kconfig | |||
@@ -1,10 +1,12 @@ | |||
1 | config VIDEO_IVTV | 1 | config VIDEO_IVTV |
2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" | 2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" |
3 | depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL | 3 | depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL |
4 | depends on INPUT # due to VIDEO_IR | ||
5 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select I2C_ALGOBIT | 6 | select I2C_ALGOBIT |
5 | select FW_LOADER | 7 | select FW_LOADER |
6 | select VIDEO_IR | 8 | select VIDEO_IR |
7 | select MEDIA_TUNER | 9 | select VIDEO_TUNER |
8 | select VIDEO_TVEEPROM | 10 | select VIDEO_TVEEPROM |
9 | select VIDEO_CX2341X | 11 | select VIDEO_CX2341X |
10 | select VIDEO_CX25840 | 12 | select VIDEO_CX25840 |
diff --git a/drivers/media/video/ivtv/ivtv-controls.c b/drivers/media/video/ivtv/ivtv-controls.c index 8c02fa661591..c7e449f6397b 100644 --- a/drivers/media/video/ivtv/ivtv-controls.c +++ b/drivers/media/video/ivtv/ivtv-controls.c | |||
@@ -181,12 +181,12 @@ static int ivtv_setup_vbi_fmt(struct ivtv *itv, enum v4l2_mpeg_stream_vbi_fmt fm | |||
181 | return 0; | 181 | return 0; |
182 | } | 182 | } |
183 | /* Need sliced data for mpeg insertion */ | 183 | /* Need sliced data for mpeg insertion */ |
184 | if (get_service_set(itv->vbi.sliced_in) == 0) { | 184 | if (ivtv_get_service_set(itv->vbi.sliced_in) == 0) { |
185 | if (itv->is_60hz) | 185 | if (itv->is_60hz) |
186 | itv->vbi.sliced_in->service_set = V4L2_SLICED_CAPTION_525; | 186 | itv->vbi.sliced_in->service_set = V4L2_SLICED_CAPTION_525; |
187 | else | 187 | else |
188 | itv->vbi.sliced_in->service_set = V4L2_SLICED_WSS_625; | 188 | itv->vbi.sliced_in->service_set = V4L2_SLICED_WSS_625; |
189 | expand_service_set(itv->vbi.sliced_in, itv->is_50hz); | 189 | ivtv_expand_service_set(itv->vbi.sliced_in, itv->is_50hz); |
190 | } | 190 | } |
191 | return 0; | 191 | return 0; |
192 | } | 192 | } |
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c index ed020f722b05..797e636771da 100644 --- a/drivers/media/video/ivtv/ivtv-driver.c +++ b/drivers/media/video/ivtv/ivtv-driver.c | |||
@@ -853,6 +853,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev, | |||
853 | return 0; | 853 | return 0; |
854 | } | 854 | } |
855 | 855 | ||
856 | #ifdef MODULE | ||
856 | static u32 ivtv_request_module(struct ivtv *itv, u32 hw, | 857 | static u32 ivtv_request_module(struct ivtv *itv, u32 hw, |
857 | const char *name, u32 id) | 858 | const char *name, u32 id) |
858 | { | 859 | { |
@@ -865,12 +866,14 @@ static u32 ivtv_request_module(struct ivtv *itv, u32 hw, | |||
865 | IVTV_DEBUG_INFO("Loaded module %s\n", name); | 866 | IVTV_DEBUG_INFO("Loaded module %s\n", name); |
866 | return hw; | 867 | return hw; |
867 | } | 868 | } |
869 | #endif | ||
868 | 870 | ||
869 | static void ivtv_load_and_init_modules(struct ivtv *itv) | 871 | static void ivtv_load_and_init_modules(struct ivtv *itv) |
870 | { | 872 | { |
871 | u32 hw = itv->card->hw_all; | 873 | u32 hw = itv->card->hw_all; |
872 | unsigned i; | 874 | unsigned i; |
873 | 875 | ||
876 | #ifdef MODULE | ||
874 | /* load modules */ | 877 | /* load modules */ |
875 | #ifndef CONFIG_MEDIA_TUNER | 878 | #ifndef CONFIG_MEDIA_TUNER |
876 | hw = ivtv_request_module(itv, hw, "tuner", IVTV_HW_TUNER); | 879 | hw = ivtv_request_module(itv, hw, "tuner", IVTV_HW_TUNER); |
@@ -911,6 +914,7 @@ static void ivtv_load_and_init_modules(struct ivtv *itv) | |||
911 | #ifndef CONFIG_VIDEO_M52790 | 914 | #ifndef CONFIG_VIDEO_M52790 |
912 | hw = ivtv_request_module(itv, hw, "m52790", IVTV_HW_M52790); | 915 | hw = ivtv_request_module(itv, hw, "m52790", IVTV_HW_M52790); |
913 | #endif | 916 | #endif |
917 | #endif | ||
914 | 918 | ||
915 | /* check which i2c devices are actually found */ | 919 | /* check which i2c devices are actually found */ |
916 | for (i = 0; i < 32; i++) { | 920 | for (i = 0; i < 32; i++) { |
@@ -1228,7 +1232,7 @@ static int __devinit ivtv_probe(struct pci_dev *dev, | |||
1228 | return 0; | 1232 | return 0; |
1229 | 1233 | ||
1230 | free_streams: | 1234 | free_streams: |
1231 | ivtv_streams_cleanup(itv); | 1235 | ivtv_streams_cleanup(itv, 1); |
1232 | free_irq: | 1236 | free_irq: |
1233 | free_irq(itv->dev->irq, (void *)itv); | 1237 | free_irq(itv->dev->irq, (void *)itv); |
1234 | free_i2c: | 1238 | free_i2c: |
@@ -1373,7 +1377,7 @@ static void ivtv_remove(struct pci_dev *pci_dev) | |||
1373 | flush_workqueue(itv->irq_work_queues); | 1377 | flush_workqueue(itv->irq_work_queues); |
1374 | destroy_workqueue(itv->irq_work_queues); | 1378 | destroy_workqueue(itv->irq_work_queues); |
1375 | 1379 | ||
1376 | ivtv_streams_cleanup(itv); | 1380 | ivtv_streams_cleanup(itv, 1); |
1377 | ivtv_udma_free(itv); | 1381 | ivtv_udma_free(itv); |
1378 | 1382 | ||
1379 | exit_ivtv_i2c(itv); | 1383 | exit_ivtv_i2c(itv); |
diff --git a/drivers/media/video/ivtv/ivtv-fileops.c b/drivers/media/video/ivtv/ivtv-fileops.c index 2b74b0ab1477..f2fa434b677b 100644 --- a/drivers/media/video/ivtv/ivtv-fileops.c +++ b/drivers/media/video/ivtv/ivtv-fileops.c | |||
@@ -987,6 +987,8 @@ int ivtv_v4l2_open(struct inode *inode, struct file *filp) | |||
987 | /* Find which card this open was on */ | 987 | /* Find which card this open was on */ |
988 | spin_lock(&ivtv_cards_lock); | 988 | spin_lock(&ivtv_cards_lock); |
989 | for (x = 0; itv == NULL && x < ivtv_cards_active; x++) { | 989 | for (x = 0; itv == NULL && x < ivtv_cards_active; x++) { |
990 | if (ivtv_cards[x] == NULL) | ||
991 | continue; | ||
990 | /* find out which stream this open was on */ | 992 | /* find out which stream this open was on */ |
991 | for (y = 0; y < IVTV_MAX_STREAMS; y++) { | 993 | for (y = 0; y < IVTV_MAX_STREAMS; y++) { |
992 | s = &ivtv_cards[x]->streams[y]; | 994 | s = &ivtv_cards[x]->streams[y]; |
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c index d508b5d0538c..26cc0f6699fd 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.c +++ b/drivers/media/video/ivtv/ivtv-ioctl.c | |||
@@ -38,7 +38,7 @@ | |||
38 | #include <linux/dvb/audio.h> | 38 | #include <linux/dvb/audio.h> |
39 | #include <linux/i2c-id.h> | 39 | #include <linux/i2c-id.h> |
40 | 40 | ||
41 | u16 service2vbi(int type) | 41 | u16 ivtv_service2vbi(int type) |
42 | { | 42 | { |
43 | switch (type) { | 43 | switch (type) { |
44 | case V4L2_SLICED_TELETEXT_B: | 44 | case V4L2_SLICED_TELETEXT_B: |
@@ -88,7 +88,7 @@ static u16 select_service_from_set(int field, int line, u16 set, int is_pal) | |||
88 | return 0; | 88 | return 0; |
89 | } | 89 | } |
90 | 90 | ||
91 | void expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal) | 91 | void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal) |
92 | { | 92 | { |
93 | u16 set = fmt->service_set; | 93 | u16 set = fmt->service_set; |
94 | int f, l; | 94 | int f, l; |
@@ -115,7 +115,7 @@ static int check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal) | |||
115 | return set != 0; | 115 | return set != 0; |
116 | } | 116 | } |
117 | 117 | ||
118 | u16 get_service_set(struct v4l2_sliced_vbi_format *fmt) | 118 | u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt) |
119 | { | 119 | { |
120 | int f, l; | 120 | int f, l; |
121 | u16 set = 0; | 121 | u16 set = 0; |
@@ -466,7 +466,7 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm | |||
466 | vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625; | 466 | vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625; |
467 | vbifmt->service_lines[0][16] = V4L2_SLICED_VPS; | 467 | vbifmt->service_lines[0][16] = V4L2_SLICED_VPS; |
468 | } | 468 | } |
469 | vbifmt->service_set = get_service_set(vbifmt); | 469 | vbifmt->service_set = ivtv_get_service_set(vbifmt); |
470 | break; | 470 | break; |
471 | } | 471 | } |
472 | 472 | ||
@@ -481,12 +481,12 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm | |||
481 | if (streamtype == IVTV_DEC_STREAM_TYPE_VBI) { | 481 | if (streamtype == IVTV_DEC_STREAM_TYPE_VBI) { |
482 | vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 : | 482 | vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 : |
483 | V4L2_SLICED_VBI_525; | 483 | V4L2_SLICED_VBI_525; |
484 | expand_service_set(vbifmt, itv->is_50hz); | 484 | ivtv_expand_service_set(vbifmt, itv->is_50hz); |
485 | break; | 485 | break; |
486 | } | 486 | } |
487 | 487 | ||
488 | itv->video_dec_func(itv, VIDIOC_G_FMT, fmt); | 488 | itv->video_dec_func(itv, VIDIOC_G_FMT, fmt); |
489 | vbifmt->service_set = get_service_set(vbifmt); | 489 | vbifmt->service_set = ivtv_get_service_set(vbifmt); |
490 | break; | 490 | break; |
491 | } | 491 | } |
492 | case V4L2_BUF_TYPE_VBI_OUTPUT: | 492 | case V4L2_BUF_TYPE_VBI_OUTPUT: |
@@ -640,9 +640,9 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype, | |||
640 | memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved)); | 640 | memset(vbifmt->reserved, 0, sizeof(vbifmt->reserved)); |
641 | 641 | ||
642 | if (vbifmt->service_set) | 642 | if (vbifmt->service_set) |
643 | expand_service_set(vbifmt, itv->is_50hz); | 643 | ivtv_expand_service_set(vbifmt, itv->is_50hz); |
644 | set = check_service_set(vbifmt, itv->is_50hz); | 644 | set = check_service_set(vbifmt, itv->is_50hz); |
645 | vbifmt->service_set = get_service_set(vbifmt); | 645 | vbifmt->service_set = ivtv_get_service_set(vbifmt); |
646 | 646 | ||
647 | if (!set_fmt) | 647 | if (!set_fmt) |
648 | return 0; | 648 | return 0; |
diff --git a/drivers/media/video/ivtv/ivtv-ioctl.h b/drivers/media/video/ivtv/ivtv-ioctl.h index a03351b6853d..4e67f0ed1fc0 100644 --- a/drivers/media/video/ivtv/ivtv-ioctl.h +++ b/drivers/media/video/ivtv/ivtv-ioctl.h | |||
@@ -21,9 +21,9 @@ | |||
21 | #ifndef IVTV_IOCTL_H | 21 | #ifndef IVTV_IOCTL_H |
22 | #define IVTV_IOCTL_H | 22 | #define IVTV_IOCTL_H |
23 | 23 | ||
24 | u16 service2vbi(int type); | 24 | u16 ivtv_service2vbi(int type); |
25 | void expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal); | 25 | void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal); |
26 | u16 get_service_set(struct v4l2_sliced_vbi_format *fmt); | 26 | u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt); |
27 | int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, | 27 | int ivtv_v4l2_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, |
28 | unsigned long arg); | 28 | unsigned long arg); |
29 | int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg); | 29 | int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void *arg); |
diff --git a/drivers/media/video/ivtv/ivtv-queue.c b/drivers/media/video/ivtv/ivtv-queue.c index 3e1deec67a5e..fc8b1eaa333b 100644 --- a/drivers/media/video/ivtv/ivtv-queue.c +++ b/drivers/media/video/ivtv/ivtv-queue.c | |||
@@ -203,14 +203,14 @@ int ivtv_stream_alloc(struct ivtv_stream *s) | |||
203 | s->dma != PCI_DMA_NONE ? "DMA " : "", | 203 | s->dma != PCI_DMA_NONE ? "DMA " : "", |
204 | s->name, s->buffers, s->buf_size, s->buffers * s->buf_size / 1024); | 204 | s->name, s->buffers, s->buf_size, s->buffers * s->buf_size / 1024); |
205 | 205 | ||
206 | s->sg_pending = kzalloc(SGsize, GFP_KERNEL); | 206 | s->sg_pending = kzalloc(SGsize, GFP_KERNEL|__GFP_NOWARN); |
207 | if (s->sg_pending == NULL) { | 207 | if (s->sg_pending == NULL) { |
208 | IVTV_ERR("Could not allocate sg_pending for %s stream\n", s->name); | 208 | IVTV_ERR("Could not allocate sg_pending for %s stream\n", s->name); |
209 | return -ENOMEM; | 209 | return -ENOMEM; |
210 | } | 210 | } |
211 | s->sg_pending_size = 0; | 211 | s->sg_pending_size = 0; |
212 | 212 | ||
213 | s->sg_processing = kzalloc(SGsize, GFP_KERNEL); | 213 | s->sg_processing = kzalloc(SGsize, GFP_KERNEL|__GFP_NOWARN); |
214 | if (s->sg_processing == NULL) { | 214 | if (s->sg_processing == NULL) { |
215 | IVTV_ERR("Could not allocate sg_processing for %s stream\n", s->name); | 215 | IVTV_ERR("Could not allocate sg_processing for %s stream\n", s->name); |
216 | kfree(s->sg_pending); | 216 | kfree(s->sg_pending); |
@@ -219,7 +219,8 @@ int ivtv_stream_alloc(struct ivtv_stream *s) | |||
219 | } | 219 | } |
220 | s->sg_processing_size = 0; | 220 | s->sg_processing_size = 0; |
221 | 221 | ||
222 | s->sg_dma = kzalloc(sizeof(struct ivtv_sg_element), GFP_KERNEL); | 222 | s->sg_dma = kzalloc(sizeof(struct ivtv_sg_element), |
223 | GFP_KERNEL|__GFP_NOWARN); | ||
223 | if (s->sg_dma == NULL) { | 224 | if (s->sg_dma == NULL) { |
224 | IVTV_ERR("Could not allocate sg_dma for %s stream\n", s->name); | 225 | IVTV_ERR("Could not allocate sg_dma for %s stream\n", s->name); |
225 | kfree(s->sg_pending); | 226 | kfree(s->sg_pending); |
@@ -235,11 +236,12 @@ int ivtv_stream_alloc(struct ivtv_stream *s) | |||
235 | 236 | ||
236 | /* allocate stream buffers. Initially all buffers are in q_free. */ | 237 | /* allocate stream buffers. Initially all buffers are in q_free. */ |
237 | for (i = 0; i < s->buffers; i++) { | 238 | for (i = 0; i < s->buffers; i++) { |
238 | struct ivtv_buffer *buf = kzalloc(sizeof(struct ivtv_buffer), GFP_KERNEL); | 239 | struct ivtv_buffer *buf = kzalloc(sizeof(struct ivtv_buffer), |
240 | GFP_KERNEL|__GFP_NOWARN); | ||
239 | 241 | ||
240 | if (buf == NULL) | 242 | if (buf == NULL) |
241 | break; | 243 | break; |
242 | buf->buf = kmalloc(s->buf_size + 256, GFP_KERNEL); | 244 | buf->buf = kmalloc(s->buf_size + 256, GFP_KERNEL|__GFP_NOWARN); |
243 | if (buf->buf == NULL) { | 245 | if (buf->buf == NULL) { |
244 | kfree(buf); | 246 | kfree(buf); |
245 | break; | 247 | break; |
diff --git a/drivers/media/video/ivtv/ivtv-streams.c b/drivers/media/video/ivtv/ivtv-streams.c index 4ab8d36831ba..c47c2b945147 100644 --- a/drivers/media/video/ivtv/ivtv-streams.c +++ b/drivers/media/video/ivtv/ivtv-streams.c | |||
@@ -244,7 +244,7 @@ int ivtv_streams_setup(struct ivtv *itv) | |||
244 | return 0; | 244 | return 0; |
245 | 245 | ||
246 | /* One or more streams could not be initialized. Clean 'em all up. */ | 246 | /* One or more streams could not be initialized. Clean 'em all up. */ |
247 | ivtv_streams_cleanup(itv); | 247 | ivtv_streams_cleanup(itv, 0); |
248 | return -ENOMEM; | 248 | return -ENOMEM; |
249 | } | 249 | } |
250 | 250 | ||
@@ -304,12 +304,12 @@ int ivtv_streams_register(struct ivtv *itv) | |||
304 | return 0; | 304 | return 0; |
305 | 305 | ||
306 | /* One or more streams could not be initialized. Clean 'em all up. */ | 306 | /* One or more streams could not be initialized. Clean 'em all up. */ |
307 | ivtv_streams_cleanup(itv); | 307 | ivtv_streams_cleanup(itv, 1); |
308 | return -ENOMEM; | 308 | return -ENOMEM; |
309 | } | 309 | } |
310 | 310 | ||
311 | /* Unregister v4l2 devices */ | 311 | /* Unregister v4l2 devices */ |
312 | void ivtv_streams_cleanup(struct ivtv *itv) | 312 | void ivtv_streams_cleanup(struct ivtv *itv, int unregister) |
313 | { | 313 | { |
314 | int type; | 314 | int type; |
315 | 315 | ||
@@ -322,8 +322,11 @@ void ivtv_streams_cleanup(struct ivtv *itv) | |||
322 | continue; | 322 | continue; |
323 | 323 | ||
324 | ivtv_stream_free(&itv->streams[type]); | 324 | ivtv_stream_free(&itv->streams[type]); |
325 | /* Unregister device */ | 325 | /* Unregister or release device */ |
326 | video_unregister_device(vdev); | 326 | if (unregister) |
327 | video_unregister_device(vdev); | ||
328 | else | ||
329 | video_device_release(vdev); | ||
327 | } | 330 | } |
328 | } | 331 | } |
329 | 332 | ||
diff --git a/drivers/media/video/ivtv/ivtv-streams.h b/drivers/media/video/ivtv/ivtv-streams.h index 3d76a415fbd8..a653a5136417 100644 --- a/drivers/media/video/ivtv/ivtv-streams.h +++ b/drivers/media/video/ivtv/ivtv-streams.h | |||
@@ -23,7 +23,7 @@ | |||
23 | 23 | ||
24 | int ivtv_streams_setup(struct ivtv *itv); | 24 | int ivtv_streams_setup(struct ivtv *itv); |
25 | int ivtv_streams_register(struct ivtv *itv); | 25 | int ivtv_streams_register(struct ivtv *itv); |
26 | void ivtv_streams_cleanup(struct ivtv *itv); | 26 | void ivtv_streams_cleanup(struct ivtv *itv, int unregister); |
27 | 27 | ||
28 | /* Capture related */ | 28 | /* Capture related */ |
29 | int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s); | 29 | int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s); |
diff --git a/drivers/media/video/ivtv/ivtv-vbi.c b/drivers/media/video/ivtv/ivtv-vbi.c index c151bcf5519a..71798f0da27f 100644 --- a/drivers/media/video/ivtv/ivtv-vbi.c +++ b/drivers/media/video/ivtv/ivtv-vbi.c | |||
@@ -169,7 +169,8 @@ static void copy_vbi_data(struct ivtv *itv, int lines, u32 pts_stamp) | |||
169 | linemask[0] |= (1 << l); | 169 | linemask[0] |= (1 << l); |
170 | else | 170 | else |
171 | linemask[1] |= (1 << (l - 32)); | 171 | linemask[1] |= (1 << (l - 32)); |
172 | dst[sd + 12 + line * 43] = service2vbi(itv->vbi.sliced_data[i].id); | 172 | dst[sd + 12 + line * 43] = |
173 | ivtv_service2vbi(itv->vbi.sliced_data[i].id); | ||
173 | memcpy(dst + sd + 12 + line * 43 + 1, itv->vbi.sliced_data[i].data, 42); | 174 | memcpy(dst + sd + 12 + line * 43 + 1, itv->vbi.sliced_data[i].data, 42); |
174 | line++; | 175 | line++; |
175 | } | 176 | } |
diff --git a/drivers/media/video/ivtv/ivtv-yuv.c b/drivers/media/video/ivtv/ivtv-yuv.c index 62f70bd5e3cb..a9417f6e4087 100644 --- a/drivers/media/video/ivtv/ivtv-yuv.c +++ b/drivers/media/video/ivtv/ivtv-yuv.c | |||
@@ -908,7 +908,7 @@ static void ivtv_yuv_init(struct ivtv *itv) | |||
908 | } | 908 | } |
909 | 909 | ||
910 | /* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */ | 910 | /* We need a buffer for blanking when Y plane is offset - non-fatal if we can't get one */ |
911 | yi->blanking_ptr = kzalloc(720 * 16, GFP_KERNEL); | 911 | yi->blanking_ptr = kzalloc(720 * 16, GFP_KERNEL|__GFP_NOWARN); |
912 | if (yi->blanking_ptr) { | 912 | if (yi->blanking_ptr) { |
913 | yi->blanking_dmaptr = pci_map_single(itv->dev, yi->blanking_ptr, 720*16, PCI_DMA_TODEVICE); | 913 | yi->blanking_dmaptr = pci_map_single(itv->dev, yi->blanking_ptr, 720*16, PCI_DMA_TODEVICE); |
914 | } else { | 914 | } else { |
diff --git a/drivers/media/video/ivtv/ivtvfb.c b/drivers/media/video/ivtv/ivtvfb.c index df789f683e63..73be154f7f05 100644 --- a/drivers/media/video/ivtv/ivtvfb.c +++ b/drivers/media/video/ivtv/ivtvfb.c | |||
@@ -948,7 +948,8 @@ static int ivtvfb_init_vidmode(struct ivtv *itv) | |||
948 | } | 948 | } |
949 | 949 | ||
950 | /* Allocate the pseudo palette */ | 950 | /* Allocate the pseudo palette */ |
951 | oi->ivtvfb_info.pseudo_palette = kmalloc(sizeof(u32) * 16, GFP_KERNEL); | 951 | oi->ivtvfb_info.pseudo_palette = |
952 | kmalloc(sizeof(u32) * 16, GFP_KERNEL|__GFP_NOWARN); | ||
952 | 953 | ||
953 | if (!oi->ivtvfb_info.pseudo_palette) { | 954 | if (!oi->ivtvfb_info.pseudo_palette) { |
954 | IVTVFB_ERR("abort, unable to alloc pseudo pallete\n"); | 955 | IVTVFB_ERR("abort, unable to alloc pseudo pallete\n"); |
@@ -1056,7 +1057,8 @@ static int ivtvfb_init_card(struct ivtv *itv) | |||
1056 | return -EBUSY; | 1057 | return -EBUSY; |
1057 | } | 1058 | } |
1058 | 1059 | ||
1059 | itv->osd_info = kzalloc(sizeof(struct osd_info), GFP_ATOMIC); | 1060 | itv->osd_info = kzalloc(sizeof(struct osd_info), |
1061 | GFP_ATOMIC|__GFP_NOWARN); | ||
1060 | if (itv->osd_info == NULL) { | 1062 | if (itv->osd_info == NULL) { |
1061 | IVTVFB_ERR("Failed to allocate memory for osd_info\n"); | 1063 | IVTVFB_ERR("Failed to allocate memory for osd_info\n"); |
1062 | return -ENOMEM; | 1064 | return -ENOMEM; |
diff --git a/drivers/media/video/mt9m001.c b/drivers/media/video/mt9m001.c index 179e47049a45..ee43499544c1 100644 --- a/drivers/media/video/mt9m001.c +++ b/drivers/media/video/mt9m001.c | |||
@@ -12,15 +12,12 @@ | |||
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/i2c.h> | 13 | #include <linux/i2c.h> |
14 | #include <linux/log2.h> | 14 | #include <linux/log2.h> |
15 | #include <linux/gpio.h> | ||
15 | 16 | ||
16 | #include <media/v4l2-common.h> | 17 | #include <media/v4l2-common.h> |
17 | #include <media/v4l2-chip-ident.h> | 18 | #include <media/v4l2-chip-ident.h> |
18 | #include <media/soc_camera.h> | 19 | #include <media/soc_camera.h> |
19 | 20 | ||
20 | #ifdef CONFIG_MT9M001_PCA9536_SWITCH | ||
21 | #include <asm/gpio.h> | ||
22 | #endif | ||
23 | |||
24 | /* mt9m001 i2c address 0x5d | 21 | /* mt9m001 i2c address 0x5d |
25 | * The platform has to define i2c_board_info | 22 | * The platform has to define i2c_board_info |
26 | * and call i2c_register_board_info() */ | 23 | * and call i2c_register_board_info() */ |
diff --git a/drivers/media/video/mt9v022.c b/drivers/media/video/mt9v022.c index d1391ac55096..1658fe590392 100644 --- a/drivers/media/video/mt9v022.c +++ b/drivers/media/video/mt9v022.c | |||
@@ -13,15 +13,12 @@ | |||
13 | #include <linux/i2c.h> | 13 | #include <linux/i2c.h> |
14 | #include <linux/delay.h> | 14 | #include <linux/delay.h> |
15 | #include <linux/log2.h> | 15 | #include <linux/log2.h> |
16 | #include <linux/gpio.h> | ||
16 | 17 | ||
17 | #include <media/v4l2-common.h> | 18 | #include <media/v4l2-common.h> |
18 | #include <media/v4l2-chip-ident.h> | 19 | #include <media/v4l2-chip-ident.h> |
19 | #include <media/soc_camera.h> | 20 | #include <media/soc_camera.h> |
20 | 21 | ||
21 | #ifdef CONFIG_MT9M001_PCA9536_SWITCH | ||
22 | #include <asm/gpio.h> | ||
23 | #endif | ||
24 | |||
25 | /* mt9v022 i2c address 0x48, 0x4c, 0x58, 0x5c | 22 | /* mt9v022 i2c address 0x48, 0x4c, 0x58, 0x5c |
26 | * The platform has to define i2c_board_info | 23 | * The platform has to define i2c_board_info |
27 | * and call i2c_register_board_info() */ | 24 | * and call i2c_register_board_info() */ |
@@ -91,7 +88,7 @@ static const struct soc_camera_data_format mt9v022_monochrome_formats[] = { | |||
91 | struct mt9v022 { | 88 | struct mt9v022 { |
92 | struct i2c_client *client; | 89 | struct i2c_client *client; |
93 | struct soc_camera_device icd; | 90 | struct soc_camera_device icd; |
94 | int model; /* V4L2_IDENT_MT9M001* codes from v4l2-chip-ident.h */ | 91 | int model; /* V4L2_IDENT_MT9V022* codes from v4l2-chip-ident.h */ |
95 | int switch_gpio; | 92 | int switch_gpio; |
96 | u16 chip_control; | 93 | u16 chip_control; |
97 | unsigned char datawidth; | 94 | unsigned char datawidth; |
diff --git a/drivers/media/video/pvrusb2/Kconfig b/drivers/media/video/pvrusb2/Kconfig index 9620c67fae77..4482b2c72ced 100644 --- a/drivers/media/video/pvrusb2/Kconfig +++ b/drivers/media/video/pvrusb2/Kconfig | |||
@@ -1,8 +1,10 @@ | |||
1 | config VIDEO_PVRUSB2 | 1 | config VIDEO_PVRUSB2 |
2 | tristate "Hauppauge WinTV-PVR USB2 support" | 2 | tristate "Hauppauge WinTV-PVR USB2 support" |
3 | depends on VIDEO_V4L2 && I2C | 3 | depends on VIDEO_V4L2 && I2C |
4 | depends on VIDEO_MEDIA # Avoids pvrusb = Y / DVB = M | ||
5 | depends on HOTPLUG # due to FW_LOADER | ||
4 | select FW_LOADER | 6 | select FW_LOADER |
5 | select MEDIA_TUNER | 7 | select VIDEO_TUNER |
6 | select VIDEO_TVEEPROM | 8 | select VIDEO_TVEEPROM |
7 | select VIDEO_CX2341X | 9 | select VIDEO_CX2341X |
8 | select VIDEO_SAA711X | 10 | select VIDEO_SAA711X |
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig index 40e4c3bd2cb9..83f076abce35 100644 --- a/drivers/media/video/saa7134/Kconfig +++ b/drivers/media/video/saa7134/Kconfig | |||
@@ -3,7 +3,7 @@ config VIDEO_SAA7134 | |||
3 | depends on VIDEO_DEV && PCI && I2C && INPUT | 3 | depends on VIDEO_DEV && PCI && I2C && INPUT |
4 | select VIDEOBUF_DMA_SG | 4 | select VIDEOBUF_DMA_SG |
5 | select VIDEO_IR | 5 | select VIDEO_IR |
6 | select MEDIA_TUNER | 6 | select VIDEO_TUNER |
7 | select VIDEO_TVEEPROM | 7 | select VIDEO_TVEEPROM |
8 | select CRC32 | 8 | select CRC32 |
9 | ---help--- | 9 | ---help--- |
@@ -27,6 +27,7 @@ config VIDEO_SAA7134_ALSA | |||
27 | config VIDEO_SAA7134_DVB | 27 | config VIDEO_SAA7134_DVB |
28 | tristate "DVB/ATSC Support for saa7134 based TV cards" | 28 | tristate "DVB/ATSC Support for saa7134 based TV cards" |
29 | depends on VIDEO_SAA7134 && DVB_CORE | 29 | depends on VIDEO_SAA7134 && DVB_CORE |
30 | depends on HOTPLUG # due to FW_LOADER | ||
30 | select VIDEOBUF_DVB | 31 | select VIDEOBUF_DVB |
31 | select FW_LOADER | 32 | select FW_LOADER |
32 | select DVB_PLL if !DVB_FE_CUSTOMISE | 33 | select DVB_PLL if !DVB_FE_CUSTOMISE |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index eec127864fe3..2c19cd0113c8 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
@@ -864,7 +864,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
864 | struct saa7134_dev *dev; | 864 | struct saa7134_dev *dev; |
865 | struct saa7134_mpeg_ops *mops; | 865 | struct saa7134_mpeg_ops *mops; |
866 | int err; | 866 | int err; |
867 | int mask; | ||
868 | 867 | ||
869 | if (saa7134_devcount == SAA7134_MAXBOARDS) | 868 | if (saa7134_devcount == SAA7134_MAXBOARDS) |
870 | return -ENOMEM; | 869 | return -ENOMEM; |
@@ -1065,11 +1064,6 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
1065 | if (TUNER_ABSENT != dev->tuner_type) | 1064 | if (TUNER_ABSENT != dev->tuner_type) |
1066 | saa7134_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL); | 1065 | saa7134_i2c_call_clients(dev, TUNER_SET_STANDBY, NULL); |
1067 | 1066 | ||
1068 | if (card(dev).gpiomask != 0) { | ||
1069 | mask = card(dev).gpiomask; | ||
1070 | saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask); | ||
1071 | saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, 0); | ||
1072 | } | ||
1073 | return 0; | 1067 | return 0; |
1074 | 1068 | ||
1075 | fail4: | 1069 | fail4: |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index 2d16be2259db..469f93aac008 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
@@ -538,19 +538,23 @@ static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe) | |||
538 | return 0; | 538 | return 0; |
539 | } | 539 | } |
540 | 540 | ||
541 | static void configure_tda827x_fe(struct saa7134_dev *dev, struct tda1004x_config *cdec_conf, | 541 | static int configure_tda827x_fe(struct saa7134_dev *dev, |
542 | struct tda827x_config *tuner_conf) | 542 | struct tda1004x_config *cdec_conf, |
543 | struct tda827x_config *tuner_conf) | ||
543 | { | 544 | { |
544 | dev->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap); | 545 | dev->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap); |
545 | if (dev->dvb.frontend) { | 546 | if (dev->dvb.frontend) { |
546 | if (cdec_conf->i2c_gate) | 547 | if (cdec_conf->i2c_gate) |
547 | dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl; | 548 | dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl; |
548 | if (dvb_attach(tda827x_attach, dev->dvb.frontend, cdec_conf->tuner_address, | 549 | if (dvb_attach(tda827x_attach, dev->dvb.frontend, |
549 | &dev->i2c_adap, tuner_conf) == NULL) { | 550 | cdec_conf->tuner_address, |
550 | wprintk("no tda827x tuner found at addr: %02x\n", | 551 | &dev->i2c_adap, tuner_conf)) |
552 | return 0; | ||
553 | |||
554 | wprintk("no tda827x tuner found at addr: %02x\n", | ||
551 | cdec_conf->tuner_address); | 555 | cdec_conf->tuner_address); |
552 | } | ||
553 | } | 556 | } |
557 | return -EINVAL; | ||
554 | } | 558 | } |
555 | 559 | ||
556 | /* ------------------------------------------------------------------ */ | 560 | /* ------------------------------------------------------------------ */ |
@@ -997,7 +1001,9 @@ static int dvb_init(struct saa7134_dev *dev) | |||
997 | break; | 1001 | break; |
998 | case SAA7134_BOARD_FLYDVBTDUO: | 1002 | case SAA7134_BOARD_FLYDVBTDUO: |
999 | case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS: | 1003 | case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS: |
1000 | configure_tda827x_fe(dev, &tda827x_lifeview_config, &tda827x_cfg_0); | 1004 | if (configure_tda827x_fe(dev, &tda827x_lifeview_config, |
1005 | &tda827x_cfg_0) < 0) | ||
1006 | goto dettach_frontend; | ||
1001 | break; | 1007 | break; |
1002 | case SAA7134_BOARD_PHILIPS_EUROPA: | 1008 | case SAA7134_BOARD_PHILIPS_EUROPA: |
1003 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | 1009 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: |
@@ -1022,36 +1028,52 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1022 | } | 1028 | } |
1023 | break; | 1029 | break; |
1024 | case SAA7134_BOARD_KWORLD_DVBT_210: | 1030 | case SAA7134_BOARD_KWORLD_DVBT_210: |
1025 | configure_tda827x_fe(dev, &kworld_dvb_t_210_config, &tda827x_cfg_2); | 1031 | if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config, |
1032 | &tda827x_cfg_2) < 0) | ||
1033 | goto dettach_frontend; | ||
1026 | break; | 1034 | break; |
1027 | case SAA7134_BOARD_PHILIPS_TIGER: | 1035 | case SAA7134_BOARD_PHILIPS_TIGER: |
1028 | configure_tda827x_fe(dev, &philips_tiger_config, &tda827x_cfg_0); | 1036 | if (configure_tda827x_fe(dev, &philips_tiger_config, |
1037 | &tda827x_cfg_0) < 0) | ||
1038 | goto dettach_frontend; | ||
1029 | break; | 1039 | break; |
1030 | case SAA7134_BOARD_PINNACLE_PCTV_310i: | 1040 | case SAA7134_BOARD_PINNACLE_PCTV_310i: |
1031 | configure_tda827x_fe(dev, &pinnacle_pctv_310i_config, &tda827x_cfg_1); | 1041 | if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config, |
1042 | &tda827x_cfg_1) < 0) | ||
1043 | goto dettach_frontend; | ||
1032 | break; | 1044 | break; |
1033 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: | 1045 | case SAA7134_BOARD_HAUPPAUGE_HVR1110: |
1034 | configure_tda827x_fe(dev, &hauppauge_hvr_1110_config, &tda827x_cfg_1); | 1046 | if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config, |
1047 | &tda827x_cfg_1) < 0) | ||
1048 | goto dettach_frontend; | ||
1035 | break; | 1049 | break; |
1036 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: | 1050 | case SAA7134_BOARD_ASUSTeK_P7131_DUAL: |
1037 | configure_tda827x_fe(dev, &asus_p7131_dual_config, &tda827x_cfg_0); | 1051 | if (configure_tda827x_fe(dev, &asus_p7131_dual_config, |
1052 | &tda827x_cfg_0) < 0) | ||
1053 | goto dettach_frontend; | ||
1038 | break; | 1054 | break; |
1039 | case SAA7134_BOARD_FLYDVBT_LR301: | 1055 | case SAA7134_BOARD_FLYDVBT_LR301: |
1040 | configure_tda827x_fe(dev, &tda827x_lifeview_config, &tda827x_cfg_0); | 1056 | if (configure_tda827x_fe(dev, &tda827x_lifeview_config, |
1057 | &tda827x_cfg_0) < 0) | ||
1058 | goto dettach_frontend; | ||
1041 | break; | 1059 | break; |
1042 | case SAA7134_BOARD_FLYDVB_TRIO: | 1060 | case SAA7134_BOARD_FLYDVB_TRIO: |
1043 | if(! use_frontend) { /* terrestrial */ | 1061 | if (!use_frontend) { /* terrestrial */ |
1044 | configure_tda827x_fe(dev, &lifeview_trio_config, &tda827x_cfg_0); | 1062 | if (configure_tda827x_fe(dev, &lifeview_trio_config, |
1063 | &tda827x_cfg_0) < 0) | ||
1064 | goto dettach_frontend; | ||
1045 | } else { /* satellite */ | 1065 | } else { /* satellite */ |
1046 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap); | 1066 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap); |
1047 | if (dev->dvb.frontend) { | 1067 | if (dev->dvb.frontend) { |
1048 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63, | 1068 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63, |
1049 | &dev->i2c_adap, 0) == NULL) { | 1069 | &dev->i2c_adap, 0) == NULL) { |
1050 | wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__); | 1070 | wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__); |
1071 | goto dettach_frontend; | ||
1051 | } | 1072 | } |
1052 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap, | 1073 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap, |
1053 | 0x08, 0, 0) == NULL) { | 1074 | 0x08, 0, 0) == NULL) { |
1054 | wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__); | 1075 | wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__); |
1076 | goto dettach_frontend; | ||
1055 | } | 1077 | } |
1056 | } | 1078 | } |
1057 | } | 1079 | } |
@@ -1067,15 +1089,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1067 | &ads_duo_cfg) == NULL) { | 1089 | &ads_duo_cfg) == NULL) { |
1068 | wprintk("no tda827x tuner found at addr: %02x\n", | 1090 | wprintk("no tda827x tuner found at addr: %02x\n", |
1069 | ads_tech_duo_config.tuner_address); | 1091 | ads_tech_duo_config.tuner_address); |
1092 | goto dettach_frontend; | ||
1070 | } | 1093 | } |
1071 | } | 1094 | } |
1072 | break; | 1095 | break; |
1073 | case SAA7134_BOARD_TEVION_DVBT_220RF: | 1096 | case SAA7134_BOARD_TEVION_DVBT_220RF: |
1074 | configure_tda827x_fe(dev, &tevion_dvbt220rf_config, &tda827x_cfg_0); | 1097 | if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config, |
1098 | &tda827x_cfg_0) < 0) | ||
1099 | goto dettach_frontend; | ||
1075 | break; | 1100 | break; |
1076 | case SAA7134_BOARD_MEDION_MD8800_QUADRO: | 1101 | case SAA7134_BOARD_MEDION_MD8800_QUADRO: |
1077 | if (!use_frontend) { /* terrestrial */ | 1102 | if (!use_frontend) { /* terrestrial */ |
1078 | configure_tda827x_fe(dev, &md8800_dvbt_config, &tda827x_cfg_0); | 1103 | if (configure_tda827x_fe(dev, &md8800_dvbt_config, |
1104 | &tda827x_cfg_0) < 0) | ||
1105 | goto dettach_frontend; | ||
1079 | } else { /* satellite */ | 1106 | } else { /* satellite */ |
1080 | dev->dvb.frontend = dvb_attach(tda10086_attach, | 1107 | dev->dvb.frontend = dvb_attach(tda10086_attach, |
1081 | &flydvbs, &dev->i2c_adap); | 1108 | &flydvbs, &dev->i2c_adap); |
@@ -1086,16 +1113,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1086 | struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1}; | 1113 | struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1}; |
1087 | 1114 | ||
1088 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, | 1115 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, |
1089 | 0x60, &dev->i2c_adap, 0) == NULL) | 1116 | 0x60, &dev->i2c_adap, 0) == NULL) { |
1090 | wprintk("%s: Medion Quadro, no tda826x " | 1117 | wprintk("%s: Medion Quadro, no tda826x " |
1091 | "found !\n", __func__); | 1118 | "found !\n", __func__); |
1119 | goto dettach_frontend; | ||
1120 | } | ||
1092 | if (dev_id != 0x08) { | 1121 | if (dev_id != 0x08) { |
1093 | /* we need to open the i2c gate (we know it exists) */ | 1122 | /* we need to open the i2c gate (we know it exists) */ |
1094 | fe->ops.i2c_gate_ctrl(fe, 1); | 1123 | fe->ops.i2c_gate_ctrl(fe, 1); |
1095 | if (dvb_attach(isl6405_attach, fe, | 1124 | if (dvb_attach(isl6405_attach, fe, |
1096 | &dev->i2c_adap, 0x08, 0, 0) == NULL) | 1125 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1097 | wprintk("%s: Medion Quadro, no ISL6405 " | 1126 | wprintk("%s: Medion Quadro, no ISL6405 " |
1098 | "found !\n", __func__); | 1127 | "found !\n", __func__); |
1128 | goto dettach_frontend; | ||
1129 | } | ||
1099 | if (dev_id == 0x07) { | 1130 | if (dev_id == 0x07) { |
1100 | /* fire up the 2nd section of the LNB supply since | 1131 | /* fire up the 2nd section of the LNB supply since |
1101 | we can't do this from the other section */ | 1132 | we can't do this from the other section */ |
@@ -1117,19 +1148,17 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1117 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: | 1148 | case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: |
1118 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180, | 1149 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180, |
1119 | &dev->i2c_adap); | 1150 | &dev->i2c_adap); |
1120 | if (dev->dvb.frontend) { | 1151 | if (dev->dvb.frontend) |
1121 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, | 1152 | dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, |
1122 | NULL, DVB_PLL_TDHU2); | 1153 | NULL, DVB_PLL_TDHU2); |
1123 | } | ||
1124 | break; | 1154 | break; |
1125 | case SAA7134_BOARD_KWORLD_ATSC110: | 1155 | case SAA7134_BOARD_KWORLD_ATSC110: |
1126 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110, | 1156 | dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110, |
1127 | &dev->i2c_adap); | 1157 | &dev->i2c_adap); |
1128 | if (dev->dvb.frontend) { | 1158 | if (dev->dvb.frontend) |
1129 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, | 1159 | dvb_attach(simple_tuner_attach, dev->dvb.frontend, |
1130 | &dev->i2c_adap, 0x61, | 1160 | &dev->i2c_adap, 0x61, |
1131 | TUNER_PHILIPS_TUV1236D); | 1161 | TUNER_PHILIPS_TUV1236D); |
1132 | } | ||
1133 | break; | 1162 | break; |
1134 | case SAA7134_BOARD_FLYDVBS_LR300: | 1163 | case SAA7134_BOARD_FLYDVBS_LR300: |
1135 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, | 1164 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, |
@@ -1138,10 +1167,12 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1138 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, | 1167 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, |
1139 | &dev->i2c_adap, 0) == NULL) { | 1168 | &dev->i2c_adap, 0) == NULL) { |
1140 | wprintk("%s: No tda826x found!\n", __func__); | 1169 | wprintk("%s: No tda826x found!\n", __func__); |
1170 | goto dettach_frontend; | ||
1141 | } | 1171 | } |
1142 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, | 1172 | if (dvb_attach(isl6421_attach, dev->dvb.frontend, |
1143 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { | 1173 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1144 | wprintk("%s: No ISL6421 found!\n", __func__); | 1174 | wprintk("%s: No ISL6421 found!\n", __func__); |
1175 | goto dettach_frontend; | ||
1145 | } | 1176 | } |
1146 | } | 1177 | } |
1147 | break; | 1178 | break; |
@@ -1168,43 +1199,65 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1168 | } | 1199 | } |
1169 | break; | 1200 | break; |
1170 | case SAA7134_BOARD_CINERGY_HT_PCMCIA: | 1201 | case SAA7134_BOARD_CINERGY_HT_PCMCIA: |
1171 | configure_tda827x_fe(dev, &cinergy_ht_config, &tda827x_cfg_0); | 1202 | if (configure_tda827x_fe(dev, &cinergy_ht_config, |
1203 | &tda827x_cfg_0) < 0) | ||
1204 | goto dettach_frontend; | ||
1172 | break; | 1205 | break; |
1173 | case SAA7134_BOARD_CINERGY_HT_PCI: | 1206 | case SAA7134_BOARD_CINERGY_HT_PCI: |
1174 | configure_tda827x_fe(dev, &cinergy_ht_pci_config, &tda827x_cfg_0); | 1207 | if (configure_tda827x_fe(dev, &cinergy_ht_pci_config, |
1208 | &tda827x_cfg_0) < 0) | ||
1209 | goto dettach_frontend; | ||
1175 | break; | 1210 | break; |
1176 | case SAA7134_BOARD_PHILIPS_TIGER_S: | 1211 | case SAA7134_BOARD_PHILIPS_TIGER_S: |
1177 | configure_tda827x_fe(dev, &philips_tiger_s_config, &tda827x_cfg_2); | 1212 | if (configure_tda827x_fe(dev, &philips_tiger_s_config, |
1213 | &tda827x_cfg_2) < 0) | ||
1214 | goto dettach_frontend; | ||
1178 | break; | 1215 | break; |
1179 | case SAA7134_BOARD_ASUS_P7131_4871: | 1216 | case SAA7134_BOARD_ASUS_P7131_4871: |
1180 | configure_tda827x_fe(dev, &asus_p7131_4871_config, &tda827x_cfg_2); | 1217 | if (configure_tda827x_fe(dev, &asus_p7131_4871_config, |
1218 | &tda827x_cfg_2) < 0) | ||
1219 | goto dettach_frontend; | ||
1181 | break; | 1220 | break; |
1182 | case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: | 1221 | case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: |
1183 | configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config, &tda827x_cfg_2); | 1222 | if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config, |
1223 | &tda827x_cfg_2) < 0) | ||
1224 | goto dettach_frontend; | ||
1184 | break; | 1225 | break; |
1185 | case SAA7134_BOARD_AVERMEDIA_SUPER_007: | 1226 | case SAA7134_BOARD_AVERMEDIA_SUPER_007: |
1186 | configure_tda827x_fe(dev, &avermedia_super_007_config, &tda827x_cfg_0); | 1227 | if (configure_tda827x_fe(dev, &avermedia_super_007_config, |
1228 | &tda827x_cfg_0) < 0) | ||
1229 | goto dettach_frontend; | ||
1187 | break; | 1230 | break; |
1188 | case SAA7134_BOARD_TWINHAN_DTV_DVB_3056: | 1231 | case SAA7134_BOARD_TWINHAN_DTV_DVB_3056: |
1189 | configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config, &tda827x_cfg_2_sw42); | 1232 | if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config, |
1233 | &tda827x_cfg_2_sw42) < 0) | ||
1234 | goto dettach_frontend; | ||
1190 | break; | 1235 | break; |
1191 | case SAA7134_BOARD_PHILIPS_SNAKE: | 1236 | case SAA7134_BOARD_PHILIPS_SNAKE: |
1192 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, | 1237 | dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, |
1193 | &dev->i2c_adap); | 1238 | &dev->i2c_adap); |
1194 | if (dev->dvb.frontend) { | 1239 | if (dev->dvb.frontend) { |
1195 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, | 1240 | if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, |
1196 | &dev->i2c_adap, 0) == NULL) | 1241 | &dev->i2c_adap, 0) == NULL) { |
1197 | wprintk("%s: No tda826x found!\n", __func__); | 1242 | wprintk("%s: No tda826x found!\n", __func__); |
1243 | goto dettach_frontend; | ||
1244 | } | ||
1198 | if (dvb_attach(lnbp21_attach, dev->dvb.frontend, | 1245 | if (dvb_attach(lnbp21_attach, dev->dvb.frontend, |
1199 | &dev->i2c_adap, 0, 0) == NULL) | 1246 | &dev->i2c_adap, 0, 0) == NULL) { |
1200 | wprintk("%s: No lnbp21 found!\n", __func__); | 1247 | wprintk("%s: No lnbp21 found!\n", __func__); |
1248 | goto dettach_frontend; | ||
1249 | } | ||
1201 | } | 1250 | } |
1202 | break; | 1251 | break; |
1203 | case SAA7134_BOARD_CREATIX_CTX953: | 1252 | case SAA7134_BOARD_CREATIX_CTX953: |
1204 | configure_tda827x_fe(dev, &md8800_dvbt_config, &tda827x_cfg_0); | 1253 | if (configure_tda827x_fe(dev, &md8800_dvbt_config, |
1254 | &tda827x_cfg_0) < 0) | ||
1255 | goto dettach_frontend; | ||
1205 | break; | 1256 | break; |
1206 | case SAA7134_BOARD_MSI_TVANYWHERE_AD11: | 1257 | case SAA7134_BOARD_MSI_TVANYWHERE_AD11: |
1207 | configure_tda827x_fe(dev, &philips_tiger_s_config, &tda827x_cfg_2); | 1258 | if (configure_tda827x_fe(dev, &philips_tiger_s_config, |
1259 | &tda827x_cfg_2) < 0) | ||
1260 | goto dettach_frontend; | ||
1208 | break; | 1261 | break; |
1209 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: | 1262 | case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: |
1210 | dev->dvb.frontend = dvb_attach(mt352_attach, | 1263 | dev->dvb.frontend = dvb_attach(mt352_attach, |
@@ -1218,16 +1271,20 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1218 | if (dev->dvb.frontend) { | 1271 | if (dev->dvb.frontend) { |
1219 | struct dvb_frontend *fe; | 1272 | struct dvb_frontend *fe; |
1220 | if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, | 1273 | if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, |
1221 | &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) | 1274 | &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) { |
1222 | wprintk("%s: MD7134 DVB-S, no SD1878 " | 1275 | wprintk("%s: MD7134 DVB-S, no SD1878 " |
1223 | "found !\n", __func__); | 1276 | "found !\n", __func__); |
1277 | goto dettach_frontend; | ||
1278 | } | ||
1224 | /* we need to open the i2c gate (we know it exists) */ | 1279 | /* we need to open the i2c gate (we know it exists) */ |
1225 | fe = dev->dvb.frontend; | 1280 | fe = dev->dvb.frontend; |
1226 | fe->ops.i2c_gate_ctrl(fe, 1); | 1281 | fe->ops.i2c_gate_ctrl(fe, 1); |
1227 | if (dvb_attach(isl6405_attach, fe, | 1282 | if (dvb_attach(isl6405_attach, fe, |
1228 | &dev->i2c_adap, 0x08, 0, 0) == NULL) | 1283 | &dev->i2c_adap, 0x08, 0, 0) == NULL) { |
1229 | wprintk("%s: MD7134 DVB-S, no ISL6405 " | 1284 | wprintk("%s: MD7134 DVB-S, no ISL6405 " |
1230 | "found !\n", __func__); | 1285 | "found !\n", __func__); |
1286 | goto dettach_frontend; | ||
1287 | } | ||
1231 | fe->ops.i2c_gate_ctrl(fe, 0); | 1288 | fe->ops.i2c_gate_ctrl(fe, 0); |
1232 | dev->original_set_voltage = fe->ops.set_voltage; | 1289 | dev->original_set_voltage = fe->ops.set_voltage; |
1233 | fe->ops.set_voltage = md8800_set_voltage; | 1290 | fe->ops.set_voltage = md8800_set_voltage; |
@@ -1254,10 +1311,7 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1254 | if (!fe) { | 1311 | if (!fe) { |
1255 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", | 1312 | printk(KERN_ERR "%s/2: xc3028 attach failed\n", |
1256 | dev->name); | 1313 | dev->name); |
1257 | dvb_frontend_detach(dev->dvb.frontend); | 1314 | goto dettach_frontend; |
1258 | dvb_unregister_frontend(dev->dvb.frontend); | ||
1259 | dev->dvb.frontend = NULL; | ||
1260 | return -1; | ||
1261 | } | 1315 | } |
1262 | } | 1316 | } |
1263 | 1317 | ||
@@ -1282,6 +1336,12 @@ static int dvb_init(struct saa7134_dev *dev) | |||
1282 | dev->dvb.frontend->ops.tuner_ops.sleep(dev->dvb.frontend); | 1336 | dev->dvb.frontend->ops.tuner_ops.sleep(dev->dvb.frontend); |
1283 | } | 1337 | } |
1284 | return ret; | 1338 | return ret; |
1339 | |||
1340 | dettach_frontend: | ||
1341 | dvb_frontend_detach(dev->dvb.frontend); | ||
1342 | dev->dvb.frontend = NULL; | ||
1343 | |||
1344 | return -1; | ||
1285 | } | 1345 | } |
1286 | 1346 | ||
1287 | static int dvb_fini(struct saa7134_dev *dev) | 1347 | static int dvb_fini(struct saa7134_dev *dev) |
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index a0baf2d0ba7f..48e1a01718ec 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
@@ -1634,7 +1634,7 @@ static int saa7134_s_fmt_overlay(struct file *file, void *priv, | |||
1634 | struct saa7134_fh *fh = priv; | 1634 | struct saa7134_fh *fh = priv; |
1635 | struct saa7134_dev *dev = fh->dev; | 1635 | struct saa7134_dev *dev = fh->dev; |
1636 | int err; | 1636 | int err; |
1637 | unsigned int flags; | 1637 | unsigned long flags; |
1638 | 1638 | ||
1639 | if (saa7134_no_overlay > 0) { | 1639 | if (saa7134_no_overlay > 0) { |
1640 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); | 1640 | printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n"); |
diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c index 9276ed997388..b12c60cf5a09 100644 --- a/drivers/media/video/stk-webcam.c +++ b/drivers/media/video/stk-webcam.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/kref.h> | 30 | #include <linux/kref.h> |
31 | 31 | ||
32 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
33 | #include <linux/mm.h> | ||
33 | #include <linux/vmalloc.h> | 34 | #include <linux/vmalloc.h> |
34 | #include <linux/videodev2.h> | 35 | #include <linux/videodev2.h> |
35 | #include <media/v4l2-common.h> | 36 | #include <media/v4l2-common.h> |
@@ -245,6 +246,8 @@ static int stk_initialise(struct stk_camera *dev) | |||
245 | return -1; | 246 | return -1; |
246 | } | 247 | } |
247 | 248 | ||
249 | #ifdef CONFIG_VIDEO_V4L1_COMPAT | ||
250 | |||
248 | /* sysfs functions */ | 251 | /* sysfs functions */ |
249 | /*FIXME cleanup this */ | 252 | /*FIXME cleanup this */ |
250 | 253 | ||
@@ -350,6 +353,10 @@ static void stk_remove_sysfs_files(struct video_device *vdev) | |||
350 | video_device_remove_file(vdev, &dev_attr_vflip); | 353 | video_device_remove_file(vdev, &dev_attr_vflip); |
351 | } | 354 | } |
352 | 355 | ||
356 | #else | ||
357 | #define stk_create_sysfs_files(a) | ||
358 | #define stk_remove_sysfs_files(a) | ||
359 | #endif | ||
353 | 360 | ||
354 | /* *********************************************** */ | 361 | /* *********************************************** */ |
355 | /* | 362 | /* |
diff --git a/drivers/media/video/tcm825x.c b/drivers/media/video/tcm825x.c index e57a64605778..8f0100f67a91 100644 --- a/drivers/media/video/tcm825x.c +++ b/drivers/media/video/tcm825x.c | |||
@@ -885,12 +885,19 @@ static int __exit tcm825x_remove(struct i2c_client *client) | |||
885 | return 0; | 885 | return 0; |
886 | } | 886 | } |
887 | 887 | ||
888 | static const struct i2c_device_id tcm825x_id[] = { | ||
889 | { "tcm825x", 0 }, | ||
890 | { } | ||
891 | }; | ||
892 | MODULE_DEVICE_TABLE(i2c, tcm825x_id); | ||
893 | |||
888 | static struct i2c_driver tcm825x_i2c_driver = { | 894 | static struct i2c_driver tcm825x_i2c_driver = { |
889 | .driver = { | 895 | .driver = { |
890 | .name = TCM825X_NAME, | 896 | .name = TCM825X_NAME, |
891 | }, | 897 | }, |
892 | .probe = tcm825x_probe, | 898 | .probe = tcm825x_probe, |
893 | .remove = __exit_p(tcm825x_remove), | 899 | .remove = __exit_p(tcm825x_remove), |
900 | .id_table = tcm825x_id, | ||
894 | }; | 901 | }; |
895 | 902 | ||
896 | static struct tcm825x_sensor tcm825x = { | 903 | static struct tcm825x_sensor tcm825x = { |
diff --git a/drivers/media/video/tlv320aic23b.c b/drivers/media/video/tlv320aic23b.c index f1db54202dea..28ab9f9d760a 100644 --- a/drivers/media/video/tlv320aic23b.c +++ b/drivers/media/video/tlv320aic23b.c | |||
@@ -168,6 +168,11 @@ static int tlv320aic23b_remove(struct i2c_client *client) | |||
168 | 168 | ||
169 | /* ----------------------------------------------------------------------- */ | 169 | /* ----------------------------------------------------------------------- */ |
170 | 170 | ||
171 | static const struct i2c_device_id tlv320aic23b_id[] = { | ||
172 | { "tlv320aic23b", 0 }, | ||
173 | { } | ||
174 | }; | ||
175 | MODULE_DEVICE_TABLE(i2c, tlv320aic23b_id); | ||
171 | 176 | ||
172 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { | 177 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { |
173 | .name = "tlv320aic23b", | 178 | .name = "tlv320aic23b", |
@@ -175,4 +180,5 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = { | |||
175 | .command = tlv320aic23b_command, | 180 | .command = tlv320aic23b_command, |
176 | .probe = tlv320aic23b_probe, | 181 | .probe = tlv320aic23b_probe, |
177 | .remove = tlv320aic23b_remove, | 182 | .remove = tlv320aic23b_remove, |
183 | .id_table = tlv320aic23b_id, | ||
178 | }; | 184 | }; |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 6bf104ea051d..5a75788b92ae 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
@@ -40,11 +40,11 @@ | |||
40 | typeof(&FUNCTION) __a = symbol_request(FUNCTION); \ | 40 | typeof(&FUNCTION) __a = symbol_request(FUNCTION); \ |
41 | if (__a) { \ | 41 | if (__a) { \ |
42 | __r = (int) __a(ARGS); \ | 42 | __r = (int) __a(ARGS); \ |
43 | symbol_put(FUNCTION); \ | ||
43 | } else { \ | 44 | } else { \ |
44 | printk(KERN_ERR "TUNER: Unable to find " \ | 45 | printk(KERN_ERR "TUNER: Unable to find " \ |
45 | "symbol "#FUNCTION"()\n"); \ | 46 | "symbol "#FUNCTION"()\n"); \ |
46 | } \ | 47 | } \ |
47 | symbol_put(FUNCTION); \ | ||
48 | __r; \ | 48 | __r; \ |
49 | }) | 49 | }) |
50 | 50 | ||
@@ -340,16 +340,6 @@ static void tuner_i2c_address_check(struct tuner *t) | |||
340 | tuner_warn("====================== WARNING! ======================\n"); | 340 | tuner_warn("====================== WARNING! ======================\n"); |
341 | } | 341 | } |
342 | 342 | ||
343 | static void attach_tda829x(struct tuner *t) | ||
344 | { | ||
345 | struct tda829x_config cfg = { | ||
346 | .lna_cfg = t->config, | ||
347 | .tuner_callback = t->tuner_callback, | ||
348 | }; | ||
349 | dvb_attach(tda829x_attach, | ||
350 | &t->fe, t->i2c->adapter, t->i2c->addr, &cfg); | ||
351 | } | ||
352 | |||
353 | static struct xc5000_config xc5000_cfg; | 343 | static struct xc5000_config xc5000_cfg; |
354 | 344 | ||
355 | static void set_type(struct i2c_client *c, unsigned int type, | 345 | static void set_type(struct i2c_client *c, unsigned int type, |
@@ -385,12 +375,19 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
385 | 375 | ||
386 | switch (t->type) { | 376 | switch (t->type) { |
387 | case TUNER_MT2032: | 377 | case TUNER_MT2032: |
388 | dvb_attach(microtune_attach, | 378 | if (!dvb_attach(microtune_attach, |
389 | &t->fe, t->i2c->adapter, t->i2c->addr); | 379 | &t->fe, t->i2c->adapter, t->i2c->addr)) |
380 | goto attach_failed; | ||
390 | break; | 381 | break; |
391 | case TUNER_PHILIPS_TDA8290: | 382 | case TUNER_PHILIPS_TDA8290: |
392 | { | 383 | { |
393 | attach_tda829x(t); | 384 | struct tda829x_config cfg = { |
385 | .lna_cfg = t->config, | ||
386 | .tuner_callback = t->tuner_callback, | ||
387 | }; | ||
388 | if (!dvb_attach(tda829x_attach, &t->fe, t->i2c->adapter, | ||
389 | t->i2c->addr, &cfg)) | ||
390 | goto attach_failed; | ||
394 | break; | 391 | break; |
395 | } | 392 | } |
396 | case TUNER_TEA5767: | 393 | case TUNER_TEA5767: |
@@ -441,8 +438,9 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
441 | break; | 438 | break; |
442 | } | 439 | } |
443 | case TUNER_TDA9887: | 440 | case TUNER_TDA9887: |
444 | dvb_attach(tda9887_attach, | 441 | if (!dvb_attach(tda9887_attach, |
445 | &t->fe, t->i2c->adapter, t->i2c->addr); | 442 | &t->fe, t->i2c->adapter, t->i2c->addr)) |
443 | goto attach_failed; | ||
446 | break; | 444 | break; |
447 | case TUNER_XC5000: | 445 | case TUNER_XC5000: |
448 | { | 446 | { |
@@ -450,10 +448,10 @@ static void set_type(struct i2c_client *c, unsigned int type, | |||
450 | 448 | ||
451 | xc5000_cfg.i2c_address = t->i2c->addr; | 449 | xc5000_cfg.i2c_address = t->i2c->addr; |
452 | xc5000_cfg.if_khz = 5380; | 450 | xc5000_cfg.if_khz = 5380; |
453 | xc5000_cfg.priv = c->adapter->algo_data; | ||
454 | xc5000_cfg.tuner_callback = t->tuner_callback; | 451 | xc5000_cfg.tuner_callback = t->tuner_callback; |
455 | if (!dvb_attach(xc5000_attach, | 452 | if (!dvb_attach(xc5000_attach, |
456 | &t->fe, t->i2c->adapter, &xc5000_cfg)) | 453 | &t->fe, t->i2c->adapter, &xc5000_cfg, |
454 | c->adapter->algo_data)) | ||
457 | goto attach_failed; | 455 | goto attach_failed; |
458 | 456 | ||
459 | xc_tuner_ops = &t->fe.ops.tuner_ops; | 457 | xc_tuner_ops = &t->fe.ops.tuner_ops; |
@@ -1167,7 +1165,7 @@ static int tuner_probe(struct i2c_client *client, | |||
1167 | /* If chip is not tda8290, don't register. | 1165 | /* If chip is not tda8290, don't register. |
1168 | since it can be tda9887*/ | 1166 | since it can be tda9887*/ |
1169 | if (tuner_symbol_probe(tda829x_probe, t->i2c->adapter, | 1167 | if (tuner_symbol_probe(tda829x_probe, t->i2c->adapter, |
1170 | t->i2c->addr) == 0) { | 1168 | t->i2c->addr) >= 0) { |
1171 | tuner_dbg("tda829x detected\n"); | 1169 | tuner_dbg("tda829x detected\n"); |
1172 | } else { | 1170 | } else { |
1173 | /* Default is being tda9887 */ | 1171 | /* Default is being tda9887 */ |
@@ -1181,7 +1179,7 @@ static int tuner_probe(struct i2c_client *client, | |||
1181 | case 0x60: | 1179 | case 0x60: |
1182 | if (tuner_symbol_probe(tea5767_autodetection, | 1180 | if (tuner_symbol_probe(tea5767_autodetection, |
1183 | t->i2c->adapter, t->i2c->addr) | 1181 | t->i2c->adapter, t->i2c->addr) |
1184 | != EINVAL) { | 1182 | >= 0) { |
1185 | t->type = TUNER_TEA5767; | 1183 | t->type = TUNER_TEA5767; |
1186 | t->mode_mask = T_RADIO; | 1184 | t->mode_mask = T_RADIO; |
1187 | t->mode = T_STANDBY; | 1185 | t->mode = T_STANDBY; |
diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index 6f9945b04e1f..c77914d99d15 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c | |||
@@ -1505,7 +1505,8 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
1505 | } | 1505 | } |
1506 | 1506 | ||
1507 | /* fill required data structures */ | 1507 | /* fill required data structures */ |
1508 | strcpy(client->name, desc->name); | 1508 | if (!id) |
1509 | strlcpy(client->name, desc->name, I2C_NAME_SIZE); | ||
1509 | chip->type = desc-chiplist; | 1510 | chip->type = desc-chiplist; |
1510 | chip->shadow.count = desc->registers+1; | 1511 | chip->shadow.count = desc->registers+1; |
1511 | chip->prevmode = -1; | 1512 | chip->prevmode = -1; |
@@ -1830,6 +1831,15 @@ static int chip_legacy_probe(struct i2c_adapter *adap) | |||
1830 | return 0; | 1831 | return 0; |
1831 | } | 1832 | } |
1832 | 1833 | ||
1834 | /* This driver supports many devices and the idea is to let the driver | ||
1835 | detect which device is present. So rather than listing all supported | ||
1836 | devices here, we pretend to support a single, fake device type. */ | ||
1837 | static const struct i2c_device_id chip_id[] = { | ||
1838 | { "tvaudio", 0 }, | ||
1839 | { } | ||
1840 | }; | ||
1841 | MODULE_DEVICE_TABLE(i2c, chip_id); | ||
1842 | |||
1833 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { | 1843 | static struct v4l2_i2c_driver_data v4l2_i2c_data = { |
1834 | .name = "tvaudio", | 1844 | .name = "tvaudio", |
1835 | .driverid = I2C_DRIVERID_TVAUDIO, | 1845 | .driverid = I2C_DRIVERID_TVAUDIO, |
@@ -1837,6 +1847,7 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = { | |||
1837 | .probe = chip_probe, | 1847 | .probe = chip_probe, |
1838 | .remove = chip_remove, | 1848 | .remove = chip_remove, |
1839 | .legacy_probe = chip_legacy_probe, | 1849 | .legacy_probe = chip_legacy_probe, |
1850 | .id_table = chip_id, | ||
1840 | }; | 1851 | }; |
1841 | 1852 | ||
1842 | /* | 1853 | /* |
diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c index 3cf8a8e801e5..9da0e1807ffb 100644 --- a/drivers/media/video/tveeprom.c +++ b/drivers/media/video/tveeprom.c | |||
@@ -319,10 +319,12 @@ audioIC[] = | |||
319 | {AUDIO_CHIP_INTERNAL, "CX25843"}, | 319 | {AUDIO_CHIP_INTERNAL, "CX25843"}, |
320 | {AUDIO_CHIP_INTERNAL, "CX23418"}, | 320 | {AUDIO_CHIP_INTERNAL, "CX23418"}, |
321 | {AUDIO_CHIP_INTERNAL, "CX23885"}, | 321 | {AUDIO_CHIP_INTERNAL, "CX23885"}, |
322 | /* 40-42 */ | 322 | /* 40-44 */ |
323 | {AUDIO_CHIP_INTERNAL, "CX23888"}, | 323 | {AUDIO_CHIP_INTERNAL, "CX23888"}, |
324 | {AUDIO_CHIP_INTERNAL, "SAA7131"}, | 324 | {AUDIO_CHIP_INTERNAL, "SAA7131"}, |
325 | {AUDIO_CHIP_INTERNAL, "CX23887"}, | 325 | {AUDIO_CHIP_INTERNAL, "CX23887"}, |
326 | {AUDIO_CHIP_INTERNAL, "SAA7164"}, | ||
327 | {AUDIO_CHIP_INTERNAL, "AU8522"}, | ||
326 | }; | 328 | }; |
327 | 329 | ||
328 | /* This list is supplied by Hauppauge. Thanks! */ | 330 | /* This list is supplied by Hauppauge. Thanks! */ |
@@ -341,8 +343,10 @@ static const char *decoderIC[] = { | |||
341 | "CX882", "TVP5150A", "CX25840", "CX25841", "CX25842", | 343 | "CX882", "TVP5150A", "CX25840", "CX25841", "CX25842", |
342 | /* 30-34 */ | 344 | /* 30-34 */ |
343 | "CX25843", "CX23418", "NEC61153", "CX23885", "CX23888", | 345 | "CX25843", "CX23418", "NEC61153", "CX23885", "CX23888", |
344 | /* 35-37 */ | 346 | /* 35-39 */ |
345 | "SAA7131", "CX25837", "CX23887" | 347 | "SAA7131", "CX25837", "CX23887", "CX23885A", "CX23887A", |
348 | /* 40-42 */ | ||
349 | "SAA7164", "CX23885B", "AU8522" | ||
346 | }; | 350 | }; |
347 | 351 | ||
348 | static int hasRadioTuner(int tunerType) | 352 | static int hasRadioTuner(int tunerType) |
diff --git a/drivers/media/video/usbvision/Kconfig b/drivers/media/video/usbvision/Kconfig index 74e1d3075a20..fc24ef05b3f3 100644 --- a/drivers/media/video/usbvision/Kconfig +++ b/drivers/media/video/usbvision/Kconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | config VIDEO_USBVISION | 1 | config VIDEO_USBVISION |
2 | tristate "USB video devices based on Nogatech NT1003/1004/1005" | 2 | tristate "USB video devices based on Nogatech NT1003/1004/1005" |
3 | depends on I2C && VIDEO_V4L2 | 3 | depends on I2C && VIDEO_V4L2 |
4 | select MEDIA_TUNER | 4 | select VIDEO_TUNER |
5 | select VIDEO_SAA711X if VIDEO_HELPER_CHIPS_AUTO | 5 | select VIDEO_SAA711X if VIDEO_HELPER_CHIPS_AUTO |
6 | ---help--- | 6 | ---help--- |
7 | There are more than 50 different USB video devices based on | 7 | There are more than 50 different USB video devices based on |
diff --git a/drivers/misc/kgdbts.c b/drivers/misc/kgdbts.c index 30a1af857c7a..fa394104339c 100644 --- a/drivers/misc/kgdbts.c +++ b/drivers/misc/kgdbts.c | |||
@@ -47,6 +47,7 @@ | |||
47 | * to test the HW NMI watchdog | 47 | * to test the HW NMI watchdog |
48 | * F## = Break at do_fork for ## iterations | 48 | * F## = Break at do_fork for ## iterations |
49 | * S## = Break at sys_open for ## iterations | 49 | * S## = Break at sys_open for ## iterations |
50 | * I## = Run the single step test ## iterations | ||
50 | * | 51 | * |
51 | * NOTE: that the do_fork and sys_open tests are mutually exclusive. | 52 | * NOTE: that the do_fork and sys_open tests are mutually exclusive. |
52 | * | 53 | * |
@@ -375,7 +376,7 @@ static void emul_sstep_get(char *arg) | |||
375 | break; | 376 | break; |
376 | case 1: | 377 | case 1: |
377 | /* set breakpoint */ | 378 | /* set breakpoint */ |
378 | break_helper("Z0", 0, sstep_addr); | 379 | break_helper("Z0", NULL, sstep_addr); |
379 | break; | 380 | break; |
380 | case 2: | 381 | case 2: |
381 | /* Continue */ | 382 | /* Continue */ |
@@ -383,7 +384,7 @@ static void emul_sstep_get(char *arg) | |||
383 | break; | 384 | break; |
384 | case 3: | 385 | case 3: |
385 | /* Clear breakpoint */ | 386 | /* Clear breakpoint */ |
386 | break_helper("z0", 0, sstep_addr); | 387 | break_helper("z0", NULL, sstep_addr); |
387 | break; | 388 | break; |
388 | default: | 389 | default: |
389 | eprintk("kgdbts: ERROR failed sstep get emulation\n"); | 390 | eprintk("kgdbts: ERROR failed sstep get emulation\n"); |
@@ -465,11 +466,11 @@ static struct test_struct sw_breakpoint_test[] = { | |||
465 | { "?", "S0*" }, /* Clear break points */ | 466 | { "?", "S0*" }, /* Clear break points */ |
466 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ | 467 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ |
467 | { "c", "T0*", }, /* Continue */ | 468 | { "c", "T0*", }, /* Continue */ |
468 | { "g", "kgdbts_break_test", 0, check_and_rewind_pc }, | 469 | { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, |
469 | { "write", "OK", write_regs }, | 470 | { "write", "OK", write_regs }, |
470 | { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ | 471 | { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ |
471 | { "D", "OK" }, /* Detach */ | 472 | { "D", "OK" }, /* Detach */ |
472 | { "D", "OK", 0, got_break }, /* If the test worked we made it here */ | 473 | { "D", "OK", NULL, got_break }, /* On success we made it here */ |
473 | { "", "" }, | 474 | { "", "" }, |
474 | }; | 475 | }; |
475 | 476 | ||
@@ -499,14 +500,14 @@ static struct test_struct singlestep_break_test[] = { | |||
499 | { "?", "S0*" }, /* Clear break points */ | 500 | { "?", "S0*" }, /* Clear break points */ |
500 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ | 501 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ |
501 | { "c", "T0*", }, /* Continue */ | 502 | { "c", "T0*", }, /* Continue */ |
502 | { "g", "kgdbts_break_test", 0, check_and_rewind_pc }, | 503 | { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, |
503 | { "write", "OK", write_regs }, /* Write registers */ | 504 | { "write", "OK", write_regs }, /* Write registers */ |
504 | { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ | 505 | { "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */ |
505 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ | 506 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ |
506 | { "g", "kgdbts_break_test", 0, check_single_step }, | 507 | { "g", "kgdbts_break_test", NULL, check_single_step }, |
507 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ | 508 | { "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */ |
508 | { "c", "T0*", }, /* Continue */ | 509 | { "c", "T0*", }, /* Continue */ |
509 | { "g", "kgdbts_break_test", 0, check_and_rewind_pc }, | 510 | { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, |
510 | { "write", "OK", write_regs }, /* Write registers */ | 511 | { "write", "OK", write_regs }, /* Write registers */ |
511 | { "D", "OK" }, /* Remove all breakpoints and continues */ | 512 | { "D", "OK" }, /* Remove all breakpoints and continues */ |
512 | { "", "" }, | 513 | { "", "" }, |
@@ -520,14 +521,14 @@ static struct test_struct do_fork_test[] = { | |||
520 | { "?", "S0*" }, /* Clear break points */ | 521 | { "?", "S0*" }, /* Clear break points */ |
521 | { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ | 522 | { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ |
522 | { "c", "T0*", }, /* Continue */ | 523 | { "c", "T0*", }, /* Continue */ |
523 | { "g", "do_fork", 0, check_and_rewind_pc }, /* check location */ | 524 | { "g", "do_fork", NULL, check_and_rewind_pc }, /* check location */ |
524 | { "write", "OK", write_regs }, /* Write registers */ | 525 | { "write", "OK", write_regs }, /* Write registers */ |
525 | { "do_fork", "OK", sw_rem_break }, /*remove breakpoint */ | 526 | { "do_fork", "OK", sw_rem_break }, /*remove breakpoint */ |
526 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ | 527 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ |
527 | { "g", "do_fork", 0, check_single_step }, | 528 | { "g", "do_fork", NULL, check_single_step }, |
528 | { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ | 529 | { "do_fork", "OK", sw_break, }, /* set sw breakpoint */ |
529 | { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ | 530 | { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ |
530 | { "D", "OK", 0, final_ack_set }, /* detach and unregister I/O */ | 531 | { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ |
531 | { "", "" }, | 532 | { "", "" }, |
532 | }; | 533 | }; |
533 | 534 | ||
@@ -538,14 +539,14 @@ static struct test_struct sys_open_test[] = { | |||
538 | { "?", "S0*" }, /* Clear break points */ | 539 | { "?", "S0*" }, /* Clear break points */ |
539 | { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ | 540 | { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ |
540 | { "c", "T0*", }, /* Continue */ | 541 | { "c", "T0*", }, /* Continue */ |
541 | { "g", "sys_open", 0, check_and_rewind_pc }, /* check location */ | 542 | { "g", "sys_open", NULL, check_and_rewind_pc }, /* check location */ |
542 | { "write", "OK", write_regs }, /* Write registers */ | 543 | { "write", "OK", write_regs }, /* Write registers */ |
543 | { "sys_open", "OK", sw_rem_break }, /*remove breakpoint */ | 544 | { "sys_open", "OK", sw_rem_break }, /*remove breakpoint */ |
544 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ | 545 | { "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */ |
545 | { "g", "sys_open", 0, check_single_step }, | 546 | { "g", "sys_open", NULL, check_single_step }, |
546 | { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ | 547 | { "sys_open", "OK", sw_break, }, /* set sw breakpoint */ |
547 | { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ | 548 | { "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */ |
548 | { "D", "OK", 0, final_ack_set }, /* detach and unregister I/O */ | 549 | { "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */ |
549 | { "", "" }, | 550 | { "", "" }, |
550 | }; | 551 | }; |
551 | 552 | ||
@@ -556,11 +557,11 @@ static struct test_struct hw_breakpoint_test[] = { | |||
556 | { "?", "S0*" }, /* Clear break points */ | 557 | { "?", "S0*" }, /* Clear break points */ |
557 | { "kgdbts_break_test", "OK", hw_break, }, /* set hw breakpoint */ | 558 | { "kgdbts_break_test", "OK", hw_break, }, /* set hw breakpoint */ |
558 | { "c", "T0*", }, /* Continue */ | 559 | { "c", "T0*", }, /* Continue */ |
559 | { "g", "kgdbts_break_test", 0, check_and_rewind_pc }, | 560 | { "g", "kgdbts_break_test", NULL, check_and_rewind_pc }, |
560 | { "write", "OK", write_regs }, | 561 | { "write", "OK", write_regs }, |
561 | { "kgdbts_break_test", "OK", hw_rem_break }, /*remove breakpoint */ | 562 | { "kgdbts_break_test", "OK", hw_rem_break }, /*remove breakpoint */ |
562 | { "D", "OK" }, /* Detach */ | 563 | { "D", "OK" }, /* Detach */ |
563 | { "D", "OK", 0, got_break }, /* If the test worked we made it here */ | 564 | { "D", "OK", NULL, got_break }, /* On success we made it here */ |
564 | { "", "" }, | 565 | { "", "" }, |
565 | }; | 566 | }; |
566 | 567 | ||
@@ -570,12 +571,12 @@ static struct test_struct hw_breakpoint_test[] = { | |||
570 | static struct test_struct hw_write_break_test[] = { | 571 | static struct test_struct hw_write_break_test[] = { |
571 | { "?", "S0*" }, /* Clear break points */ | 572 | { "?", "S0*" }, /* Clear break points */ |
572 | { "hw_break_val", "OK", hw_write_break, }, /* set hw breakpoint */ | 573 | { "hw_break_val", "OK", hw_write_break, }, /* set hw breakpoint */ |
573 | { "c", "T0*", 0, got_break }, /* Continue */ | 574 | { "c", "T0*", NULL, got_break }, /* Continue */ |
574 | { "g", "silent", 0, check_and_rewind_pc }, | 575 | { "g", "silent", NULL, check_and_rewind_pc }, |
575 | { "write", "OK", write_regs }, | 576 | { "write", "OK", write_regs }, |
576 | { "hw_break_val", "OK", hw_rem_write_break }, /*remove breakpoint */ | 577 | { "hw_break_val", "OK", hw_rem_write_break }, /*remove breakpoint */ |
577 | { "D", "OK" }, /* Detach */ | 578 | { "D", "OK" }, /* Detach */ |
578 | { "D", "OK", 0, got_break }, /* If the test worked we made it here */ | 579 | { "D", "OK", NULL, got_break }, /* On success we made it here */ |
579 | { "", "" }, | 580 | { "", "" }, |
580 | }; | 581 | }; |
581 | 582 | ||
@@ -585,12 +586,12 @@ static struct test_struct hw_write_break_test[] = { | |||
585 | static struct test_struct hw_access_break_test[] = { | 586 | static struct test_struct hw_access_break_test[] = { |
586 | { "?", "S0*" }, /* Clear break points */ | 587 | { "?", "S0*" }, /* Clear break points */ |
587 | { "hw_break_val", "OK", hw_access_break, }, /* set hw breakpoint */ | 588 | { "hw_break_val", "OK", hw_access_break, }, /* set hw breakpoint */ |
588 | { "c", "T0*", 0, got_break }, /* Continue */ | 589 | { "c", "T0*", NULL, got_break }, /* Continue */ |
589 | { "g", "silent", 0, check_and_rewind_pc }, | 590 | { "g", "silent", NULL, check_and_rewind_pc }, |
590 | { "write", "OK", write_regs }, | 591 | { "write", "OK", write_regs }, |
591 | { "hw_break_val", "OK", hw_rem_access_break }, /*remove breakpoint */ | 592 | { "hw_break_val", "OK", hw_rem_access_break }, /*remove breakpoint */ |
592 | { "D", "OK" }, /* Detach */ | 593 | { "D", "OK" }, /* Detach */ |
593 | { "D", "OK", 0, got_break }, /* If the test worked we made it here */ | 594 | { "D", "OK", NULL, got_break }, /* On success we made it here */ |
594 | { "", "" }, | 595 | { "", "" }, |
595 | }; | 596 | }; |
596 | 597 | ||
@@ -599,9 +600,9 @@ static struct test_struct hw_access_break_test[] = { | |||
599 | */ | 600 | */ |
600 | static struct test_struct nmi_sleep_test[] = { | 601 | static struct test_struct nmi_sleep_test[] = { |
601 | { "?", "S0*" }, /* Clear break points */ | 602 | { "?", "S0*" }, /* Clear break points */ |
602 | { "c", "T0*", 0, got_break }, /* Continue */ | 603 | { "c", "T0*", NULL, got_break }, /* Continue */ |
603 | { "D", "OK" }, /* Detach */ | 604 | { "D", "OK" }, /* Detach */ |
604 | { "D", "OK", 0, got_break }, /* If the test worked we made it here */ | 605 | { "D", "OK", NULL, got_break }, /* On success we made it here */ |
605 | { "", "" }, | 606 | { "", "" }, |
606 | }; | 607 | }; |
607 | 608 | ||
@@ -874,18 +875,23 @@ static void kgdbts_run_tests(void) | |||
874 | { | 875 | { |
875 | char *ptr; | 876 | char *ptr; |
876 | int fork_test = 0; | 877 | int fork_test = 0; |
877 | int sys_open_test = 0; | 878 | int do_sys_open_test = 0; |
879 | int sstep_test = 1000; | ||
878 | int nmi_sleep = 0; | 880 | int nmi_sleep = 0; |
881 | int i; | ||
879 | 882 | ||
880 | ptr = strstr(config, "F"); | 883 | ptr = strstr(config, "F"); |
881 | if (ptr) | 884 | if (ptr) |
882 | fork_test = simple_strtol(ptr+1, NULL, 10); | 885 | fork_test = simple_strtol(ptr + 1, NULL, 10); |
883 | ptr = strstr(config, "S"); | 886 | ptr = strstr(config, "S"); |
884 | if (ptr) | 887 | if (ptr) |
885 | sys_open_test = simple_strtol(ptr+1, NULL, 10); | 888 | do_sys_open_test = simple_strtol(ptr + 1, NULL, 10); |
886 | ptr = strstr(config, "N"); | 889 | ptr = strstr(config, "N"); |
887 | if (ptr) | 890 | if (ptr) |
888 | nmi_sleep = simple_strtol(ptr+1, NULL, 10); | 891 | nmi_sleep = simple_strtol(ptr+1, NULL, 10); |
892 | ptr = strstr(config, "I"); | ||
893 | if (ptr) | ||
894 | sstep_test = simple_strtol(ptr+1, NULL, 10); | ||
889 | 895 | ||
890 | /* required internal KGDB tests */ | 896 | /* required internal KGDB tests */ |
891 | v1printk("kgdbts:RUN plant and detach test\n"); | 897 | v1printk("kgdbts:RUN plant and detach test\n"); |
@@ -894,8 +900,13 @@ static void kgdbts_run_tests(void) | |||
894 | run_breakpoint_test(0); | 900 | run_breakpoint_test(0); |
895 | v1printk("kgdbts:RUN bad memory access test\n"); | 901 | v1printk("kgdbts:RUN bad memory access test\n"); |
896 | run_bad_read_test(); | 902 | run_bad_read_test(); |
897 | v1printk("kgdbts:RUN singlestep breakpoint test\n"); | 903 | v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test); |
898 | run_singlestep_break_test(); | 904 | for (i = 0; i < sstep_test; i++) { |
905 | run_singlestep_break_test(); | ||
906 | if (i % 100 == 0) | ||
907 | v1printk("kgdbts:RUN singlestep [%i/%i]\n", | ||
908 | i, sstep_test); | ||
909 | } | ||
899 | 910 | ||
900 | /* ===Optional tests=== */ | 911 | /* ===Optional tests=== */ |
901 | 912 | ||
@@ -922,7 +933,7 @@ static void kgdbts_run_tests(void) | |||
922 | repeat_test = fork_test; | 933 | repeat_test = fork_test; |
923 | printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n", | 934 | printk(KERN_INFO "kgdbts:RUN do_fork for %i breakpoints\n", |
924 | repeat_test); | 935 | repeat_test); |
925 | kthread_run(kgdbts_unreg_thread, 0, "kgdbts_unreg"); | 936 | kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); |
926 | run_do_fork_test(); | 937 | run_do_fork_test(); |
927 | return; | 938 | return; |
928 | } | 939 | } |
@@ -931,11 +942,11 @@ static void kgdbts_run_tests(void) | |||
931 | * executed because a kernel thread will be spawned at the very | 942 | * executed because a kernel thread will be spawned at the very |
932 | * end to unregister the debug hooks. | 943 | * end to unregister the debug hooks. |
933 | */ | 944 | */ |
934 | if (sys_open_test) { | 945 | if (do_sys_open_test) { |
935 | repeat_test = sys_open_test; | 946 | repeat_test = do_sys_open_test; |
936 | printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n", | 947 | printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n", |
937 | repeat_test); | 948 | repeat_test); |
938 | kthread_run(kgdbts_unreg_thread, 0, "kgdbts_unreg"); | 949 | kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg"); |
939 | run_sys_open_test(); | 950 | run_sys_open_test(); |
940 | return; | 951 | return; |
941 | } | 952 | } |
diff --git a/drivers/misc/sgi-xp/xp.h b/drivers/misc/sgi-xp/xp.h index 5515234be86a..03a87a307e32 100644 --- a/drivers/misc/sgi-xp/xp.h +++ b/drivers/misc/sgi-xp/xp.h | |||
@@ -157,215 +157,136 @@ struct xpc_msg { | |||
157 | /* | 157 | /* |
158 | * Define the return values and values passed to user's callout functions. | 158 | * Define the return values and values passed to user's callout functions. |
159 | * (It is important to add new value codes at the end just preceding | 159 | * (It is important to add new value codes at the end just preceding |
160 | * xpcUnknownReason, which must have the highest numerical value.) | 160 | * xpUnknownReason, which must have the highest numerical value.) |
161 | */ | 161 | */ |
162 | enum xpc_retval { | 162 | enum xp_retval { |
163 | xpcSuccess = 0, | 163 | xpSuccess = 0, |
164 | 164 | ||
165 | xpcNotConnected, /* 1: channel is not connected */ | 165 | xpNotConnected, /* 1: channel is not connected */ |
166 | xpcConnected, /* 2: channel connected (opened) */ | 166 | xpConnected, /* 2: channel connected (opened) */ |
167 | xpcRETIRED1, /* 3: (formerly xpcDisconnected) */ | 167 | xpRETIRED1, /* 3: (formerly xpDisconnected) */ |
168 | 168 | ||
169 | xpcMsgReceived, /* 4: message received */ | 169 | xpMsgReceived, /* 4: message received */ |
170 | xpcMsgDelivered, /* 5: message delivered and acknowledged */ | 170 | xpMsgDelivered, /* 5: message delivered and acknowledged */ |
171 | 171 | ||
172 | xpcRETIRED2, /* 6: (formerly xpcTransferFailed) */ | 172 | xpRETIRED2, /* 6: (formerly xpTransferFailed) */ |
173 | 173 | ||
174 | xpcNoWait, /* 7: operation would require wait */ | 174 | xpNoWait, /* 7: operation would require wait */ |
175 | xpcRetry, /* 8: retry operation */ | 175 | xpRetry, /* 8: retry operation */ |
176 | xpcTimeout, /* 9: timeout in xpc_allocate_msg_wait() */ | 176 | xpTimeout, /* 9: timeout in xpc_allocate_msg_wait() */ |
177 | xpcInterrupted, /* 10: interrupted wait */ | 177 | xpInterrupted, /* 10: interrupted wait */ |
178 | 178 | ||
179 | xpcUnequalMsgSizes, /* 11: message size disparity between sides */ | 179 | xpUnequalMsgSizes, /* 11: message size disparity between sides */ |
180 | xpcInvalidAddress, /* 12: invalid address */ | 180 | xpInvalidAddress, /* 12: invalid address */ |
181 | 181 | ||
182 | xpcNoMemory, /* 13: no memory available for XPC structures */ | 182 | xpNoMemory, /* 13: no memory available for XPC structures */ |
183 | xpcLackOfResources, /* 14: insufficient resources for operation */ | 183 | xpLackOfResources, /* 14: insufficient resources for operation */ |
184 | xpcUnregistered, /* 15: channel is not registered */ | 184 | xpUnregistered, /* 15: channel is not registered */ |
185 | xpcAlreadyRegistered, /* 16: channel is already registered */ | 185 | xpAlreadyRegistered, /* 16: channel is already registered */ |
186 | 186 | ||
187 | xpcPartitionDown, /* 17: remote partition is down */ | 187 | xpPartitionDown, /* 17: remote partition is down */ |
188 | xpcNotLoaded, /* 18: XPC module is not loaded */ | 188 | xpNotLoaded, /* 18: XPC module is not loaded */ |
189 | xpcUnloading, /* 19: this side is unloading XPC module */ | 189 | xpUnloading, /* 19: this side is unloading XPC module */ |
190 | 190 | ||
191 | xpcBadMagic, /* 20: XPC MAGIC string not found */ | 191 | xpBadMagic, /* 20: XPC MAGIC string not found */ |
192 | 192 | ||
193 | xpcReactivating, /* 21: remote partition was reactivated */ | 193 | xpReactivating, /* 21: remote partition was reactivated */ |
194 | 194 | ||
195 | xpcUnregistering, /* 22: this side is unregistering channel */ | 195 | xpUnregistering, /* 22: this side is unregistering channel */ |
196 | xpcOtherUnregistering, /* 23: other side is unregistering channel */ | 196 | xpOtherUnregistering, /* 23: other side is unregistering channel */ |
197 | 197 | ||
198 | xpcCloneKThread, /* 24: cloning kernel thread */ | 198 | xpCloneKThread, /* 24: cloning kernel thread */ |
199 | xpcCloneKThreadFailed, /* 25: cloning kernel thread failed */ | 199 | xpCloneKThreadFailed, /* 25: cloning kernel thread failed */ |
200 | 200 | ||
201 | xpcNoHeartbeat, /* 26: remote partition has no heartbeat */ | 201 | xpNoHeartbeat, /* 26: remote partition has no heartbeat */ |
202 | 202 | ||
203 | xpcPioReadError, /* 27: PIO read error */ | 203 | xpPioReadError, /* 27: PIO read error */ |
204 | xpcPhysAddrRegFailed, /* 28: registration of phys addr range failed */ | 204 | xpPhysAddrRegFailed, /* 28: registration of phys addr range failed */ |
205 | 205 | ||
206 | xpcBteDirectoryError, /* 29: maps to BTEFAIL_DIR */ | 206 | xpRETIRED3, /* 29: (formerly xpBteDirectoryError) */ |
207 | xpcBtePoisonError, /* 30: maps to BTEFAIL_POISON */ | 207 | xpRETIRED4, /* 30: (formerly xpBtePoisonError) */ |
208 | xpcBteWriteError, /* 31: maps to BTEFAIL_WERR */ | 208 | xpRETIRED5, /* 31: (formerly xpBteWriteError) */ |
209 | xpcBteAccessError, /* 32: maps to BTEFAIL_ACCESS */ | 209 | xpRETIRED6, /* 32: (formerly xpBteAccessError) */ |
210 | xpcBtePWriteError, /* 33: maps to BTEFAIL_PWERR */ | 210 | xpRETIRED7, /* 33: (formerly xpBtePWriteError) */ |
211 | xpcBtePReadError, /* 34: maps to BTEFAIL_PRERR */ | 211 | xpRETIRED8, /* 34: (formerly xpBtePReadError) */ |
212 | xpcBteTimeOutError, /* 35: maps to BTEFAIL_TOUT */ | 212 | xpRETIRED9, /* 35: (formerly xpBteTimeOutError) */ |
213 | xpcBteXtalkError, /* 36: maps to BTEFAIL_XTERR */ | 213 | xpRETIRED10, /* 36: (formerly xpBteXtalkError) */ |
214 | xpcBteNotAvailable, /* 37: maps to BTEFAIL_NOTAVAIL */ | 214 | xpRETIRED11, /* 37: (formerly xpBteNotAvailable) */ |
215 | xpcBteUnmappedError, /* 38: unmapped BTEFAIL_ error */ | 215 | xpRETIRED12, /* 38: (formerly xpBteUnmappedError) */ |
216 | 216 | ||
217 | xpcBadVersion, /* 39: bad version number */ | 217 | xpBadVersion, /* 39: bad version number */ |
218 | xpcVarsNotSet, /* 40: the XPC variables are not set up */ | 218 | xpVarsNotSet, /* 40: the XPC variables are not set up */ |
219 | xpcNoRsvdPageAddr, /* 41: unable to get rsvd page's phys addr */ | 219 | xpNoRsvdPageAddr, /* 41: unable to get rsvd page's phys addr */ |
220 | xpcInvalidPartid, /* 42: invalid partition ID */ | 220 | xpInvalidPartid, /* 42: invalid partition ID */ |
221 | xpcLocalPartid, /* 43: local partition ID */ | 221 | xpLocalPartid, /* 43: local partition ID */ |
222 | 222 | ||
223 | xpcOtherGoingDown, /* 44: other side going down, reason unknown */ | 223 | xpOtherGoingDown, /* 44: other side going down, reason unknown */ |
224 | xpcSystemGoingDown, /* 45: system is going down, reason unknown */ | 224 | xpSystemGoingDown, /* 45: system is going down, reason unknown */ |
225 | xpcSystemHalt, /* 46: system is being halted */ | 225 | xpSystemHalt, /* 46: system is being halted */ |
226 | xpcSystemReboot, /* 47: system is being rebooted */ | 226 | xpSystemReboot, /* 47: system is being rebooted */ |
227 | xpcSystemPoweroff, /* 48: system is being powered off */ | 227 | xpSystemPoweroff, /* 48: system is being powered off */ |
228 | 228 | ||
229 | xpcDisconnecting, /* 49: channel disconnecting (closing) */ | 229 | xpDisconnecting, /* 49: channel disconnecting (closing) */ |
230 | 230 | ||
231 | xpcOpenCloseError, /* 50: channel open/close protocol error */ | 231 | xpOpenCloseError, /* 50: channel open/close protocol error */ |
232 | 232 | ||
233 | xpcDisconnected, /* 51: channel disconnected (closed) */ | 233 | xpDisconnected, /* 51: channel disconnected (closed) */ |
234 | 234 | ||
235 | xpcBteSh2Start, /* 52: BTE CRB timeout */ | 235 | xpBteCopyError, /* 52: bte_copy() returned error */ |
236 | 236 | ||
237 | /* 53: 0x1 BTE Error Response Short */ | 237 | xpUnknownReason /* 53: unknown reason - must be last in enum */ |
238 | xpcBteSh2RspShort = xpcBteSh2Start + BTEFAIL_SH2_RESP_SHORT, | ||
239 | |||
240 | /* 54: 0x2 BTE Error Response Long */ | ||
241 | xpcBteSh2RspLong = xpcBteSh2Start + BTEFAIL_SH2_RESP_LONG, | ||
242 | |||
243 | /* 56: 0x4 BTE Error Response DSB */ | ||
244 | xpcBteSh2RspDSB = xpcBteSh2Start + BTEFAIL_SH2_RESP_DSP, | ||
245 | |||
246 | /* 60: 0x8 BTE Error Response Access */ | ||
247 | xpcBteSh2RspAccess = xpcBteSh2Start + BTEFAIL_SH2_RESP_ACCESS, | ||
248 | |||
249 | /* 68: 0x10 BTE Error CRB timeout */ | ||
250 | xpcBteSh2CRBTO = xpcBteSh2Start + BTEFAIL_SH2_CRB_TO, | ||
251 | |||
252 | /* 84: 0x20 BTE Error NACK limit */ | ||
253 | xpcBteSh2NACKLimit = xpcBteSh2Start + BTEFAIL_SH2_NACK_LIMIT, | ||
254 | |||
255 | /* 115: BTE end */ | ||
256 | xpcBteSh2End = xpcBteSh2Start + BTEFAIL_SH2_ALL, | ||
257 | |||
258 | xpcUnknownReason /* 116: unknown reason - must be last in enum */ | ||
259 | }; | 238 | }; |
260 | 239 | ||
261 | /* | 240 | /* |
262 | * Define the callout function types used by XPC to update the user on | 241 | * Define the callout function type used by XPC to update the user on |
263 | * connection activity and state changes (via the user function registered by | 242 | * connection activity and state changes via the user function registered |
264 | * xpc_connect()) and to notify them of messages received and delivered (via | 243 | * by xpc_connect(). |
265 | * the user function registered by xpc_send_notify()). | ||
266 | * | ||
267 | * The two function types are xpc_channel_func and xpc_notify_func and | ||
268 | * both share the following arguments, with the exception of "data", which | ||
269 | * only xpc_channel_func has. | ||
270 | * | 244 | * |
271 | * Arguments: | 245 | * Arguments: |
272 | * | 246 | * |
273 | * reason - reason code. (See following table.) | 247 | * reason - reason code. |
274 | * partid - partition ID associated with condition. | 248 | * partid - partition ID associated with condition. |
275 | * ch_number - channel # associated with condition. | 249 | * ch_number - channel # associated with condition. |
276 | * data - pointer to optional data. (See following table.) | 250 | * data - pointer to optional data. |
277 | * key - pointer to optional user-defined value provided as the "key" | 251 | * key - pointer to optional user-defined value provided as the "key" |
278 | * argument to xpc_connect() or xpc_send_notify(). | 252 | * argument to xpc_connect(). |
279 | * | 253 | * |
280 | * In the following table the "Optional Data" column applies to callouts made | 254 | * A reason code of xpConnected indicates that a connection has been |
281 | * to functions registered by xpc_connect(). A "NA" in that column indicates | 255 | * established to the specified partition on the specified channel. The data |
282 | * that this reason code can be passed to functions registered by | 256 | * argument indicates the max number of entries allowed in the message queue. |
283 | * xpc_send_notify() (i.e. they don't have data arguments). | ||
284 | * | 257 | * |
285 | * Also, the first three reason codes in the following table indicate | 258 | * A reason code of xpMsgReceived indicates that a XPC message arrived from |
286 | * success, whereas the others indicate failure. When a failure reason code | 259 | * the specified partition on the specified channel. The data argument |
287 | * is received, one can assume that the channel is not connected. | 260 | * specifies the address of the message's payload. The user must call |
261 | * xpc_received() when finished with the payload. | ||
288 | * | 262 | * |
289 | * | 263 | * All other reason codes indicate failure. The data argmument is NULL. |
290 | * Reason Code | Cause | Optional Data | 264 | * When a failure reason code is received, one can assume that the channel |
291 | * =====================+================================+===================== | 265 | * is not connected. |
292 | * xpcConnected | connection has been established| max #of entries | ||
293 | * | to the specified partition on | allowed in message | ||
294 | * | the specified channel | queue | ||
295 | * ---------------------+--------------------------------+--------------------- | ||
296 | * xpcMsgReceived | an XPC message arrived from | address of payload | ||
297 | * | the specified partition on the | | ||
298 | * | specified channel | [the user must call | ||
299 | * | | xpc_received() when | ||
300 | * | | finished with the | ||
301 | * | | payload] | ||
302 | * ---------------------+--------------------------------+--------------------- | ||
303 | * xpcMsgDelivered | notification that the message | NA | ||
304 | * | was delivered to the intended | | ||
305 | * | recipient and that they have | | ||
306 | * | acknowledged its receipt by | | ||
307 | * | calling xpc_received() | | ||
308 | * =====================+================================+===================== | ||
309 | * xpcUnequalMsgSizes | can't connect to the specified | NULL | ||
310 | * | partition on the specified | | ||
311 | * | channel because of mismatched | | ||
312 | * | message sizes | | ||
313 | * ---------------------+--------------------------------+--------------------- | ||
314 | * xpcNoMemory | insufficient memory avaiable | NULL | ||
315 | * | to allocate message queue | | ||
316 | * ---------------------+--------------------------------+--------------------- | ||
317 | * xpcLackOfResources | lack of resources to create | NULL | ||
318 | * | the necessary kthreads to | | ||
319 | * | support the channel | | ||
320 | * ---------------------+--------------------------------+--------------------- | ||
321 | * xpcUnregistering | this side's user has | NULL or NA | ||
322 | * | unregistered by calling | | ||
323 | * | xpc_disconnect() | | ||
324 | * ---------------------+--------------------------------+--------------------- | ||
325 | * xpcOtherUnregistering| the other side's user has | NULL or NA | ||
326 | * | unregistered by calling | | ||
327 | * | xpc_disconnect() | | ||
328 | * ---------------------+--------------------------------+--------------------- | ||
329 | * xpcNoHeartbeat | the other side's XPC is no | NULL or NA | ||
330 | * | longer heartbeating | | ||
331 | * | | | ||
332 | * ---------------------+--------------------------------+--------------------- | ||
333 | * xpcUnloading | this side's XPC module is | NULL or NA | ||
334 | * | being unloaded | | ||
335 | * | | | ||
336 | * ---------------------+--------------------------------+--------------------- | ||
337 | * xpcOtherUnloading | the other side's XPC module is | NULL or NA | ||
338 | * | is being unloaded | | ||
339 | * | | | ||
340 | * ---------------------+--------------------------------+--------------------- | ||
341 | * xpcPioReadError | xp_nofault_PIOR() returned an | NULL or NA | ||
342 | * | error while sending an IPI | | ||
343 | * | | | ||
344 | * ---------------------+--------------------------------+--------------------- | ||
345 | * xpcInvalidAddress | the address either received or | NULL or NA | ||
346 | * | sent by the specified partition| | ||
347 | * | is invalid | | ||
348 | * ---------------------+--------------------------------+--------------------- | ||
349 | * xpcBteNotAvailable | attempt to pull data from the | NULL or NA | ||
350 | * xpcBtePoisonError | specified partition over the | | ||
351 | * xpcBteWriteError | specified channel via a | | ||
352 | * xpcBteAccessError | bte_copy() failed | | ||
353 | * xpcBteTimeOutError | | | ||
354 | * xpcBteXtalkError | | | ||
355 | * xpcBteDirectoryError | | | ||
356 | * xpcBteGenericError | | | ||
357 | * xpcBteUnmappedError | | | ||
358 | * ---------------------+--------------------------------+--------------------- | ||
359 | * xpcUnknownReason | the specified channel to the | NULL or NA | ||
360 | * | specified partition was | | ||
361 | * | unavailable for unknown reasons| | ||
362 | * =====================+================================+===================== | ||
363 | */ | 266 | */ |
364 | 267 | typedef void (*xpc_channel_func) (enum xp_retval reason, short partid, | |
365 | typedef void (*xpc_channel_func) (enum xpc_retval reason, partid_t partid, | ||
366 | int ch_number, void *data, void *key); | 268 | int ch_number, void *data, void *key); |
367 | 269 | ||
368 | typedef void (*xpc_notify_func) (enum xpc_retval reason, partid_t partid, | 270 | /* |
271 | * Define the callout function type used by XPC to notify the user of | ||
272 | * messages received and delivered via the user function registered by | ||
273 | * xpc_send_notify(). | ||
274 | * | ||
275 | * Arguments: | ||
276 | * | ||
277 | * reason - reason code. | ||
278 | * partid - partition ID associated with condition. | ||
279 | * ch_number - channel # associated with condition. | ||
280 | * key - pointer to optional user-defined value provided as the "key" | ||
281 | * argument to xpc_send_notify(). | ||
282 | * | ||
283 | * A reason code of xpMsgDelivered indicates that the message was delivered | ||
284 | * to the intended recipient and that they have acknowledged its receipt by | ||
285 | * calling xpc_received(). | ||
286 | * | ||
287 | * All other reason codes indicate failure. | ||
288 | */ | ||
289 | typedef void (*xpc_notify_func) (enum xp_retval reason, short partid, | ||
369 | int ch_number, void *key); | 290 | int ch_number, void *key); |
370 | 291 | ||
371 | /* | 292 | /* |
@@ -401,57 +322,57 @@ struct xpc_registration { | |||
401 | struct xpc_interface { | 322 | struct xpc_interface { |
402 | void (*connect) (int); | 323 | void (*connect) (int); |
403 | void (*disconnect) (int); | 324 | void (*disconnect) (int); |
404 | enum xpc_retval (*allocate) (partid_t, int, u32, void **); | 325 | enum xp_retval (*allocate) (short, int, u32, void **); |
405 | enum xpc_retval (*send) (partid_t, int, void *); | 326 | enum xp_retval (*send) (short, int, void *); |
406 | enum xpc_retval (*send_notify) (partid_t, int, void *, | 327 | enum xp_retval (*send_notify) (short, int, void *, |
407 | xpc_notify_func, void *); | 328 | xpc_notify_func, void *); |
408 | void (*received) (partid_t, int, void *); | 329 | void (*received) (short, int, void *); |
409 | enum xpc_retval (*partid_to_nasids) (partid_t, void *); | 330 | enum xp_retval (*partid_to_nasids) (short, void *); |
410 | }; | 331 | }; |
411 | 332 | ||
412 | extern struct xpc_interface xpc_interface; | 333 | extern struct xpc_interface xpc_interface; |
413 | 334 | ||
414 | extern void xpc_set_interface(void (*)(int), | 335 | extern void xpc_set_interface(void (*)(int), |
415 | void (*)(int), | 336 | void (*)(int), |
416 | enum xpc_retval (*)(partid_t, int, u32, void **), | 337 | enum xp_retval (*)(short, int, u32, void **), |
417 | enum xpc_retval (*)(partid_t, int, void *), | 338 | enum xp_retval (*)(short, int, void *), |
418 | enum xpc_retval (*)(partid_t, int, void *, | 339 | enum xp_retval (*)(short, int, void *, |
419 | xpc_notify_func, void *), | 340 | xpc_notify_func, void *), |
420 | void (*)(partid_t, int, void *), | 341 | void (*)(short, int, void *), |
421 | enum xpc_retval (*)(partid_t, void *)); | 342 | enum xp_retval (*)(short, void *)); |
422 | extern void xpc_clear_interface(void); | 343 | extern void xpc_clear_interface(void); |
423 | 344 | ||
424 | extern enum xpc_retval xpc_connect(int, xpc_channel_func, void *, u16, | 345 | extern enum xp_retval xpc_connect(int, xpc_channel_func, void *, u16, |
425 | u16, u32, u32); | 346 | u16, u32, u32); |
426 | extern void xpc_disconnect(int); | 347 | extern void xpc_disconnect(int); |
427 | 348 | ||
428 | static inline enum xpc_retval | 349 | static inline enum xp_retval |
429 | xpc_allocate(partid_t partid, int ch_number, u32 flags, void **payload) | 350 | xpc_allocate(short partid, int ch_number, u32 flags, void **payload) |
430 | { | 351 | { |
431 | return xpc_interface.allocate(partid, ch_number, flags, payload); | 352 | return xpc_interface.allocate(partid, ch_number, flags, payload); |
432 | } | 353 | } |
433 | 354 | ||
434 | static inline enum xpc_retval | 355 | static inline enum xp_retval |
435 | xpc_send(partid_t partid, int ch_number, void *payload) | 356 | xpc_send(short partid, int ch_number, void *payload) |
436 | { | 357 | { |
437 | return xpc_interface.send(partid, ch_number, payload); | 358 | return xpc_interface.send(partid, ch_number, payload); |
438 | } | 359 | } |
439 | 360 | ||
440 | static inline enum xpc_retval | 361 | static inline enum xp_retval |
441 | xpc_send_notify(partid_t partid, int ch_number, void *payload, | 362 | xpc_send_notify(short partid, int ch_number, void *payload, |
442 | xpc_notify_func func, void *key) | 363 | xpc_notify_func func, void *key) |
443 | { | 364 | { |
444 | return xpc_interface.send_notify(partid, ch_number, payload, func, key); | 365 | return xpc_interface.send_notify(partid, ch_number, payload, func, key); |
445 | } | 366 | } |
446 | 367 | ||
447 | static inline void | 368 | static inline void |
448 | xpc_received(partid_t partid, int ch_number, void *payload) | 369 | xpc_received(short partid, int ch_number, void *payload) |
449 | { | 370 | { |
450 | return xpc_interface.received(partid, ch_number, payload); | 371 | return xpc_interface.received(partid, ch_number, payload); |
451 | } | 372 | } |
452 | 373 | ||
453 | static inline enum xpc_retval | 374 | static inline enum xp_retval |
454 | xpc_partid_to_nasids(partid_t partid, void *nasids) | 375 | xpc_partid_to_nasids(short partid, void *nasids) |
455 | { | 376 | { |
456 | return xpc_interface.partid_to_nasids(partid, nasids); | 377 | return xpc_interface.partid_to_nasids(partid, nasids); |
457 | } | 378 | } |
diff --git a/drivers/misc/sgi-xp/xp_main.c b/drivers/misc/sgi-xp/xp_main.c index 1fbf99bae963..196480b691a1 100644 --- a/drivers/misc/sgi-xp/xp_main.c +++ b/drivers/misc/sgi-xp/xp_main.c | |||
@@ -42,21 +42,21 @@ EXPORT_SYMBOL_GPL(xpc_registrations); | |||
42 | /* | 42 | /* |
43 | * Initialize the XPC interface to indicate that XPC isn't loaded. | 43 | * Initialize the XPC interface to indicate that XPC isn't loaded. |
44 | */ | 44 | */ |
45 | static enum xpc_retval | 45 | static enum xp_retval |
46 | xpc_notloaded(void) | 46 | xpc_notloaded(void) |
47 | { | 47 | { |
48 | return xpcNotLoaded; | 48 | return xpNotLoaded; |
49 | } | 49 | } |
50 | 50 | ||
51 | struct xpc_interface xpc_interface = { | 51 | struct xpc_interface xpc_interface = { |
52 | (void (*)(int))xpc_notloaded, | 52 | (void (*)(int))xpc_notloaded, |
53 | (void (*)(int))xpc_notloaded, | 53 | (void (*)(int))xpc_notloaded, |
54 | (enum xpc_retval(*)(partid_t, int, u32, void **))xpc_notloaded, | 54 | (enum xp_retval(*)(short, int, u32, void **))xpc_notloaded, |
55 | (enum xpc_retval(*)(partid_t, int, void *))xpc_notloaded, | 55 | (enum xp_retval(*)(short, int, void *))xpc_notloaded, |
56 | (enum xpc_retval(*)(partid_t, int, void *, xpc_notify_func, void *)) | 56 | (enum xp_retval(*)(short, int, void *, xpc_notify_func, void *)) |
57 | xpc_notloaded, | 57 | xpc_notloaded, |
58 | (void (*)(partid_t, int, void *))xpc_notloaded, | 58 | (void (*)(short, int, void *))xpc_notloaded, |
59 | (enum xpc_retval(*)(partid_t, void *))xpc_notloaded | 59 | (enum xp_retval(*)(short, void *))xpc_notloaded |
60 | }; | 60 | }; |
61 | EXPORT_SYMBOL_GPL(xpc_interface); | 61 | EXPORT_SYMBOL_GPL(xpc_interface); |
62 | 62 | ||
@@ -66,12 +66,12 @@ EXPORT_SYMBOL_GPL(xpc_interface); | |||
66 | void | 66 | void |
67 | xpc_set_interface(void (*connect) (int), | 67 | xpc_set_interface(void (*connect) (int), |
68 | void (*disconnect) (int), | 68 | void (*disconnect) (int), |
69 | enum xpc_retval (*allocate) (partid_t, int, u32, void **), | 69 | enum xp_retval (*allocate) (short, int, u32, void **), |
70 | enum xpc_retval (*send) (partid_t, int, void *), | 70 | enum xp_retval (*send) (short, int, void *), |
71 | enum xpc_retval (*send_notify) (partid_t, int, void *, | 71 | enum xp_retval (*send_notify) (short, int, void *, |
72 | xpc_notify_func, void *), | 72 | xpc_notify_func, void *), |
73 | void (*received) (partid_t, int, void *), | 73 | void (*received) (short, int, void *), |
74 | enum xpc_retval (*partid_to_nasids) (partid_t, void *)) | 74 | enum xp_retval (*partid_to_nasids) (short, void *)) |
75 | { | 75 | { |
76 | xpc_interface.connect = connect; | 76 | xpc_interface.connect = connect; |
77 | xpc_interface.disconnect = disconnect; | 77 | xpc_interface.disconnect = disconnect; |
@@ -91,16 +91,16 @@ xpc_clear_interface(void) | |||
91 | { | 91 | { |
92 | xpc_interface.connect = (void (*)(int))xpc_notloaded; | 92 | xpc_interface.connect = (void (*)(int))xpc_notloaded; |
93 | xpc_interface.disconnect = (void (*)(int))xpc_notloaded; | 93 | xpc_interface.disconnect = (void (*)(int))xpc_notloaded; |
94 | xpc_interface.allocate = (enum xpc_retval(*)(partid_t, int, u32, | 94 | xpc_interface.allocate = (enum xp_retval(*)(short, int, u32, |
95 | void **))xpc_notloaded; | 95 | void **))xpc_notloaded; |
96 | xpc_interface.send = (enum xpc_retval(*)(partid_t, int, void *)) | 96 | xpc_interface.send = (enum xp_retval(*)(short, int, void *)) |
97 | xpc_notloaded; | 97 | xpc_notloaded; |
98 | xpc_interface.send_notify = (enum xpc_retval(*)(partid_t, int, void *, | 98 | xpc_interface.send_notify = (enum xp_retval(*)(short, int, void *, |
99 | xpc_notify_func, | 99 | xpc_notify_func, |
100 | void *))xpc_notloaded; | 100 | void *))xpc_notloaded; |
101 | xpc_interface.received = (void (*)(partid_t, int, void *)) | 101 | xpc_interface.received = (void (*)(short, int, void *)) |
102 | xpc_notloaded; | 102 | xpc_notloaded; |
103 | xpc_interface.partid_to_nasids = (enum xpc_retval(*)(partid_t, void *)) | 103 | xpc_interface.partid_to_nasids = (enum xp_retval(*)(short, void *)) |
104 | xpc_notloaded; | 104 | xpc_notloaded; |
105 | } | 105 | } |
106 | EXPORT_SYMBOL_GPL(xpc_clear_interface); | 106 | EXPORT_SYMBOL_GPL(xpc_clear_interface); |
@@ -123,13 +123,13 @@ EXPORT_SYMBOL_GPL(xpc_clear_interface); | |||
123 | * nentries - max #of XPC message entries a message queue can contain. | 123 | * nentries - max #of XPC message entries a message queue can contain. |
124 | * The actual number, which is determined when a connection | 124 | * The actual number, which is determined when a connection |
125 | * is established and may be less then requested, will be | 125 | * is established and may be less then requested, will be |
126 | * passed to the user via the xpcConnected callout. | 126 | * passed to the user via the xpConnected callout. |
127 | * assigned_limit - max number of kthreads allowed to be processing | 127 | * assigned_limit - max number of kthreads allowed to be processing |
128 | * messages (per connection) at any given instant. | 128 | * messages (per connection) at any given instant. |
129 | * idle_limit - max number of kthreads allowed to be idle at any given | 129 | * idle_limit - max number of kthreads allowed to be idle at any given |
130 | * instant. | 130 | * instant. |
131 | */ | 131 | */ |
132 | enum xpc_retval | 132 | enum xp_retval |
133 | xpc_connect(int ch_number, xpc_channel_func func, void *key, u16 payload_size, | 133 | xpc_connect(int ch_number, xpc_channel_func func, void *key, u16 payload_size, |
134 | u16 nentries, u32 assigned_limit, u32 idle_limit) | 134 | u16 nentries, u32 assigned_limit, u32 idle_limit) |
135 | { | 135 | { |
@@ -143,12 +143,12 @@ xpc_connect(int ch_number, xpc_channel_func func, void *key, u16 payload_size, | |||
143 | registration = &xpc_registrations[ch_number]; | 143 | registration = &xpc_registrations[ch_number]; |
144 | 144 | ||
145 | if (mutex_lock_interruptible(®istration->mutex) != 0) | 145 | if (mutex_lock_interruptible(®istration->mutex) != 0) |
146 | return xpcInterrupted; | 146 | return xpInterrupted; |
147 | 147 | ||
148 | /* if XPC_CHANNEL_REGISTERED(ch_number) */ | 148 | /* if XPC_CHANNEL_REGISTERED(ch_number) */ |
149 | if (registration->func != NULL) { | 149 | if (registration->func != NULL) { |
150 | mutex_unlock(®istration->mutex); | 150 | mutex_unlock(®istration->mutex); |
151 | return xpcAlreadyRegistered; | 151 | return xpAlreadyRegistered; |
152 | } | 152 | } |
153 | 153 | ||
154 | /* register the channel for connection */ | 154 | /* register the channel for connection */ |
@@ -163,7 +163,7 @@ xpc_connect(int ch_number, xpc_channel_func func, void *key, u16 payload_size, | |||
163 | 163 | ||
164 | xpc_interface.connect(ch_number); | 164 | xpc_interface.connect(ch_number); |
165 | 165 | ||
166 | return xpcSuccess; | 166 | return xpSuccess; |
167 | } | 167 | } |
168 | EXPORT_SYMBOL_GPL(xpc_connect); | 168 | EXPORT_SYMBOL_GPL(xpc_connect); |
169 | 169 | ||
diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h index 9eb6d4a3269c..11ac267ed68f 100644 --- a/drivers/misc/sgi-xp/xpc.h +++ b/drivers/misc/sgi-xp/xpc.h | |||
@@ -172,13 +172,13 @@ struct xpc_vars { | |||
172 | (_version >= _XPC_VERSION(3, 1)) | 172 | (_version >= _XPC_VERSION(3, 1)) |
173 | 173 | ||
174 | static inline int | 174 | static inline int |
175 | xpc_hb_allowed(partid_t partid, struct xpc_vars *vars) | 175 | xpc_hb_allowed(short partid, struct xpc_vars *vars) |
176 | { | 176 | { |
177 | return ((vars->heartbeating_to_mask & (1UL << partid)) != 0); | 177 | return ((vars->heartbeating_to_mask & (1UL << partid)) != 0); |
178 | } | 178 | } |
179 | 179 | ||
180 | static inline void | 180 | static inline void |
181 | xpc_allow_hb(partid_t partid, struct xpc_vars *vars) | 181 | xpc_allow_hb(short partid, struct xpc_vars *vars) |
182 | { | 182 | { |
183 | u64 old_mask, new_mask; | 183 | u64 old_mask, new_mask; |
184 | 184 | ||
@@ -190,7 +190,7 @@ xpc_allow_hb(partid_t partid, struct xpc_vars *vars) | |||
190 | } | 190 | } |
191 | 191 | ||
192 | static inline void | 192 | static inline void |
193 | xpc_disallow_hb(partid_t partid, struct xpc_vars *vars) | 193 | xpc_disallow_hb(short partid, struct xpc_vars *vars) |
194 | { | 194 | { |
195 | u64 old_mask, new_mask; | 195 | u64 old_mask, new_mask; |
196 | 196 | ||
@@ -408,11 +408,11 @@ struct xpc_notify { | |||
408 | * messages. | 408 | * messages. |
409 | */ | 409 | */ |
410 | struct xpc_channel { | 410 | struct xpc_channel { |
411 | partid_t partid; /* ID of remote partition connected */ | 411 | short partid; /* ID of remote partition connected */ |
412 | spinlock_t lock; /* lock for updating this structure */ | 412 | spinlock_t lock; /* lock for updating this structure */ |
413 | u32 flags; /* general flags */ | 413 | u32 flags; /* general flags */ |
414 | 414 | ||
415 | enum xpc_retval reason; /* reason why channel is disconnect'g */ | 415 | enum xp_retval reason; /* reason why channel is disconnect'g */ |
416 | int reason_line; /* line# disconnect initiated from */ | 416 | int reason_line; /* line# disconnect initiated from */ |
417 | 417 | ||
418 | u16 number; /* channel # */ | 418 | u16 number; /* channel # */ |
@@ -522,7 +522,7 @@ struct xpc_partition { | |||
522 | spinlock_t act_lock; /* protect updating of act_state */ | 522 | spinlock_t act_lock; /* protect updating of act_state */ |
523 | u8 act_state; /* from XPC HB viewpoint */ | 523 | u8 act_state; /* from XPC HB viewpoint */ |
524 | u8 remote_vars_version; /* version# of partition's vars */ | 524 | u8 remote_vars_version; /* version# of partition's vars */ |
525 | enum xpc_retval reason; /* reason partition is deactivating */ | 525 | enum xp_retval reason; /* reason partition is deactivating */ |
526 | int reason_line; /* line# deactivation initiated from */ | 526 | int reason_line; /* line# deactivation initiated from */ |
527 | int reactivate_nasid; /* nasid in partition to reactivate */ | 527 | int reactivate_nasid; /* nasid in partition to reactivate */ |
528 | 528 | ||
@@ -615,7 +615,7 @@ struct xpc_partition { | |||
615 | /* interval in seconds to print 'waiting disengagement' messages */ | 615 | /* interval in seconds to print 'waiting disengagement' messages */ |
616 | #define XPC_DISENGAGE_PRINTMSG_INTERVAL 10 | 616 | #define XPC_DISENGAGE_PRINTMSG_INTERVAL 10 |
617 | 617 | ||
618 | #define XPC_PARTID(_p) ((partid_t) ((_p) - &xpc_partitions[0])) | 618 | #define XPC_PARTID(_p) ((short)((_p) - &xpc_partitions[0])) |
619 | 619 | ||
620 | /* found in xp_main.c */ | 620 | /* found in xp_main.c */ |
621 | extern struct xpc_registration xpc_registrations[]; | 621 | extern struct xpc_registration xpc_registrations[]; |
@@ -646,31 +646,31 @@ extern void xpc_allow_IPI_ops(void); | |||
646 | extern void xpc_restrict_IPI_ops(void); | 646 | extern void xpc_restrict_IPI_ops(void); |
647 | extern int xpc_identify_act_IRQ_sender(void); | 647 | extern int xpc_identify_act_IRQ_sender(void); |
648 | extern int xpc_partition_disengaged(struct xpc_partition *); | 648 | extern int xpc_partition_disengaged(struct xpc_partition *); |
649 | extern enum xpc_retval xpc_mark_partition_active(struct xpc_partition *); | 649 | extern enum xp_retval xpc_mark_partition_active(struct xpc_partition *); |
650 | extern void xpc_mark_partition_inactive(struct xpc_partition *); | 650 | extern void xpc_mark_partition_inactive(struct xpc_partition *); |
651 | extern void xpc_discovery(void); | 651 | extern void xpc_discovery(void); |
652 | extern void xpc_check_remote_hb(void); | 652 | extern void xpc_check_remote_hb(void); |
653 | extern void xpc_deactivate_partition(const int, struct xpc_partition *, | 653 | extern void xpc_deactivate_partition(const int, struct xpc_partition *, |
654 | enum xpc_retval); | 654 | enum xp_retval); |
655 | extern enum xpc_retval xpc_initiate_partid_to_nasids(partid_t, void *); | 655 | extern enum xp_retval xpc_initiate_partid_to_nasids(short, void *); |
656 | 656 | ||
657 | /* found in xpc_channel.c */ | 657 | /* found in xpc_channel.c */ |
658 | extern void xpc_initiate_connect(int); | 658 | extern void xpc_initiate_connect(int); |
659 | extern void xpc_initiate_disconnect(int); | 659 | extern void xpc_initiate_disconnect(int); |
660 | extern enum xpc_retval xpc_initiate_allocate(partid_t, int, u32, void **); | 660 | extern enum xp_retval xpc_initiate_allocate(short, int, u32, void **); |
661 | extern enum xpc_retval xpc_initiate_send(partid_t, int, void *); | 661 | extern enum xp_retval xpc_initiate_send(short, int, void *); |
662 | extern enum xpc_retval xpc_initiate_send_notify(partid_t, int, void *, | 662 | extern enum xp_retval xpc_initiate_send_notify(short, int, void *, |
663 | xpc_notify_func, void *); | 663 | xpc_notify_func, void *); |
664 | extern void xpc_initiate_received(partid_t, int, void *); | 664 | extern void xpc_initiate_received(short, int, void *); |
665 | extern enum xpc_retval xpc_setup_infrastructure(struct xpc_partition *); | 665 | extern enum xp_retval xpc_setup_infrastructure(struct xpc_partition *); |
666 | extern enum xpc_retval xpc_pull_remote_vars_part(struct xpc_partition *); | 666 | extern enum xp_retval xpc_pull_remote_vars_part(struct xpc_partition *); |
667 | extern void xpc_process_channel_activity(struct xpc_partition *); | 667 | extern void xpc_process_channel_activity(struct xpc_partition *); |
668 | extern void xpc_connected_callout(struct xpc_channel *); | 668 | extern void xpc_connected_callout(struct xpc_channel *); |
669 | extern void xpc_deliver_msg(struct xpc_channel *); | 669 | extern void xpc_deliver_msg(struct xpc_channel *); |
670 | extern void xpc_disconnect_channel(const int, struct xpc_channel *, | 670 | extern void xpc_disconnect_channel(const int, struct xpc_channel *, |
671 | enum xpc_retval, unsigned long *); | 671 | enum xp_retval, unsigned long *); |
672 | extern void xpc_disconnect_callout(struct xpc_channel *, enum xpc_retval); | 672 | extern void xpc_disconnect_callout(struct xpc_channel *, enum xp_retval); |
673 | extern void xpc_partition_going_down(struct xpc_partition *, enum xpc_retval); | 673 | extern void xpc_partition_going_down(struct xpc_partition *, enum xp_retval); |
674 | extern void xpc_teardown_infrastructure(struct xpc_partition *); | 674 | extern void xpc_teardown_infrastructure(struct xpc_partition *); |
675 | 675 | ||
676 | static inline void | 676 | static inline void |
@@ -901,7 +901,7 @@ xpc_IPI_receive(AMO_t *amo) | |||
901 | return FETCHOP_LOAD_OP(TO_AMO((u64)&amo->variable), FETCHOP_CLEAR); | 901 | return FETCHOP_LOAD_OP(TO_AMO((u64)&amo->variable), FETCHOP_CLEAR); |
902 | } | 902 | } |
903 | 903 | ||
904 | static inline enum xpc_retval | 904 | static inline enum xp_retval |
905 | xpc_IPI_send(AMO_t *amo, u64 flag, int nasid, int phys_cpuid, int vector) | 905 | xpc_IPI_send(AMO_t *amo, u64 flag, int nasid, int phys_cpuid, int vector) |
906 | { | 906 | { |
907 | int ret = 0; | 907 | int ret = 0; |
@@ -923,7 +923,7 @@ xpc_IPI_send(AMO_t *amo, u64 flag, int nasid, int phys_cpuid, int vector) | |||
923 | 923 | ||
924 | local_irq_restore(irq_flags); | 924 | local_irq_restore(irq_flags); |
925 | 925 | ||
926 | return ((ret == 0) ? xpcSuccess : xpcPioReadError); | 926 | return ((ret == 0) ? xpSuccess : xpPioReadError); |
927 | } | 927 | } |
928 | 928 | ||
929 | /* | 929 | /* |
@@ -992,7 +992,7 @@ xpc_notify_IRQ_send(struct xpc_channel *ch, u8 ipi_flag, char *ipi_flag_string, | |||
992 | unsigned long *irq_flags) | 992 | unsigned long *irq_flags) |
993 | { | 993 | { |
994 | struct xpc_partition *part = &xpc_partitions[ch->partid]; | 994 | struct xpc_partition *part = &xpc_partitions[ch->partid]; |
995 | enum xpc_retval ret; | 995 | enum xp_retval ret; |
996 | 996 | ||
997 | if (likely(part->act_state != XPC_P_DEACTIVATING)) { | 997 | if (likely(part->act_state != XPC_P_DEACTIVATING)) { |
998 | ret = xpc_IPI_send(part->remote_IPI_amo_va, | 998 | ret = xpc_IPI_send(part->remote_IPI_amo_va, |
@@ -1001,7 +1001,7 @@ xpc_notify_IRQ_send(struct xpc_channel *ch, u8 ipi_flag, char *ipi_flag_string, | |||
1001 | part->remote_IPI_phys_cpuid, SGI_XPC_NOTIFY); | 1001 | part->remote_IPI_phys_cpuid, SGI_XPC_NOTIFY); |
1002 | dev_dbg(xpc_chan, "%s sent to partid=%d, channel=%d, ret=%d\n", | 1002 | dev_dbg(xpc_chan, "%s sent to partid=%d, channel=%d, ret=%d\n", |
1003 | ipi_flag_string, ch->partid, ch->number, ret); | 1003 | ipi_flag_string, ch->partid, ch->number, ret); |
1004 | if (unlikely(ret != xpcSuccess)) { | 1004 | if (unlikely(ret != xpSuccess)) { |
1005 | if (irq_flags != NULL) | 1005 | if (irq_flags != NULL) |
1006 | spin_unlock_irqrestore(&ch->lock, *irq_flags); | 1006 | spin_unlock_irqrestore(&ch->lock, *irq_flags); |
1007 | XPC_DEACTIVATE_PARTITION(part, ret); | 1007 | XPC_DEACTIVATE_PARTITION(part, ret); |
@@ -1123,41 +1123,10 @@ xpc_IPI_init(int index) | |||
1123 | return amo; | 1123 | return amo; |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | static inline enum xpc_retval | 1126 | static inline enum xp_retval |
1127 | xpc_map_bte_errors(bte_result_t error) | 1127 | xpc_map_bte_errors(bte_result_t error) |
1128 | { | 1128 | { |
1129 | if (error == BTE_SUCCESS) | 1129 | return ((error == BTE_SUCCESS) ? xpSuccess : xpBteCopyError); |
1130 | return xpcSuccess; | ||
1131 | |||
1132 | if (is_shub2()) { | ||
1133 | if (BTE_VALID_SH2_ERROR(error)) | ||
1134 | return xpcBteSh2Start + error; | ||
1135 | return xpcBteUnmappedError; | ||
1136 | } | ||
1137 | switch (error) { | ||
1138 | case BTE_SUCCESS: | ||
1139 | return xpcSuccess; | ||
1140 | case BTEFAIL_DIR: | ||
1141 | return xpcBteDirectoryError; | ||
1142 | case BTEFAIL_POISON: | ||
1143 | return xpcBtePoisonError; | ||
1144 | case BTEFAIL_WERR: | ||
1145 | return xpcBteWriteError; | ||
1146 | case BTEFAIL_ACCESS: | ||
1147 | return xpcBteAccessError; | ||
1148 | case BTEFAIL_PWERR: | ||
1149 | return xpcBtePWriteError; | ||
1150 | case BTEFAIL_PRERR: | ||
1151 | return xpcBtePReadError; | ||
1152 | case BTEFAIL_TOUT: | ||
1153 | return xpcBteTimeOutError; | ||
1154 | case BTEFAIL_XTERR: | ||
1155 | return xpcBteXtalkError; | ||
1156 | case BTEFAIL_NOTAVAIL: | ||
1157 | return xpcBteNotAvailable; | ||
1158 | default: | ||
1159 | return xpcBteUnmappedError; | ||
1160 | } | ||
1161 | } | 1130 | } |
1162 | 1131 | ||
1163 | /* | 1132 | /* |
diff --git a/drivers/misc/sgi-xp/xpc_channel.c b/drivers/misc/sgi-xp/xpc_channel.c index bfcb9ea968e9..9c90c2d55c08 100644 --- a/drivers/misc/sgi-xp/xpc_channel.c +++ b/drivers/misc/sgi-xp/xpc_channel.c | |||
@@ -53,7 +53,7 @@ xpc_kzalloc_cacheline_aligned(size_t size, gfp_t flags, void **base) | |||
53 | * Set up the initial values for the XPartition Communication channels. | 53 | * Set up the initial values for the XPartition Communication channels. |
54 | */ | 54 | */ |
55 | static void | 55 | static void |
56 | xpc_initialize_channels(struct xpc_partition *part, partid_t partid) | 56 | xpc_initialize_channels(struct xpc_partition *part, short partid) |
57 | { | 57 | { |
58 | int ch_number; | 58 | int ch_number; |
59 | struct xpc_channel *ch; | 59 | struct xpc_channel *ch; |
@@ -90,12 +90,12 @@ xpc_initialize_channels(struct xpc_partition *part, partid_t partid) | |||
90 | * Setup the infrastructure necessary to support XPartition Communication | 90 | * Setup the infrastructure necessary to support XPartition Communication |
91 | * between the specified remote partition and the local one. | 91 | * between the specified remote partition and the local one. |
92 | */ | 92 | */ |
93 | enum xpc_retval | 93 | enum xp_retval |
94 | xpc_setup_infrastructure(struct xpc_partition *part) | 94 | xpc_setup_infrastructure(struct xpc_partition *part) |
95 | { | 95 | { |
96 | int ret, cpuid; | 96 | int ret, cpuid; |
97 | struct timer_list *timer; | 97 | struct timer_list *timer; |
98 | partid_t partid = XPC_PARTID(part); | 98 | short partid = XPC_PARTID(part); |
99 | 99 | ||
100 | /* | 100 | /* |
101 | * Zero out MOST of the entry for this partition. Only the fields | 101 | * Zero out MOST of the entry for this partition. Only the fields |
@@ -114,7 +114,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
114 | GFP_KERNEL); | 114 | GFP_KERNEL); |
115 | if (part->channels == NULL) { | 115 | if (part->channels == NULL) { |
116 | dev_err(xpc_chan, "can't get memory for channels\n"); | 116 | dev_err(xpc_chan, "can't get memory for channels\n"); |
117 | return xpcNoMemory; | 117 | return xpNoMemory; |
118 | } | 118 | } |
119 | 119 | ||
120 | part->nchannels = XPC_NCHANNELS; | 120 | part->nchannels = XPC_NCHANNELS; |
@@ -129,7 +129,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
129 | part->channels = NULL; | 129 | part->channels = NULL; |
130 | dev_err(xpc_chan, "can't get memory for local get/put " | 130 | dev_err(xpc_chan, "can't get memory for local get/put " |
131 | "values\n"); | 131 | "values\n"); |
132 | return xpcNoMemory; | 132 | return xpNoMemory; |
133 | } | 133 | } |
134 | 134 | ||
135 | part->remote_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE, | 135 | part->remote_GPs = xpc_kzalloc_cacheline_aligned(XPC_GP_SIZE, |
@@ -143,7 +143,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
143 | part->local_GPs = NULL; | 143 | part->local_GPs = NULL; |
144 | kfree(part->channels); | 144 | kfree(part->channels); |
145 | part->channels = NULL; | 145 | part->channels = NULL; |
146 | return xpcNoMemory; | 146 | return xpNoMemory; |
147 | } | 147 | } |
148 | 148 | ||
149 | /* allocate all the required open and close args */ | 149 | /* allocate all the required open and close args */ |
@@ -159,7 +159,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
159 | part->local_GPs = NULL; | 159 | part->local_GPs = NULL; |
160 | kfree(part->channels); | 160 | kfree(part->channels); |
161 | part->channels = NULL; | 161 | part->channels = NULL; |
162 | return xpcNoMemory; | 162 | return xpNoMemory; |
163 | } | 163 | } |
164 | 164 | ||
165 | part->remote_openclose_args = | 165 | part->remote_openclose_args = |
@@ -175,7 +175,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
175 | part->local_GPs = NULL; | 175 | part->local_GPs = NULL; |
176 | kfree(part->channels); | 176 | kfree(part->channels); |
177 | part->channels = NULL; | 177 | part->channels = NULL; |
178 | return xpcNoMemory; | 178 | return xpNoMemory; |
179 | } | 179 | } |
180 | 180 | ||
181 | xpc_initialize_channels(part, partid); | 181 | xpc_initialize_channels(part, partid); |
@@ -209,7 +209,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
209 | part->local_GPs = NULL; | 209 | part->local_GPs = NULL; |
210 | kfree(part->channels); | 210 | kfree(part->channels); |
211 | part->channels = NULL; | 211 | part->channels = NULL; |
212 | return xpcLackOfResources; | 212 | return xpLackOfResources; |
213 | } | 213 | } |
214 | 214 | ||
215 | /* Setup a timer to check for dropped IPIs */ | 215 | /* Setup a timer to check for dropped IPIs */ |
@@ -243,7 +243,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
243 | xpc_vars_part[partid].nchannels = part->nchannels; | 243 | xpc_vars_part[partid].nchannels = part->nchannels; |
244 | xpc_vars_part[partid].magic = XPC_VP_MAGIC1; | 244 | xpc_vars_part[partid].magic = XPC_VP_MAGIC1; |
245 | 245 | ||
246 | return xpcSuccess; | 246 | return xpSuccess; |
247 | } | 247 | } |
248 | 248 | ||
249 | /* | 249 | /* |
@@ -254,7 +254,7 @@ xpc_setup_infrastructure(struct xpc_partition *part) | |||
254 | * dst must be a cacheline aligned virtual address on this partition. | 254 | * dst must be a cacheline aligned virtual address on this partition. |
255 | * cnt must be an cacheline sized | 255 | * cnt must be an cacheline sized |
256 | */ | 256 | */ |
257 | static enum xpc_retval | 257 | static enum xp_retval |
258 | xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, | 258 | xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, |
259 | const void *src, size_t cnt) | 259 | const void *src, size_t cnt) |
260 | { | 260 | { |
@@ -270,7 +270,7 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, | |||
270 | bte_ret = xp_bte_copy((u64)src, (u64)dst, (u64)cnt, | 270 | bte_ret = xp_bte_copy((u64)src, (u64)dst, (u64)cnt, |
271 | (BTE_NORMAL | BTE_WACQUIRE), NULL); | 271 | (BTE_NORMAL | BTE_WACQUIRE), NULL); |
272 | if (bte_ret == BTE_SUCCESS) | 272 | if (bte_ret == BTE_SUCCESS) |
273 | return xpcSuccess; | 273 | return xpSuccess; |
274 | 274 | ||
275 | dev_dbg(xpc_chan, "xp_bte_copy() from partition %d failed, ret=%d\n", | 275 | dev_dbg(xpc_chan, "xp_bte_copy() from partition %d failed, ret=%d\n", |
276 | XPC_PARTID(part), bte_ret); | 276 | XPC_PARTID(part), bte_ret); |
@@ -282,7 +282,7 @@ xpc_pull_remote_cachelines(struct xpc_partition *part, void *dst, | |||
282 | * Pull the remote per partition specific variables from the specified | 282 | * Pull the remote per partition specific variables from the specified |
283 | * partition. | 283 | * partition. |
284 | */ | 284 | */ |
285 | enum xpc_retval | 285 | enum xp_retval |
286 | xpc_pull_remote_vars_part(struct xpc_partition *part) | 286 | xpc_pull_remote_vars_part(struct xpc_partition *part) |
287 | { | 287 | { |
288 | u8 buffer[L1_CACHE_BYTES * 2]; | 288 | u8 buffer[L1_CACHE_BYTES * 2]; |
@@ -290,8 +290,8 @@ xpc_pull_remote_vars_part(struct xpc_partition *part) | |||
290 | (struct xpc_vars_part *)L1_CACHE_ALIGN((u64)buffer); | 290 | (struct xpc_vars_part *)L1_CACHE_ALIGN((u64)buffer); |
291 | struct xpc_vars_part *pulled_entry; | 291 | struct xpc_vars_part *pulled_entry; |
292 | u64 remote_entry_cacheline_pa, remote_entry_pa; | 292 | u64 remote_entry_cacheline_pa, remote_entry_pa; |
293 | partid_t partid = XPC_PARTID(part); | 293 | short partid = XPC_PARTID(part); |
294 | enum xpc_retval ret; | 294 | enum xp_retval ret; |
295 | 295 | ||
296 | /* pull the cacheline that contains the variables we're interested in */ | 296 | /* pull the cacheline that contains the variables we're interested in */ |
297 | 297 | ||
@@ -311,7 +311,7 @@ xpc_pull_remote_vars_part(struct xpc_partition *part) | |||
311 | ret = xpc_pull_remote_cachelines(part, pulled_entry_cacheline, | 311 | ret = xpc_pull_remote_cachelines(part, pulled_entry_cacheline, |
312 | (void *)remote_entry_cacheline_pa, | 312 | (void *)remote_entry_cacheline_pa, |
313 | L1_CACHE_BYTES); | 313 | L1_CACHE_BYTES); |
314 | if (ret != xpcSuccess) { | 314 | if (ret != xpSuccess) { |
315 | dev_dbg(xpc_chan, "failed to pull XPC vars_part from " | 315 | dev_dbg(xpc_chan, "failed to pull XPC vars_part from " |
316 | "partition %d, ret=%d\n", partid, ret); | 316 | "partition %d, ret=%d\n", partid, ret); |
317 | return ret; | 317 | return ret; |
@@ -326,11 +326,11 @@ xpc_pull_remote_vars_part(struct xpc_partition *part) | |||
326 | dev_dbg(xpc_chan, "partition %d's XPC vars_part for " | 326 | dev_dbg(xpc_chan, "partition %d's XPC vars_part for " |
327 | "partition %d has bad magic value (=0x%lx)\n", | 327 | "partition %d has bad magic value (=0x%lx)\n", |
328 | partid, sn_partition_id, pulled_entry->magic); | 328 | partid, sn_partition_id, pulled_entry->magic); |
329 | return xpcBadMagic; | 329 | return xpBadMagic; |
330 | } | 330 | } |
331 | 331 | ||
332 | /* they've not been initialized yet */ | 332 | /* they've not been initialized yet */ |
333 | return xpcRetry; | 333 | return xpRetry; |
334 | } | 334 | } |
335 | 335 | ||
336 | if (xpc_vars_part[partid].magic == XPC_VP_MAGIC1) { | 336 | if (xpc_vars_part[partid].magic == XPC_VP_MAGIC1) { |
@@ -344,7 +344,7 @@ xpc_pull_remote_vars_part(struct xpc_partition *part) | |||
344 | dev_err(xpc_chan, "partition %d's XPC vars_part for " | 344 | dev_err(xpc_chan, "partition %d's XPC vars_part for " |
345 | "partition %d are not valid\n", partid, | 345 | "partition %d are not valid\n", partid, |
346 | sn_partition_id); | 346 | sn_partition_id); |
347 | return xpcInvalidAddress; | 347 | return xpInvalidAddress; |
348 | } | 348 | } |
349 | 349 | ||
350 | /* the variables we imported look to be valid */ | 350 | /* the variables we imported look to be valid */ |
@@ -366,9 +366,9 @@ xpc_pull_remote_vars_part(struct xpc_partition *part) | |||
366 | } | 366 | } |
367 | 367 | ||
368 | if (pulled_entry->magic == XPC_VP_MAGIC1) | 368 | if (pulled_entry->magic == XPC_VP_MAGIC1) |
369 | return xpcRetry; | 369 | return xpRetry; |
370 | 370 | ||
371 | return xpcSuccess; | 371 | return xpSuccess; |
372 | } | 372 | } |
373 | 373 | ||
374 | /* | 374 | /* |
@@ -379,7 +379,7 @@ xpc_get_IPI_flags(struct xpc_partition *part) | |||
379 | { | 379 | { |
380 | unsigned long irq_flags; | 380 | unsigned long irq_flags; |
381 | u64 IPI_amo; | 381 | u64 IPI_amo; |
382 | enum xpc_retval ret; | 382 | enum xp_retval ret; |
383 | 383 | ||
384 | /* | 384 | /* |
385 | * See if there are any IPI flags to be handled. | 385 | * See if there are any IPI flags to be handled. |
@@ -398,7 +398,7 @@ xpc_get_IPI_flags(struct xpc_partition *part) | |||
398 | (void *)part-> | 398 | (void *)part-> |
399 | remote_openclose_args_pa, | 399 | remote_openclose_args_pa, |
400 | XPC_OPENCLOSE_ARGS_SIZE); | 400 | XPC_OPENCLOSE_ARGS_SIZE); |
401 | if (ret != xpcSuccess) { | 401 | if (ret != xpSuccess) { |
402 | XPC_DEACTIVATE_PARTITION(part, ret); | 402 | XPC_DEACTIVATE_PARTITION(part, ret); |
403 | 403 | ||
404 | dev_dbg(xpc_chan, "failed to pull openclose args from " | 404 | dev_dbg(xpc_chan, "failed to pull openclose args from " |
@@ -414,7 +414,7 @@ xpc_get_IPI_flags(struct xpc_partition *part) | |||
414 | ret = xpc_pull_remote_cachelines(part, part->remote_GPs, | 414 | ret = xpc_pull_remote_cachelines(part, part->remote_GPs, |
415 | (void *)part->remote_GPs_pa, | 415 | (void *)part->remote_GPs_pa, |
416 | XPC_GP_SIZE); | 416 | XPC_GP_SIZE); |
417 | if (ret != xpcSuccess) { | 417 | if (ret != xpSuccess) { |
418 | XPC_DEACTIVATE_PARTITION(part, ret); | 418 | XPC_DEACTIVATE_PARTITION(part, ret); |
419 | 419 | ||
420 | dev_dbg(xpc_chan, "failed to pull GPs from partition " | 420 | dev_dbg(xpc_chan, "failed to pull GPs from partition " |
@@ -431,7 +431,7 @@ xpc_get_IPI_flags(struct xpc_partition *part) | |||
431 | /* | 431 | /* |
432 | * Allocate the local message queue and the notify queue. | 432 | * Allocate the local message queue and the notify queue. |
433 | */ | 433 | */ |
434 | static enum xpc_retval | 434 | static enum xp_retval |
435 | xpc_allocate_local_msgqueue(struct xpc_channel *ch) | 435 | xpc_allocate_local_msgqueue(struct xpc_channel *ch) |
436 | { | 436 | { |
437 | unsigned long irq_flags; | 437 | unsigned long irq_flags; |
@@ -464,18 +464,18 @@ xpc_allocate_local_msgqueue(struct xpc_channel *ch) | |||
464 | ch->local_nentries = nentries; | 464 | ch->local_nentries = nentries; |
465 | } | 465 | } |
466 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 466 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
467 | return xpcSuccess; | 467 | return xpSuccess; |
468 | } | 468 | } |
469 | 469 | ||
470 | dev_dbg(xpc_chan, "can't get memory for local message queue and notify " | 470 | dev_dbg(xpc_chan, "can't get memory for local message queue and notify " |
471 | "queue, partid=%d, channel=%d\n", ch->partid, ch->number); | 471 | "queue, partid=%d, channel=%d\n", ch->partid, ch->number); |
472 | return xpcNoMemory; | 472 | return xpNoMemory; |
473 | } | 473 | } |
474 | 474 | ||
475 | /* | 475 | /* |
476 | * Allocate the cached remote message queue. | 476 | * Allocate the cached remote message queue. |
477 | */ | 477 | */ |
478 | static enum xpc_retval | 478 | static enum xp_retval |
479 | xpc_allocate_remote_msgqueue(struct xpc_channel *ch) | 479 | xpc_allocate_remote_msgqueue(struct xpc_channel *ch) |
480 | { | 480 | { |
481 | unsigned long irq_flags; | 481 | unsigned long irq_flags; |
@@ -502,12 +502,12 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch) | |||
502 | ch->remote_nentries = nentries; | 502 | ch->remote_nentries = nentries; |
503 | } | 503 | } |
504 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 504 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
505 | return xpcSuccess; | 505 | return xpSuccess; |
506 | } | 506 | } |
507 | 507 | ||
508 | dev_dbg(xpc_chan, "can't get memory for cached remote message queue, " | 508 | dev_dbg(xpc_chan, "can't get memory for cached remote message queue, " |
509 | "partid=%d, channel=%d\n", ch->partid, ch->number); | 509 | "partid=%d, channel=%d\n", ch->partid, ch->number); |
510 | return xpcNoMemory; | 510 | return xpNoMemory; |
511 | } | 511 | } |
512 | 512 | ||
513 | /* | 513 | /* |
@@ -515,20 +515,20 @@ xpc_allocate_remote_msgqueue(struct xpc_channel *ch) | |||
515 | * | 515 | * |
516 | * Note: Assumes all of the channel sizes are filled in. | 516 | * Note: Assumes all of the channel sizes are filled in. |
517 | */ | 517 | */ |
518 | static enum xpc_retval | 518 | static enum xp_retval |
519 | xpc_allocate_msgqueues(struct xpc_channel *ch) | 519 | xpc_allocate_msgqueues(struct xpc_channel *ch) |
520 | { | 520 | { |
521 | unsigned long irq_flags; | 521 | unsigned long irq_flags; |
522 | enum xpc_retval ret; | 522 | enum xp_retval ret; |
523 | 523 | ||
524 | DBUG_ON(ch->flags & XPC_C_SETUP); | 524 | DBUG_ON(ch->flags & XPC_C_SETUP); |
525 | 525 | ||
526 | ret = xpc_allocate_local_msgqueue(ch); | 526 | ret = xpc_allocate_local_msgqueue(ch); |
527 | if (ret != xpcSuccess) | 527 | if (ret != xpSuccess) |
528 | return ret; | 528 | return ret; |
529 | 529 | ||
530 | ret = xpc_allocate_remote_msgqueue(ch); | 530 | ret = xpc_allocate_remote_msgqueue(ch); |
531 | if (ret != xpcSuccess) { | 531 | if (ret != xpSuccess) { |
532 | kfree(ch->local_msgqueue_base); | 532 | kfree(ch->local_msgqueue_base); |
533 | ch->local_msgqueue = NULL; | 533 | ch->local_msgqueue = NULL; |
534 | kfree(ch->notify_queue); | 534 | kfree(ch->notify_queue); |
@@ -540,7 +540,7 @@ xpc_allocate_msgqueues(struct xpc_channel *ch) | |||
540 | ch->flags |= XPC_C_SETUP; | 540 | ch->flags |= XPC_C_SETUP; |
541 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 541 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
542 | 542 | ||
543 | return xpcSuccess; | 543 | return xpSuccess; |
544 | } | 544 | } |
545 | 545 | ||
546 | /* | 546 | /* |
@@ -552,7 +552,7 @@ xpc_allocate_msgqueues(struct xpc_channel *ch) | |||
552 | static void | 552 | static void |
553 | xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags) | 553 | xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags) |
554 | { | 554 | { |
555 | enum xpc_retval ret; | 555 | enum xp_retval ret; |
556 | 556 | ||
557 | DBUG_ON(!spin_is_locked(&ch->lock)); | 557 | DBUG_ON(!spin_is_locked(&ch->lock)); |
558 | 558 | ||
@@ -568,7 +568,7 @@ xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags) | |||
568 | ret = xpc_allocate_msgqueues(ch); | 568 | ret = xpc_allocate_msgqueues(ch); |
569 | spin_lock_irqsave(&ch->lock, *irq_flags); | 569 | spin_lock_irqsave(&ch->lock, *irq_flags); |
570 | 570 | ||
571 | if (ret != xpcSuccess) | 571 | if (ret != xpSuccess) |
572 | XPC_DISCONNECT_CHANNEL(ch, ret, irq_flags); | 572 | XPC_DISCONNECT_CHANNEL(ch, ret, irq_flags); |
573 | 573 | ||
574 | if (ch->flags & (XPC_C_CONNECTED | XPC_C_DISCONNECTING)) | 574 | if (ch->flags & (XPC_C_CONNECTED | XPC_C_DISCONNECTING)) |
@@ -603,7 +603,7 @@ xpc_process_connect(struct xpc_channel *ch, unsigned long *irq_flags) | |||
603 | * Notify those who wanted to be notified upon delivery of their message. | 603 | * Notify those who wanted to be notified upon delivery of their message. |
604 | */ | 604 | */ |
605 | static void | 605 | static void |
606 | xpc_notify_senders(struct xpc_channel *ch, enum xpc_retval reason, s64 put) | 606 | xpc_notify_senders(struct xpc_channel *ch, enum xp_retval reason, s64 put) |
607 | { | 607 | { |
608 | struct xpc_notify *notify; | 608 | struct xpc_notify *notify; |
609 | u8 notify_type; | 609 | u8 notify_type; |
@@ -748,7 +748,7 @@ xpc_process_disconnect(struct xpc_channel *ch, unsigned long *irq_flags) | |||
748 | 748 | ||
749 | if (ch->flags & XPC_C_DISCONNECTINGCALLOUT_MADE) { | 749 | if (ch->flags & XPC_C_DISCONNECTINGCALLOUT_MADE) { |
750 | spin_unlock_irqrestore(&ch->lock, *irq_flags); | 750 | spin_unlock_irqrestore(&ch->lock, *irq_flags); |
751 | xpc_disconnect_callout(ch, xpcDisconnected); | 751 | xpc_disconnect_callout(ch, xpDisconnected); |
752 | spin_lock_irqsave(&ch->lock, *irq_flags); | 752 | spin_lock_irqsave(&ch->lock, *irq_flags); |
753 | } | 753 | } |
754 | 754 | ||
@@ -791,7 +791,7 @@ xpc_process_openclose_IPI(struct xpc_partition *part, int ch_number, | |||
791 | struct xpc_openclose_args *args = | 791 | struct xpc_openclose_args *args = |
792 | &part->remote_openclose_args[ch_number]; | 792 | &part->remote_openclose_args[ch_number]; |
793 | struct xpc_channel *ch = &part->channels[ch_number]; | 793 | struct xpc_channel *ch = &part->channels[ch_number]; |
794 | enum xpc_retval reason; | 794 | enum xp_retval reason; |
795 | 795 | ||
796 | spin_lock_irqsave(&ch->lock, irq_flags); | 796 | spin_lock_irqsave(&ch->lock, irq_flags); |
797 | 797 | ||
@@ -871,10 +871,10 @@ again: | |||
871 | 871 | ||
872 | if (!(ch->flags & XPC_C_DISCONNECTING)) { | 872 | if (!(ch->flags & XPC_C_DISCONNECTING)) { |
873 | reason = args->reason; | 873 | reason = args->reason; |
874 | if (reason <= xpcSuccess || reason > xpcUnknownReason) | 874 | if (reason <= xpSuccess || reason > xpUnknownReason) |
875 | reason = xpcUnknownReason; | 875 | reason = xpUnknownReason; |
876 | else if (reason == xpcUnregistering) | 876 | else if (reason == xpUnregistering) |
877 | reason = xpcOtherUnregistering; | 877 | reason = xpOtherUnregistering; |
878 | 878 | ||
879 | XPC_DISCONNECT_CHANNEL(ch, reason, &irq_flags); | 879 | XPC_DISCONNECT_CHANNEL(ch, reason, &irq_flags); |
880 | 880 | ||
@@ -961,7 +961,7 @@ again: | |||
961 | 961 | ||
962 | if (ch->flags & XPC_C_OPENREQUEST) { | 962 | if (ch->flags & XPC_C_OPENREQUEST) { |
963 | if (args->msg_size != ch->msg_size) { | 963 | if (args->msg_size != ch->msg_size) { |
964 | XPC_DISCONNECT_CHANNEL(ch, xpcUnequalMsgSizes, | 964 | XPC_DISCONNECT_CHANNEL(ch, xpUnequalMsgSizes, |
965 | &irq_flags); | 965 | &irq_flags); |
966 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 966 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
967 | return; | 967 | return; |
@@ -991,7 +991,7 @@ again: | |||
991 | return; | 991 | return; |
992 | } | 992 | } |
993 | if (!(ch->flags & XPC_C_OPENREQUEST)) { | 993 | if (!(ch->flags & XPC_C_OPENREQUEST)) { |
994 | XPC_DISCONNECT_CHANNEL(ch, xpcOpenCloseError, | 994 | XPC_DISCONNECT_CHANNEL(ch, xpOpenCloseError, |
995 | &irq_flags); | 995 | &irq_flags); |
996 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 996 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
997 | return; | 997 | return; |
@@ -1042,18 +1042,18 @@ again: | |||
1042 | /* | 1042 | /* |
1043 | * Attempt to establish a channel connection to a remote partition. | 1043 | * Attempt to establish a channel connection to a remote partition. |
1044 | */ | 1044 | */ |
1045 | static enum xpc_retval | 1045 | static enum xp_retval |
1046 | xpc_connect_channel(struct xpc_channel *ch) | 1046 | xpc_connect_channel(struct xpc_channel *ch) |
1047 | { | 1047 | { |
1048 | unsigned long irq_flags; | 1048 | unsigned long irq_flags; |
1049 | struct xpc_registration *registration = &xpc_registrations[ch->number]; | 1049 | struct xpc_registration *registration = &xpc_registrations[ch->number]; |
1050 | 1050 | ||
1051 | if (mutex_trylock(®istration->mutex) == 0) | 1051 | if (mutex_trylock(®istration->mutex) == 0) |
1052 | return xpcRetry; | 1052 | return xpRetry; |
1053 | 1053 | ||
1054 | if (!XPC_CHANNEL_REGISTERED(ch->number)) { | 1054 | if (!XPC_CHANNEL_REGISTERED(ch->number)) { |
1055 | mutex_unlock(®istration->mutex); | 1055 | mutex_unlock(®istration->mutex); |
1056 | return xpcUnregistered; | 1056 | return xpUnregistered; |
1057 | } | 1057 | } |
1058 | 1058 | ||
1059 | spin_lock_irqsave(&ch->lock, irq_flags); | 1059 | spin_lock_irqsave(&ch->lock, irq_flags); |
@@ -1095,10 +1095,10 @@ xpc_connect_channel(struct xpc_channel *ch) | |||
1095 | * the channel lock as needed. | 1095 | * the channel lock as needed. |
1096 | */ | 1096 | */ |
1097 | mutex_unlock(®istration->mutex); | 1097 | mutex_unlock(®istration->mutex); |
1098 | XPC_DISCONNECT_CHANNEL(ch, xpcUnequalMsgSizes, | 1098 | XPC_DISCONNECT_CHANNEL(ch, xpUnequalMsgSizes, |
1099 | &irq_flags); | 1099 | &irq_flags); |
1100 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 1100 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
1101 | return xpcUnequalMsgSizes; | 1101 | return xpUnequalMsgSizes; |
1102 | } | 1102 | } |
1103 | } else { | 1103 | } else { |
1104 | ch->msg_size = registration->msg_size; | 1104 | ch->msg_size = registration->msg_size; |
@@ -1120,7 +1120,7 @@ xpc_connect_channel(struct xpc_channel *ch) | |||
1120 | 1120 | ||
1121 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 1121 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
1122 | 1122 | ||
1123 | return xpcSuccess; | 1123 | return xpSuccess; |
1124 | } | 1124 | } |
1125 | 1125 | ||
1126 | /* | 1126 | /* |
@@ -1203,7 +1203,7 @@ xpc_process_msg_IPI(struct xpc_partition *part, int ch_number) | |||
1203 | * Notify senders that messages sent have been | 1203 | * Notify senders that messages sent have been |
1204 | * received and delivered by the other side. | 1204 | * received and delivered by the other side. |
1205 | */ | 1205 | */ |
1206 | xpc_notify_senders(ch, xpcMsgDelivered, | 1206 | xpc_notify_senders(ch, xpMsgDelivered, |
1207 | ch->remote_GP.get); | 1207 | ch->remote_GP.get); |
1208 | } | 1208 | } |
1209 | 1209 | ||
@@ -1335,7 +1335,7 @@ xpc_process_channel_activity(struct xpc_partition *part) | |||
1335 | * at the same time. | 1335 | * at the same time. |
1336 | */ | 1336 | */ |
1337 | void | 1337 | void |
1338 | xpc_partition_going_down(struct xpc_partition *part, enum xpc_retval reason) | 1338 | xpc_partition_going_down(struct xpc_partition *part, enum xp_retval reason) |
1339 | { | 1339 | { |
1340 | unsigned long irq_flags; | 1340 | unsigned long irq_flags; |
1341 | int ch_number; | 1341 | int ch_number; |
@@ -1375,7 +1375,7 @@ xpc_partition_going_down(struct xpc_partition *part, enum xpc_retval reason) | |||
1375 | void | 1375 | void |
1376 | xpc_teardown_infrastructure(struct xpc_partition *part) | 1376 | xpc_teardown_infrastructure(struct xpc_partition *part) |
1377 | { | 1377 | { |
1378 | partid_t partid = XPC_PARTID(part); | 1378 | short partid = XPC_PARTID(part); |
1379 | 1379 | ||
1380 | /* | 1380 | /* |
1381 | * We start off by making this partition inaccessible to local | 1381 | * We start off by making this partition inaccessible to local |
@@ -1428,7 +1428,7 @@ xpc_teardown_infrastructure(struct xpc_partition *part) | |||
1428 | void | 1428 | void |
1429 | xpc_initiate_connect(int ch_number) | 1429 | xpc_initiate_connect(int ch_number) |
1430 | { | 1430 | { |
1431 | partid_t partid; | 1431 | short partid; |
1432 | struct xpc_partition *part; | 1432 | struct xpc_partition *part; |
1433 | struct xpc_channel *ch; | 1433 | struct xpc_channel *ch; |
1434 | 1434 | ||
@@ -1456,13 +1456,13 @@ xpc_connected_callout(struct xpc_channel *ch) | |||
1456 | /* let the registerer know that a connection has been established */ | 1456 | /* let the registerer know that a connection has been established */ |
1457 | 1457 | ||
1458 | if (ch->func != NULL) { | 1458 | if (ch->func != NULL) { |
1459 | dev_dbg(xpc_chan, "ch->func() called, reason=xpcConnected, " | 1459 | dev_dbg(xpc_chan, "ch->func() called, reason=xpConnected, " |
1460 | "partid=%d, channel=%d\n", ch->partid, ch->number); | 1460 | "partid=%d, channel=%d\n", ch->partid, ch->number); |
1461 | 1461 | ||
1462 | ch->func(xpcConnected, ch->partid, ch->number, | 1462 | ch->func(xpConnected, ch->partid, ch->number, |
1463 | (void *)(u64)ch->local_nentries, ch->key); | 1463 | (void *)(u64)ch->local_nentries, ch->key); |
1464 | 1464 | ||
1465 | dev_dbg(xpc_chan, "ch->func() returned, reason=xpcConnected, " | 1465 | dev_dbg(xpc_chan, "ch->func() returned, reason=xpConnected, " |
1466 | "partid=%d, channel=%d\n", ch->partid, ch->number); | 1466 | "partid=%d, channel=%d\n", ch->partid, ch->number); |
1467 | } | 1467 | } |
1468 | } | 1468 | } |
@@ -1484,7 +1484,7 @@ void | |||
1484 | xpc_initiate_disconnect(int ch_number) | 1484 | xpc_initiate_disconnect(int ch_number) |
1485 | { | 1485 | { |
1486 | unsigned long irq_flags; | 1486 | unsigned long irq_flags; |
1487 | partid_t partid; | 1487 | short partid; |
1488 | struct xpc_partition *part; | 1488 | struct xpc_partition *part; |
1489 | struct xpc_channel *ch; | 1489 | struct xpc_channel *ch; |
1490 | 1490 | ||
@@ -1503,7 +1503,7 @@ xpc_initiate_disconnect(int ch_number) | |||
1503 | if (!(ch->flags & XPC_C_DISCONNECTED)) { | 1503 | if (!(ch->flags & XPC_C_DISCONNECTED)) { |
1504 | ch->flags |= XPC_C_WDISCONNECT; | 1504 | ch->flags |= XPC_C_WDISCONNECT; |
1505 | 1505 | ||
1506 | XPC_DISCONNECT_CHANNEL(ch, xpcUnregistering, | 1506 | XPC_DISCONNECT_CHANNEL(ch, xpUnregistering, |
1507 | &irq_flags); | 1507 | &irq_flags); |
1508 | } | 1508 | } |
1509 | 1509 | ||
@@ -1528,7 +1528,7 @@ xpc_initiate_disconnect(int ch_number) | |||
1528 | */ | 1528 | */ |
1529 | void | 1529 | void |
1530 | xpc_disconnect_channel(const int line, struct xpc_channel *ch, | 1530 | xpc_disconnect_channel(const int line, struct xpc_channel *ch, |
1531 | enum xpc_retval reason, unsigned long *irq_flags) | 1531 | enum xp_retval reason, unsigned long *irq_flags) |
1532 | { | 1532 | { |
1533 | u32 channel_was_connected = (ch->flags & XPC_C_CONNECTED); | 1533 | u32 channel_was_connected = (ch->flags & XPC_C_CONNECTED); |
1534 | 1534 | ||
@@ -1563,7 +1563,7 @@ xpc_disconnect_channel(const int line, struct xpc_channel *ch, | |||
1563 | 1563 | ||
1564 | } else if ((ch->flags & XPC_C_CONNECTEDCALLOUT_MADE) && | 1564 | } else if ((ch->flags & XPC_C_CONNECTEDCALLOUT_MADE) && |
1565 | !(ch->flags & XPC_C_DISCONNECTINGCALLOUT)) { | 1565 | !(ch->flags & XPC_C_DISCONNECTINGCALLOUT)) { |
1566 | /* start a kthread that will do the xpcDisconnecting callout */ | 1566 | /* start a kthread that will do the xpDisconnecting callout */ |
1567 | xpc_create_kthreads(ch, 1, 1); | 1567 | xpc_create_kthreads(ch, 1, 1); |
1568 | } | 1568 | } |
1569 | 1569 | ||
@@ -1575,7 +1575,7 @@ xpc_disconnect_channel(const int line, struct xpc_channel *ch, | |||
1575 | } | 1575 | } |
1576 | 1576 | ||
1577 | void | 1577 | void |
1578 | xpc_disconnect_callout(struct xpc_channel *ch, enum xpc_retval reason) | 1578 | xpc_disconnect_callout(struct xpc_channel *ch, enum xp_retval reason) |
1579 | { | 1579 | { |
1580 | /* | 1580 | /* |
1581 | * Let the channel's registerer know that the channel is being | 1581 | * Let the channel's registerer know that the channel is being |
@@ -1598,13 +1598,13 @@ xpc_disconnect_callout(struct xpc_channel *ch, enum xpc_retval reason) | |||
1598 | * Wait for a message entry to become available for the specified channel, | 1598 | * Wait for a message entry to become available for the specified channel, |
1599 | * but don't wait any longer than 1 jiffy. | 1599 | * but don't wait any longer than 1 jiffy. |
1600 | */ | 1600 | */ |
1601 | static enum xpc_retval | 1601 | static enum xp_retval |
1602 | xpc_allocate_msg_wait(struct xpc_channel *ch) | 1602 | xpc_allocate_msg_wait(struct xpc_channel *ch) |
1603 | { | 1603 | { |
1604 | enum xpc_retval ret; | 1604 | enum xp_retval ret; |
1605 | 1605 | ||
1606 | if (ch->flags & XPC_C_DISCONNECTING) { | 1606 | if (ch->flags & XPC_C_DISCONNECTING) { |
1607 | DBUG_ON(ch->reason == xpcInterrupted); | 1607 | DBUG_ON(ch->reason == xpInterrupted); |
1608 | return ch->reason; | 1608 | return ch->reason; |
1609 | } | 1609 | } |
1610 | 1610 | ||
@@ -1614,11 +1614,11 @@ xpc_allocate_msg_wait(struct xpc_channel *ch) | |||
1614 | 1614 | ||
1615 | if (ch->flags & XPC_C_DISCONNECTING) { | 1615 | if (ch->flags & XPC_C_DISCONNECTING) { |
1616 | ret = ch->reason; | 1616 | ret = ch->reason; |
1617 | DBUG_ON(ch->reason == xpcInterrupted); | 1617 | DBUG_ON(ch->reason == xpInterrupted); |
1618 | } else if (ret == 0) { | 1618 | } else if (ret == 0) { |
1619 | ret = xpcTimeout; | 1619 | ret = xpTimeout; |
1620 | } else { | 1620 | } else { |
1621 | ret = xpcInterrupted; | 1621 | ret = xpInterrupted; |
1622 | } | 1622 | } |
1623 | 1623 | ||
1624 | return ret; | 1624 | return ret; |
@@ -1628,12 +1628,12 @@ xpc_allocate_msg_wait(struct xpc_channel *ch) | |||
1628 | * Allocate an entry for a message from the message queue associated with the | 1628 | * Allocate an entry for a message from the message queue associated with the |
1629 | * specified channel. | 1629 | * specified channel. |
1630 | */ | 1630 | */ |
1631 | static enum xpc_retval | 1631 | static enum xp_retval |
1632 | xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | 1632 | xpc_allocate_msg(struct xpc_channel *ch, u32 flags, |
1633 | struct xpc_msg **address_of_msg) | 1633 | struct xpc_msg **address_of_msg) |
1634 | { | 1634 | { |
1635 | struct xpc_msg *msg; | 1635 | struct xpc_msg *msg; |
1636 | enum xpc_retval ret; | 1636 | enum xp_retval ret; |
1637 | s64 put; | 1637 | s64 put; |
1638 | 1638 | ||
1639 | /* this reference will be dropped in xpc_send_msg() */ | 1639 | /* this reference will be dropped in xpc_send_msg() */ |
@@ -1645,7 +1645,7 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | |||
1645 | } | 1645 | } |
1646 | if (!(ch->flags & XPC_C_CONNECTED)) { | 1646 | if (!(ch->flags & XPC_C_CONNECTED)) { |
1647 | xpc_msgqueue_deref(ch); | 1647 | xpc_msgqueue_deref(ch); |
1648 | return xpcNotConnected; | 1648 | return xpNotConnected; |
1649 | } | 1649 | } |
1650 | 1650 | ||
1651 | /* | 1651 | /* |
@@ -1653,7 +1653,7 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | |||
1653 | * If none are available, we'll make sure that we grab the latest | 1653 | * If none are available, we'll make sure that we grab the latest |
1654 | * GP values. | 1654 | * GP values. |
1655 | */ | 1655 | */ |
1656 | ret = xpcTimeout; | 1656 | ret = xpTimeout; |
1657 | 1657 | ||
1658 | while (1) { | 1658 | while (1) { |
1659 | 1659 | ||
@@ -1683,16 +1683,16 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | |||
1683 | * that will cause the IPI handler to fetch the latest | 1683 | * that will cause the IPI handler to fetch the latest |
1684 | * GP values as if an IPI was sent by the other side. | 1684 | * GP values as if an IPI was sent by the other side. |
1685 | */ | 1685 | */ |
1686 | if (ret == xpcTimeout) | 1686 | if (ret == xpTimeout) |
1687 | xpc_IPI_send_local_msgrequest(ch); | 1687 | xpc_IPI_send_local_msgrequest(ch); |
1688 | 1688 | ||
1689 | if (flags & XPC_NOWAIT) { | 1689 | if (flags & XPC_NOWAIT) { |
1690 | xpc_msgqueue_deref(ch); | 1690 | xpc_msgqueue_deref(ch); |
1691 | return xpcNoWait; | 1691 | return xpNoWait; |
1692 | } | 1692 | } |
1693 | 1693 | ||
1694 | ret = xpc_allocate_msg_wait(ch); | 1694 | ret = xpc_allocate_msg_wait(ch); |
1695 | if (ret != xpcInterrupted && ret != xpcTimeout) { | 1695 | if (ret != xpInterrupted && ret != xpTimeout) { |
1696 | xpc_msgqueue_deref(ch); | 1696 | xpc_msgqueue_deref(ch); |
1697 | return ret; | 1697 | return ret; |
1698 | } | 1698 | } |
@@ -1711,7 +1711,7 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | |||
1711 | 1711 | ||
1712 | *address_of_msg = msg; | 1712 | *address_of_msg = msg; |
1713 | 1713 | ||
1714 | return xpcSuccess; | 1714 | return xpSuccess; |
1715 | } | 1715 | } |
1716 | 1716 | ||
1717 | /* | 1717 | /* |
@@ -1727,11 +1727,11 @@ xpc_allocate_msg(struct xpc_channel *ch, u32 flags, | |||
1727 | * payload - address of the allocated payload area pointer (filled in on | 1727 | * payload - address of the allocated payload area pointer (filled in on |
1728 | * return) in which the user-defined message is constructed. | 1728 | * return) in which the user-defined message is constructed. |
1729 | */ | 1729 | */ |
1730 | enum xpc_retval | 1730 | enum xp_retval |
1731 | xpc_initiate_allocate(partid_t partid, int ch_number, u32 flags, void **payload) | 1731 | xpc_initiate_allocate(short partid, int ch_number, u32 flags, void **payload) |
1732 | { | 1732 | { |
1733 | struct xpc_partition *part = &xpc_partitions[partid]; | 1733 | struct xpc_partition *part = &xpc_partitions[partid]; |
1734 | enum xpc_retval ret = xpcUnknownReason; | 1734 | enum xp_retval ret = xpUnknownReason; |
1735 | struct xpc_msg *msg = NULL; | 1735 | struct xpc_msg *msg = NULL; |
1736 | 1736 | ||
1737 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); | 1737 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); |
@@ -1814,11 +1814,11 @@ xpc_send_msgs(struct xpc_channel *ch, s64 initial_put) | |||
1814 | * local message queue's Put value and sends an IPI to the partition the | 1814 | * local message queue's Put value and sends an IPI to the partition the |
1815 | * message is being sent to. | 1815 | * message is being sent to. |
1816 | */ | 1816 | */ |
1817 | static enum xpc_retval | 1817 | static enum xp_retval |
1818 | xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type, | 1818 | xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type, |
1819 | xpc_notify_func func, void *key) | 1819 | xpc_notify_func func, void *key) |
1820 | { | 1820 | { |
1821 | enum xpc_retval ret = xpcSuccess; | 1821 | enum xp_retval ret = xpSuccess; |
1822 | struct xpc_notify *notify = notify; | 1822 | struct xpc_notify *notify = notify; |
1823 | s64 put, msg_number = msg->number; | 1823 | s64 put, msg_number = msg->number; |
1824 | 1824 | ||
@@ -1908,12 +1908,12 @@ xpc_send_msg(struct xpc_channel *ch, struct xpc_msg *msg, u8 notify_type, | |||
1908 | * payload - pointer to the payload area allocated via | 1908 | * payload - pointer to the payload area allocated via |
1909 | * xpc_initiate_allocate(). | 1909 | * xpc_initiate_allocate(). |
1910 | */ | 1910 | */ |
1911 | enum xpc_retval | 1911 | enum xp_retval |
1912 | xpc_initiate_send(partid_t partid, int ch_number, void *payload) | 1912 | xpc_initiate_send(short partid, int ch_number, void *payload) |
1913 | { | 1913 | { |
1914 | struct xpc_partition *part = &xpc_partitions[partid]; | 1914 | struct xpc_partition *part = &xpc_partitions[partid]; |
1915 | struct xpc_msg *msg = XPC_MSG_ADDRESS(payload); | 1915 | struct xpc_msg *msg = XPC_MSG_ADDRESS(payload); |
1916 | enum xpc_retval ret; | 1916 | enum xp_retval ret; |
1917 | 1917 | ||
1918 | dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg, | 1918 | dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg, |
1919 | partid, ch_number); | 1919 | partid, ch_number); |
@@ -1957,13 +1957,13 @@ xpc_initiate_send(partid_t partid, int ch_number, void *payload) | |||
1957 | * receipt. THIS FUNCTION MUST BE NON-BLOCKING. | 1957 | * receipt. THIS FUNCTION MUST BE NON-BLOCKING. |
1958 | * key - user-defined key to be passed to the function when it's called. | 1958 | * key - user-defined key to be passed to the function when it's called. |
1959 | */ | 1959 | */ |
1960 | enum xpc_retval | 1960 | enum xp_retval |
1961 | xpc_initiate_send_notify(partid_t partid, int ch_number, void *payload, | 1961 | xpc_initiate_send_notify(short partid, int ch_number, void *payload, |
1962 | xpc_notify_func func, void *key) | 1962 | xpc_notify_func func, void *key) |
1963 | { | 1963 | { |
1964 | struct xpc_partition *part = &xpc_partitions[partid]; | 1964 | struct xpc_partition *part = &xpc_partitions[partid]; |
1965 | struct xpc_msg *msg = XPC_MSG_ADDRESS(payload); | 1965 | struct xpc_msg *msg = XPC_MSG_ADDRESS(payload); |
1966 | enum xpc_retval ret; | 1966 | enum xp_retval ret; |
1967 | 1967 | ||
1968 | dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg, | 1968 | dev_dbg(xpc_chan, "msg=0x%p, partid=%d, channel=%d\n", (void *)msg, |
1969 | partid, ch_number); | 1969 | partid, ch_number); |
@@ -1985,7 +1985,7 @@ xpc_pull_remote_msg(struct xpc_channel *ch, s64 get) | |||
1985 | struct xpc_msg *remote_msg, *msg; | 1985 | struct xpc_msg *remote_msg, *msg; |
1986 | u32 msg_index, nmsgs; | 1986 | u32 msg_index, nmsgs; |
1987 | u64 msg_offset; | 1987 | u64 msg_offset; |
1988 | enum xpc_retval ret; | 1988 | enum xp_retval ret; |
1989 | 1989 | ||
1990 | if (mutex_lock_interruptible(&ch->msg_to_pull_mutex) != 0) { | 1990 | if (mutex_lock_interruptible(&ch->msg_to_pull_mutex) != 0) { |
1991 | /* we were interrupted by a signal */ | 1991 | /* we were interrupted by a signal */ |
@@ -2012,7 +2012,7 @@ xpc_pull_remote_msg(struct xpc_channel *ch, s64 get) | |||
2012 | 2012 | ||
2013 | ret = xpc_pull_remote_cachelines(part, msg, remote_msg, | 2013 | ret = xpc_pull_remote_cachelines(part, msg, remote_msg, |
2014 | nmsgs * ch->msg_size); | 2014 | nmsgs * ch->msg_size); |
2015 | if (ret != xpcSuccess) { | 2015 | if (ret != xpSuccess) { |
2016 | 2016 | ||
2017 | dev_dbg(xpc_chan, "failed to pull %d msgs starting with" | 2017 | dev_dbg(xpc_chan, "failed to pull %d msgs starting with" |
2018 | " msg %ld from partition %d, channel=%d, " | 2018 | " msg %ld from partition %d, channel=%d, " |
@@ -2112,7 +2112,7 @@ xpc_deliver_msg(struct xpc_channel *ch) | |||
2112 | ch->number); | 2112 | ch->number); |
2113 | 2113 | ||
2114 | /* deliver the message to its intended recipient */ | 2114 | /* deliver the message to its intended recipient */ |
2115 | ch->func(xpcMsgReceived, ch->partid, ch->number, | 2115 | ch->func(xpMsgReceived, ch->partid, ch->number, |
2116 | &msg->payload, ch->key); | 2116 | &msg->payload, ch->key); |
2117 | 2117 | ||
2118 | dev_dbg(xpc_chan, "ch->func() returned, msg=0x%p, " | 2118 | dev_dbg(xpc_chan, "ch->func() returned, msg=0x%p, " |
@@ -2203,7 +2203,7 @@ xpc_acknowledge_msgs(struct xpc_channel *ch, s64 initial_get, u8 msg_flags) | |||
2203 | * xpc_initiate_allocate(). | 2203 | * xpc_initiate_allocate(). |
2204 | */ | 2204 | */ |
2205 | void | 2205 | void |
2206 | xpc_initiate_received(partid_t partid, int ch_number, void *payload) | 2206 | xpc_initiate_received(short partid, int ch_number, void *payload) |
2207 | { | 2207 | { |
2208 | struct xpc_partition *part = &xpc_partitions[partid]; | 2208 | struct xpc_partition *part = &xpc_partitions[partid]; |
2209 | struct xpc_channel *ch; | 2209 | struct xpc_channel *ch; |
diff --git a/drivers/misc/sgi-xp/xpc_main.c b/drivers/misc/sgi-xp/xpc_main.c index f673ba90eb0e..08256ed0d9a6 100644 --- a/drivers/misc/sgi-xp/xpc_main.c +++ b/drivers/misc/sgi-xp/xpc_main.c | |||
@@ -315,13 +315,13 @@ xpc_initiate_discovery(void *ignore) | |||
315 | * the XPC per partition variables from the remote partition and waiting for | 315 | * the XPC per partition variables from the remote partition and waiting for |
316 | * the remote partition to pull ours. | 316 | * the remote partition to pull ours. |
317 | */ | 317 | */ |
318 | static enum xpc_retval | 318 | static enum xp_retval |
319 | xpc_make_first_contact(struct xpc_partition *part) | 319 | xpc_make_first_contact(struct xpc_partition *part) |
320 | { | 320 | { |
321 | enum xpc_retval ret; | 321 | enum xp_retval ret; |
322 | 322 | ||
323 | while ((ret = xpc_pull_remote_vars_part(part)) != xpcSuccess) { | 323 | while ((ret = xpc_pull_remote_vars_part(part)) != xpSuccess) { |
324 | if (ret != xpcRetry) { | 324 | if (ret != xpRetry) { |
325 | XPC_DEACTIVATE_PARTITION(part, ret); | 325 | XPC_DEACTIVATE_PARTITION(part, ret); |
326 | return ret; | 326 | return ret; |
327 | } | 327 | } |
@@ -406,7 +406,7 @@ xpc_partition_up(struct xpc_partition *part) | |||
406 | 406 | ||
407 | dev_dbg(xpc_chan, "activating partition %d\n", XPC_PARTID(part)); | 407 | dev_dbg(xpc_chan, "activating partition %d\n", XPC_PARTID(part)); |
408 | 408 | ||
409 | if (xpc_setup_infrastructure(part) != xpcSuccess) | 409 | if (xpc_setup_infrastructure(part) != xpSuccess) |
410 | return; | 410 | return; |
411 | 411 | ||
412 | /* | 412 | /* |
@@ -418,7 +418,7 @@ xpc_partition_up(struct xpc_partition *part) | |||
418 | 418 | ||
419 | (void)xpc_part_ref(part); /* this will always succeed */ | 419 | (void)xpc_part_ref(part); /* this will always succeed */ |
420 | 420 | ||
421 | if (xpc_make_first_contact(part) == xpcSuccess) | 421 | if (xpc_make_first_contact(part) == xpSuccess) |
422 | xpc_channel_mgr(part); | 422 | xpc_channel_mgr(part); |
423 | 423 | ||
424 | xpc_part_deref(part); | 424 | xpc_part_deref(part); |
@@ -429,7 +429,7 @@ xpc_partition_up(struct xpc_partition *part) | |||
429 | static int | 429 | static int |
430 | xpc_activating(void *__partid) | 430 | xpc_activating(void *__partid) |
431 | { | 431 | { |
432 | partid_t partid = (u64)__partid; | 432 | short partid = (u64)__partid; |
433 | struct xpc_partition *part = &xpc_partitions[partid]; | 433 | struct xpc_partition *part = &xpc_partitions[partid]; |
434 | unsigned long irq_flags; | 434 | unsigned long irq_flags; |
435 | 435 | ||
@@ -470,7 +470,7 @@ xpc_activating(void *__partid) | |||
470 | 470 | ||
471 | spin_lock_irqsave(&part->act_lock, irq_flags); | 471 | spin_lock_irqsave(&part->act_lock, irq_flags); |
472 | part->act_state = XPC_P_INACTIVE; | 472 | part->act_state = XPC_P_INACTIVE; |
473 | XPC_SET_REASON(part, xpcPhysAddrRegFailed, __LINE__); | 473 | XPC_SET_REASON(part, xpPhysAddrRegFailed, __LINE__); |
474 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 474 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
475 | part->remote_rp_pa = 0; | 475 | part->remote_rp_pa = 0; |
476 | return 0; | 476 | return 0; |
@@ -488,7 +488,7 @@ xpc_activating(void *__partid) | |||
488 | xpc_disallow_hb(partid, xpc_vars); | 488 | xpc_disallow_hb(partid, xpc_vars); |
489 | xpc_mark_partition_inactive(part); | 489 | xpc_mark_partition_inactive(part); |
490 | 490 | ||
491 | if (part->reason == xpcReactivating) { | 491 | if (part->reason == xpReactivating) { |
492 | /* interrupting ourselves results in activating partition */ | 492 | /* interrupting ourselves results in activating partition */ |
493 | xpc_IPI_send_reactivate(part); | 493 | xpc_IPI_send_reactivate(part); |
494 | } | 494 | } |
@@ -499,7 +499,7 @@ xpc_activating(void *__partid) | |||
499 | void | 499 | void |
500 | xpc_activate_partition(struct xpc_partition *part) | 500 | xpc_activate_partition(struct xpc_partition *part) |
501 | { | 501 | { |
502 | partid_t partid = XPC_PARTID(part); | 502 | short partid = XPC_PARTID(part); |
503 | unsigned long irq_flags; | 503 | unsigned long irq_flags; |
504 | struct task_struct *kthread; | 504 | struct task_struct *kthread; |
505 | 505 | ||
@@ -508,7 +508,7 @@ xpc_activate_partition(struct xpc_partition *part) | |||
508 | DBUG_ON(part->act_state != XPC_P_INACTIVE); | 508 | DBUG_ON(part->act_state != XPC_P_INACTIVE); |
509 | 509 | ||
510 | part->act_state = XPC_P_ACTIVATION_REQ; | 510 | part->act_state = XPC_P_ACTIVATION_REQ; |
511 | XPC_SET_REASON(part, xpcCloneKThread, __LINE__); | 511 | XPC_SET_REASON(part, xpCloneKThread, __LINE__); |
512 | 512 | ||
513 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 513 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
514 | 514 | ||
@@ -517,7 +517,7 @@ xpc_activate_partition(struct xpc_partition *part) | |||
517 | if (IS_ERR(kthread)) { | 517 | if (IS_ERR(kthread)) { |
518 | spin_lock_irqsave(&part->act_lock, irq_flags); | 518 | spin_lock_irqsave(&part->act_lock, irq_flags); |
519 | part->act_state = XPC_P_INACTIVE; | 519 | part->act_state = XPC_P_INACTIVE; |
520 | XPC_SET_REASON(part, xpcCloneKThreadFailed, __LINE__); | 520 | XPC_SET_REASON(part, xpCloneKThreadFailed, __LINE__); |
521 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 521 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
522 | } | 522 | } |
523 | } | 523 | } |
@@ -541,7 +541,7 @@ xpc_activate_partition(struct xpc_partition *part) | |||
541 | irqreturn_t | 541 | irqreturn_t |
542 | xpc_notify_IRQ_handler(int irq, void *dev_id) | 542 | xpc_notify_IRQ_handler(int irq, void *dev_id) |
543 | { | 543 | { |
544 | partid_t partid = (partid_t) (u64)dev_id; | 544 | short partid = (short)(u64)dev_id; |
545 | struct xpc_partition *part = &xpc_partitions[partid]; | 545 | struct xpc_partition *part = &xpc_partitions[partid]; |
546 | 546 | ||
547 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); | 547 | DBUG_ON(partid <= 0 || partid >= XP_MAX_PARTITIONS); |
@@ -643,7 +643,7 @@ xpc_kthread_waitmsgs(struct xpc_partition *part, struct xpc_channel *ch) | |||
643 | static int | 643 | static int |
644 | xpc_kthread_start(void *args) | 644 | xpc_kthread_start(void *args) |
645 | { | 645 | { |
646 | partid_t partid = XPC_UNPACK_ARG1(args); | 646 | short partid = XPC_UNPACK_ARG1(args); |
647 | u16 ch_number = XPC_UNPACK_ARG2(args); | 647 | u16 ch_number = XPC_UNPACK_ARG2(args); |
648 | struct xpc_partition *part = &xpc_partitions[partid]; | 648 | struct xpc_partition *part = &xpc_partitions[partid]; |
649 | struct xpc_channel *ch; | 649 | struct xpc_channel *ch; |
@@ -696,7 +696,7 @@ xpc_kthread_start(void *args) | |||
696 | ch->flags |= XPC_C_DISCONNECTINGCALLOUT; | 696 | ch->flags |= XPC_C_DISCONNECTINGCALLOUT; |
697 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 697 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
698 | 698 | ||
699 | xpc_disconnect_callout(ch, xpcDisconnecting); | 699 | xpc_disconnect_callout(ch, xpDisconnecting); |
700 | 700 | ||
701 | spin_lock_irqsave(&ch->lock, irq_flags); | 701 | spin_lock_irqsave(&ch->lock, irq_flags); |
702 | ch->flags |= XPC_C_DISCONNECTINGCALLOUT_MADE; | 702 | ch->flags |= XPC_C_DISCONNECTINGCALLOUT_MADE; |
@@ -776,7 +776,7 @@ xpc_create_kthreads(struct xpc_channel *ch, int needed, | |||
776 | * then we'll deadlock if all other kthreads assigned | 776 | * then we'll deadlock if all other kthreads assigned |
777 | * to this channel are blocked in the channel's | 777 | * to this channel are blocked in the channel's |
778 | * registerer, because the only thing that will unblock | 778 | * registerer, because the only thing that will unblock |
779 | * them is the xpcDisconnecting callout that this | 779 | * them is the xpDisconnecting callout that this |
780 | * failed kthread_run() would have made. | 780 | * failed kthread_run() would have made. |
781 | */ | 781 | */ |
782 | 782 | ||
@@ -796,7 +796,7 @@ xpc_create_kthreads(struct xpc_channel *ch, int needed, | |||
796 | * to function. | 796 | * to function. |
797 | */ | 797 | */ |
798 | spin_lock_irqsave(&ch->lock, irq_flags); | 798 | spin_lock_irqsave(&ch->lock, irq_flags); |
799 | XPC_DISCONNECT_CHANNEL(ch, xpcLackOfResources, | 799 | XPC_DISCONNECT_CHANNEL(ch, xpLackOfResources, |
800 | &irq_flags); | 800 | &irq_flags); |
801 | spin_unlock_irqrestore(&ch->lock, irq_flags); | 801 | spin_unlock_irqrestore(&ch->lock, irq_flags); |
802 | } | 802 | } |
@@ -809,7 +809,7 @@ void | |||
809 | xpc_disconnect_wait(int ch_number) | 809 | xpc_disconnect_wait(int ch_number) |
810 | { | 810 | { |
811 | unsigned long irq_flags; | 811 | unsigned long irq_flags; |
812 | partid_t partid; | 812 | short partid; |
813 | struct xpc_partition *part; | 813 | struct xpc_partition *part; |
814 | struct xpc_channel *ch; | 814 | struct xpc_channel *ch; |
815 | int wakeup_channel_mgr; | 815 | int wakeup_channel_mgr; |
@@ -857,9 +857,9 @@ xpc_disconnect_wait(int ch_number) | |||
857 | } | 857 | } |
858 | 858 | ||
859 | static void | 859 | static void |
860 | xpc_do_exit(enum xpc_retval reason) | 860 | xpc_do_exit(enum xp_retval reason) |
861 | { | 861 | { |
862 | partid_t partid; | 862 | short partid; |
863 | int active_part_count, printed_waiting_msg = 0; | 863 | int active_part_count, printed_waiting_msg = 0; |
864 | struct xpc_partition *part; | 864 | struct xpc_partition *part; |
865 | unsigned long printmsg_time, disengage_request_timeout = 0; | 865 | unsigned long printmsg_time, disengage_request_timeout = 0; |
@@ -955,7 +955,7 @@ xpc_do_exit(enum xpc_retval reason) | |||
955 | del_timer_sync(&xpc_hb_timer); | 955 | del_timer_sync(&xpc_hb_timer); |
956 | DBUG_ON(xpc_vars->heartbeating_to_mask != 0); | 956 | DBUG_ON(xpc_vars->heartbeating_to_mask != 0); |
957 | 957 | ||
958 | if (reason == xpcUnloading) { | 958 | if (reason == xpUnloading) { |
959 | /* take ourselves off of the reboot_notifier_list */ | 959 | /* take ourselves off of the reboot_notifier_list */ |
960 | (void)unregister_reboot_notifier(&xpc_reboot_notifier); | 960 | (void)unregister_reboot_notifier(&xpc_reboot_notifier); |
961 | 961 | ||
@@ -981,20 +981,20 @@ xpc_do_exit(enum xpc_retval reason) | |||
981 | static int | 981 | static int |
982 | xpc_system_reboot(struct notifier_block *nb, unsigned long event, void *unused) | 982 | xpc_system_reboot(struct notifier_block *nb, unsigned long event, void *unused) |
983 | { | 983 | { |
984 | enum xpc_retval reason; | 984 | enum xp_retval reason; |
985 | 985 | ||
986 | switch (event) { | 986 | switch (event) { |
987 | case SYS_RESTART: | 987 | case SYS_RESTART: |
988 | reason = xpcSystemReboot; | 988 | reason = xpSystemReboot; |
989 | break; | 989 | break; |
990 | case SYS_HALT: | 990 | case SYS_HALT: |
991 | reason = xpcSystemHalt; | 991 | reason = xpSystemHalt; |
992 | break; | 992 | break; |
993 | case SYS_POWER_OFF: | 993 | case SYS_POWER_OFF: |
994 | reason = xpcSystemPoweroff; | 994 | reason = xpSystemPoweroff; |
995 | break; | 995 | break; |
996 | default: | 996 | default: |
997 | reason = xpcSystemGoingDown; | 997 | reason = xpSystemGoingDown; |
998 | } | 998 | } |
999 | 999 | ||
1000 | xpc_do_exit(reason); | 1000 | xpc_do_exit(reason); |
@@ -1008,7 +1008,7 @@ static void | |||
1008 | xpc_die_disengage(void) | 1008 | xpc_die_disengage(void) |
1009 | { | 1009 | { |
1010 | struct xpc_partition *part; | 1010 | struct xpc_partition *part; |
1011 | partid_t partid; | 1011 | short partid; |
1012 | unsigned long engaged; | 1012 | unsigned long engaged; |
1013 | long time, printmsg_time, disengage_request_timeout; | 1013 | long time, printmsg_time, disengage_request_timeout; |
1014 | 1014 | ||
@@ -1124,7 +1124,7 @@ int __init | |||
1124 | xpc_init(void) | 1124 | xpc_init(void) |
1125 | { | 1125 | { |
1126 | int ret; | 1126 | int ret; |
1127 | partid_t partid; | 1127 | short partid; |
1128 | struct xpc_partition *part; | 1128 | struct xpc_partition *part; |
1129 | struct task_struct *kthread; | 1129 | struct task_struct *kthread; |
1130 | size_t buf_size; | 1130 | size_t buf_size; |
@@ -1279,7 +1279,7 @@ xpc_init(void) | |||
1279 | /* mark this new thread as a non-starter */ | 1279 | /* mark this new thread as a non-starter */ |
1280 | complete(&xpc_discovery_exited); | 1280 | complete(&xpc_discovery_exited); |
1281 | 1281 | ||
1282 | xpc_do_exit(xpcUnloading); | 1282 | xpc_do_exit(xpUnloading); |
1283 | return -EBUSY; | 1283 | return -EBUSY; |
1284 | } | 1284 | } |
1285 | 1285 | ||
@@ -1297,7 +1297,7 @@ module_init(xpc_init); | |||
1297 | void __exit | 1297 | void __exit |
1298 | xpc_exit(void) | 1298 | xpc_exit(void) |
1299 | { | 1299 | { |
1300 | xpc_do_exit(xpcUnloading); | 1300 | xpc_do_exit(xpUnloading); |
1301 | } | 1301 | } |
1302 | 1302 | ||
1303 | module_exit(xpc_exit); | 1303 | module_exit(xpc_exit); |
diff --git a/drivers/misc/sgi-xp/xpc_partition.c b/drivers/misc/sgi-xp/xpc_partition.c index acd3fd4285d7..7dd4b5812c42 100644 --- a/drivers/misc/sgi-xp/xpc_partition.c +++ b/drivers/misc/sgi-xp/xpc_partition.c | |||
@@ -403,7 +403,7 @@ xpc_check_remote_hb(void) | |||
403 | { | 403 | { |
404 | struct xpc_vars *remote_vars; | 404 | struct xpc_vars *remote_vars; |
405 | struct xpc_partition *part; | 405 | struct xpc_partition *part; |
406 | partid_t partid; | 406 | short partid; |
407 | bte_result_t bres; | 407 | bte_result_t bres; |
408 | 408 | ||
409 | remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer; | 409 | remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer; |
@@ -444,7 +444,7 @@ xpc_check_remote_hb(void) | |||
444 | (remote_vars->heartbeat_offline == 0)) || | 444 | (remote_vars->heartbeat_offline == 0)) || |
445 | !xpc_hb_allowed(sn_partition_id, remote_vars)) { | 445 | !xpc_hb_allowed(sn_partition_id, remote_vars)) { |
446 | 446 | ||
447 | XPC_DEACTIVATE_PARTITION(part, xpcNoHeartbeat); | 447 | XPC_DEACTIVATE_PARTITION(part, xpNoHeartbeat); |
448 | continue; | 448 | continue; |
449 | } | 449 | } |
450 | 450 | ||
@@ -459,7 +459,7 @@ xpc_check_remote_hb(void) | |||
459 | * is large enough to contain a copy of their reserved page header and | 459 | * is large enough to contain a copy of their reserved page header and |
460 | * part_nasids mask. | 460 | * part_nasids mask. |
461 | */ | 461 | */ |
462 | static enum xpc_retval | 462 | static enum xp_retval |
463 | xpc_get_remote_rp(int nasid, u64 *discovered_nasids, | 463 | xpc_get_remote_rp(int nasid, u64 *discovered_nasids, |
464 | struct xpc_rsvd_page *remote_rp, u64 *remote_rp_pa) | 464 | struct xpc_rsvd_page *remote_rp, u64 *remote_rp_pa) |
465 | { | 465 | { |
@@ -469,7 +469,7 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids, | |||
469 | 469 | ||
470 | *remote_rp_pa = xpc_get_rsvd_page_pa(nasid); | 470 | *remote_rp_pa = xpc_get_rsvd_page_pa(nasid); |
471 | if (*remote_rp_pa == 0) | 471 | if (*remote_rp_pa == 0) |
472 | return xpcNoRsvdPageAddr; | 472 | return xpNoRsvdPageAddr; |
473 | 473 | ||
474 | /* pull over the reserved page header and part_nasids mask */ | 474 | /* pull over the reserved page header and part_nasids mask */ |
475 | bres = xp_bte_copy(*remote_rp_pa, (u64)remote_rp, | 475 | bres = xp_bte_copy(*remote_rp_pa, (u64)remote_rp, |
@@ -489,18 +489,18 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids, | |||
489 | 489 | ||
490 | if (remote_rp->partid < 1 || | 490 | if (remote_rp->partid < 1 || |
491 | remote_rp->partid > (XP_MAX_PARTITIONS - 1)) { | 491 | remote_rp->partid > (XP_MAX_PARTITIONS - 1)) { |
492 | return xpcInvalidPartid; | 492 | return xpInvalidPartid; |
493 | } | 493 | } |
494 | 494 | ||
495 | if (remote_rp->partid == sn_partition_id) | 495 | if (remote_rp->partid == sn_partition_id) |
496 | return xpcLocalPartid; | 496 | return xpLocalPartid; |
497 | 497 | ||
498 | if (XPC_VERSION_MAJOR(remote_rp->version) != | 498 | if (XPC_VERSION_MAJOR(remote_rp->version) != |
499 | XPC_VERSION_MAJOR(XPC_RP_VERSION)) { | 499 | XPC_VERSION_MAJOR(XPC_RP_VERSION)) { |
500 | return xpcBadVersion; | 500 | return xpBadVersion; |
501 | } | 501 | } |
502 | 502 | ||
503 | return xpcSuccess; | 503 | return xpSuccess; |
504 | } | 504 | } |
505 | 505 | ||
506 | /* | 506 | /* |
@@ -509,13 +509,13 @@ xpc_get_remote_rp(int nasid, u64 *discovered_nasids, | |||
509 | * remote_vars points to a buffer that is cacheline aligned for BTE copies and | 509 | * remote_vars points to a buffer that is cacheline aligned for BTE copies and |
510 | * assumed to be of size XPC_RP_VARS_SIZE. | 510 | * assumed to be of size XPC_RP_VARS_SIZE. |
511 | */ | 511 | */ |
512 | static enum xpc_retval | 512 | static enum xp_retval |
513 | xpc_get_remote_vars(u64 remote_vars_pa, struct xpc_vars *remote_vars) | 513 | xpc_get_remote_vars(u64 remote_vars_pa, struct xpc_vars *remote_vars) |
514 | { | 514 | { |
515 | int bres; | 515 | int bres; |
516 | 516 | ||
517 | if (remote_vars_pa == 0) | 517 | if (remote_vars_pa == 0) |
518 | return xpcVarsNotSet; | 518 | return xpVarsNotSet; |
519 | 519 | ||
520 | /* pull over the cross partition variables */ | 520 | /* pull over the cross partition variables */ |
521 | bres = xp_bte_copy(remote_vars_pa, (u64)remote_vars, XPC_RP_VARS_SIZE, | 521 | bres = xp_bte_copy(remote_vars_pa, (u64)remote_vars, XPC_RP_VARS_SIZE, |
@@ -525,10 +525,10 @@ xpc_get_remote_vars(u64 remote_vars_pa, struct xpc_vars *remote_vars) | |||
525 | 525 | ||
526 | if (XPC_VERSION_MAJOR(remote_vars->version) != | 526 | if (XPC_VERSION_MAJOR(remote_vars->version) != |
527 | XPC_VERSION_MAJOR(XPC_V_VERSION)) { | 527 | XPC_VERSION_MAJOR(XPC_V_VERSION)) { |
528 | return xpcBadVersion; | 528 | return xpBadVersion; |
529 | } | 529 | } |
530 | 530 | ||
531 | return xpcSuccess; | 531 | return xpSuccess; |
532 | } | 532 | } |
533 | 533 | ||
534 | /* | 534 | /* |
@@ -604,16 +604,16 @@ xpc_identify_act_IRQ_req(int nasid) | |||
604 | int reactivate = 0; | 604 | int reactivate = 0; |
605 | int stamp_diff; | 605 | int stamp_diff; |
606 | struct timespec remote_rp_stamp = { 0, 0 }; | 606 | struct timespec remote_rp_stamp = { 0, 0 }; |
607 | partid_t partid; | 607 | short partid; |
608 | struct xpc_partition *part; | 608 | struct xpc_partition *part; |
609 | enum xpc_retval ret; | 609 | enum xp_retval ret; |
610 | 610 | ||
611 | /* pull over the reserved page structure */ | 611 | /* pull over the reserved page structure */ |
612 | 612 | ||
613 | remote_rp = (struct xpc_rsvd_page *)xpc_remote_copy_buffer; | 613 | remote_rp = (struct xpc_rsvd_page *)xpc_remote_copy_buffer; |
614 | 614 | ||
615 | ret = xpc_get_remote_rp(nasid, NULL, remote_rp, &remote_rp_pa); | 615 | ret = xpc_get_remote_rp(nasid, NULL, remote_rp, &remote_rp_pa); |
616 | if (ret != xpcSuccess) { | 616 | if (ret != xpSuccess) { |
617 | dev_warn(xpc_part, "unable to get reserved page from nasid %d, " | 617 | dev_warn(xpc_part, "unable to get reserved page from nasid %d, " |
618 | "which sent interrupt, reason=%d\n", nasid, ret); | 618 | "which sent interrupt, reason=%d\n", nasid, ret); |
619 | return; | 619 | return; |
@@ -632,7 +632,7 @@ xpc_identify_act_IRQ_req(int nasid) | |||
632 | remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer; | 632 | remote_vars = (struct xpc_vars *)xpc_remote_copy_buffer; |
633 | 633 | ||
634 | ret = xpc_get_remote_vars(remote_vars_pa, remote_vars); | 634 | ret = xpc_get_remote_vars(remote_vars_pa, remote_vars); |
635 | if (ret != xpcSuccess) { | 635 | if (ret != xpSuccess) { |
636 | 636 | ||
637 | dev_warn(xpc_part, "unable to get XPC variables from nasid %d, " | 637 | dev_warn(xpc_part, "unable to get XPC variables from nasid %d, " |
638 | "which sent interrupt, reason=%d\n", nasid, ret); | 638 | "which sent interrupt, reason=%d\n", nasid, ret); |
@@ -699,7 +699,7 @@ xpc_identify_act_IRQ_req(int nasid) | |||
699 | &remote_rp_stamp, remote_rp_pa, | 699 | &remote_rp_stamp, remote_rp_pa, |
700 | remote_vars_pa, remote_vars); | 700 | remote_vars_pa, remote_vars); |
701 | part->reactivate_nasid = nasid; | 701 | part->reactivate_nasid = nasid; |
702 | XPC_DEACTIVATE_PARTITION(part, xpcReactivating); | 702 | XPC_DEACTIVATE_PARTITION(part, xpReactivating); |
703 | return; | 703 | return; |
704 | } | 704 | } |
705 | 705 | ||
@@ -754,11 +754,11 @@ xpc_identify_act_IRQ_req(int nasid) | |||
754 | 754 | ||
755 | if (reactivate) { | 755 | if (reactivate) { |
756 | part->reactivate_nasid = nasid; | 756 | part->reactivate_nasid = nasid; |
757 | XPC_DEACTIVATE_PARTITION(part, xpcReactivating); | 757 | XPC_DEACTIVATE_PARTITION(part, xpReactivating); |
758 | 758 | ||
759 | } else if (XPC_SUPPORTS_DISENGAGE_REQUEST(part->remote_vars_version) && | 759 | } else if (XPC_SUPPORTS_DISENGAGE_REQUEST(part->remote_vars_version) && |
760 | xpc_partition_disengage_requested(1UL << partid)) { | 760 | xpc_partition_disengage_requested(1UL << partid)) { |
761 | XPC_DEACTIVATE_PARTITION(part, xpcOtherGoingDown); | 761 | XPC_DEACTIVATE_PARTITION(part, xpOtherGoingDown); |
762 | } | 762 | } |
763 | } | 763 | } |
764 | 764 | ||
@@ -825,7 +825,7 @@ xpc_identify_act_IRQ_sender(void) | |||
825 | int | 825 | int |
826 | xpc_partition_disengaged(struct xpc_partition *part) | 826 | xpc_partition_disengaged(struct xpc_partition *part) |
827 | { | 827 | { |
828 | partid_t partid = XPC_PARTID(part); | 828 | short partid = XPC_PARTID(part); |
829 | int disengaged; | 829 | int disengaged; |
830 | 830 | ||
831 | disengaged = (xpc_partition_engaged(1UL << partid) == 0); | 831 | disengaged = (xpc_partition_engaged(1UL << partid) == 0); |
@@ -870,20 +870,20 @@ xpc_partition_disengaged(struct xpc_partition *part) | |||
870 | /* | 870 | /* |
871 | * Mark specified partition as active. | 871 | * Mark specified partition as active. |
872 | */ | 872 | */ |
873 | enum xpc_retval | 873 | enum xp_retval |
874 | xpc_mark_partition_active(struct xpc_partition *part) | 874 | xpc_mark_partition_active(struct xpc_partition *part) |
875 | { | 875 | { |
876 | unsigned long irq_flags; | 876 | unsigned long irq_flags; |
877 | enum xpc_retval ret; | 877 | enum xp_retval ret; |
878 | 878 | ||
879 | dev_dbg(xpc_part, "setting partition %d to ACTIVE\n", XPC_PARTID(part)); | 879 | dev_dbg(xpc_part, "setting partition %d to ACTIVE\n", XPC_PARTID(part)); |
880 | 880 | ||
881 | spin_lock_irqsave(&part->act_lock, irq_flags); | 881 | spin_lock_irqsave(&part->act_lock, irq_flags); |
882 | if (part->act_state == XPC_P_ACTIVATING) { | 882 | if (part->act_state == XPC_P_ACTIVATING) { |
883 | part->act_state = XPC_P_ACTIVE; | 883 | part->act_state = XPC_P_ACTIVE; |
884 | ret = xpcSuccess; | 884 | ret = xpSuccess; |
885 | } else { | 885 | } else { |
886 | DBUG_ON(part->reason == xpcSuccess); | 886 | DBUG_ON(part->reason == xpSuccess); |
887 | ret = part->reason; | 887 | ret = part->reason; |
888 | } | 888 | } |
889 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 889 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
@@ -896,7 +896,7 @@ xpc_mark_partition_active(struct xpc_partition *part) | |||
896 | */ | 896 | */ |
897 | void | 897 | void |
898 | xpc_deactivate_partition(const int line, struct xpc_partition *part, | 898 | xpc_deactivate_partition(const int line, struct xpc_partition *part, |
899 | enum xpc_retval reason) | 899 | enum xp_retval reason) |
900 | { | 900 | { |
901 | unsigned long irq_flags; | 901 | unsigned long irq_flags; |
902 | 902 | ||
@@ -905,15 +905,15 @@ xpc_deactivate_partition(const int line, struct xpc_partition *part, | |||
905 | if (part->act_state == XPC_P_INACTIVE) { | 905 | if (part->act_state == XPC_P_INACTIVE) { |
906 | XPC_SET_REASON(part, reason, line); | 906 | XPC_SET_REASON(part, reason, line); |
907 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 907 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
908 | if (reason == xpcReactivating) { | 908 | if (reason == xpReactivating) { |
909 | /* we interrupt ourselves to reactivate partition */ | 909 | /* we interrupt ourselves to reactivate partition */ |
910 | xpc_IPI_send_reactivate(part); | 910 | xpc_IPI_send_reactivate(part); |
911 | } | 911 | } |
912 | return; | 912 | return; |
913 | } | 913 | } |
914 | if (part->act_state == XPC_P_DEACTIVATING) { | 914 | if (part->act_state == XPC_P_DEACTIVATING) { |
915 | if ((part->reason == xpcUnloading && reason != xpcUnloading) || | 915 | if ((part->reason == xpUnloading && reason != xpUnloading) || |
916 | reason == xpcReactivating) { | 916 | reason == xpReactivating) { |
917 | XPC_SET_REASON(part, reason, line); | 917 | XPC_SET_REASON(part, reason, line); |
918 | } | 918 | } |
919 | spin_unlock_irqrestore(&part->act_lock, irq_flags); | 919 | spin_unlock_irqrestore(&part->act_lock, irq_flags); |
@@ -982,10 +982,10 @@ xpc_discovery(void) | |||
982 | int max_regions; | 982 | int max_regions; |
983 | int nasid; | 983 | int nasid; |
984 | struct xpc_rsvd_page *rp; | 984 | struct xpc_rsvd_page *rp; |
985 | partid_t partid; | 985 | short partid; |
986 | struct xpc_partition *part; | 986 | struct xpc_partition *part; |
987 | u64 *discovered_nasids; | 987 | u64 *discovered_nasids; |
988 | enum xpc_retval ret; | 988 | enum xp_retval ret; |
989 | 989 | ||
990 | remote_rp = xpc_kmalloc_cacheline_aligned(XPC_RP_HEADER_SIZE + | 990 | remote_rp = xpc_kmalloc_cacheline_aligned(XPC_RP_HEADER_SIZE + |
991 | xp_nasid_mask_bytes, | 991 | xp_nasid_mask_bytes, |
@@ -1063,12 +1063,12 @@ xpc_discovery(void) | |||
1063 | 1063 | ||
1064 | ret = xpc_get_remote_rp(nasid, discovered_nasids, | 1064 | ret = xpc_get_remote_rp(nasid, discovered_nasids, |
1065 | remote_rp, &remote_rp_pa); | 1065 | remote_rp, &remote_rp_pa); |
1066 | if (ret != xpcSuccess) { | 1066 | if (ret != xpSuccess) { |
1067 | dev_dbg(xpc_part, "unable to get reserved page " | 1067 | dev_dbg(xpc_part, "unable to get reserved page " |
1068 | "from nasid %d, reason=%d\n", nasid, | 1068 | "from nasid %d, reason=%d\n", nasid, |
1069 | ret); | 1069 | ret); |
1070 | 1070 | ||
1071 | if (ret == xpcLocalPartid) | 1071 | if (ret == xpLocalPartid) |
1072 | break; | 1072 | break; |
1073 | 1073 | ||
1074 | continue; | 1074 | continue; |
@@ -1082,7 +1082,7 @@ xpc_discovery(void) | |||
1082 | /* pull over the cross partition variables */ | 1082 | /* pull over the cross partition variables */ |
1083 | 1083 | ||
1084 | ret = xpc_get_remote_vars(remote_vars_pa, remote_vars); | 1084 | ret = xpc_get_remote_vars(remote_vars_pa, remote_vars); |
1085 | if (ret != xpcSuccess) { | 1085 | if (ret != xpSuccess) { |
1086 | dev_dbg(xpc_part, "unable to get XPC variables " | 1086 | dev_dbg(xpc_part, "unable to get XPC variables " |
1087 | "from nasid %d, reason=%d\n", nasid, | 1087 | "from nasid %d, reason=%d\n", nasid, |
1088 | ret); | 1088 | ret); |
@@ -1116,7 +1116,7 @@ xpc_discovery(void) | |||
1116 | "register xp_addr region 0x%016lx\n", | 1116 | "register xp_addr region 0x%016lx\n", |
1117 | partid, remote_vars->amos_page_pa); | 1117 | partid, remote_vars->amos_page_pa); |
1118 | 1118 | ||
1119 | XPC_SET_REASON(part, xpcPhysAddrRegFailed, | 1119 | XPC_SET_REASON(part, xpPhysAddrRegFailed, |
1120 | __LINE__); | 1120 | __LINE__); |
1121 | break; | 1121 | break; |
1122 | } | 1122 | } |
@@ -1151,8 +1151,8 @@ xpc_discovery(void) | |||
1151 | * Given a partid, get the nasids owned by that partition from the | 1151 | * Given a partid, get the nasids owned by that partition from the |
1152 | * remote partition's reserved page. | 1152 | * remote partition's reserved page. |
1153 | */ | 1153 | */ |
1154 | enum xpc_retval | 1154 | enum xp_retval |
1155 | xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask) | 1155 | xpc_initiate_partid_to_nasids(short partid, void *nasid_mask) |
1156 | { | 1156 | { |
1157 | struct xpc_partition *part; | 1157 | struct xpc_partition *part; |
1158 | u64 part_nasid_pa; | 1158 | u64 part_nasid_pa; |
@@ -1160,7 +1160,7 @@ xpc_initiate_partid_to_nasids(partid_t partid, void *nasid_mask) | |||
1160 | 1160 | ||
1161 | part = &xpc_partitions[partid]; | 1161 | part = &xpc_partitions[partid]; |
1162 | if (part->remote_rp_pa == 0) | 1162 | if (part->remote_rp_pa == 0) |
1163 | return xpcPartitionDown; | 1163 | return xpPartitionDown; |
1164 | 1164 | ||
1165 | memset(nasid_mask, 0, XP_NASID_MASK_BYTES); | 1165 | memset(nasid_mask, 0, XP_NASID_MASK_BYTES); |
1166 | 1166 | ||
diff --git a/drivers/misc/sgi-xp/xpnet.c b/drivers/misc/sgi-xp/xpnet.c index a9543c65814d..822dc8e8d7f0 100644 --- a/drivers/misc/sgi-xp/xpnet.c +++ b/drivers/misc/sgi-xp/xpnet.c | |||
@@ -166,7 +166,7 @@ struct device *xpnet = &xpnet_dbg_subname; | |||
166 | * Packet was recevied by XPC and forwarded to us. | 166 | * Packet was recevied by XPC and forwarded to us. |
167 | */ | 167 | */ |
168 | static void | 168 | static void |
169 | xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | 169 | xpnet_receive(short partid, int channel, struct xpnet_message *msg) |
170 | { | 170 | { |
171 | struct sk_buff *skb; | 171 | struct sk_buff *skb; |
172 | bte_result_t bret; | 172 | bte_result_t bret; |
@@ -282,7 +282,7 @@ xpnet_receive(partid_t partid, int channel, struct xpnet_message *msg) | |||
282 | * state or message reception on a connection. | 282 | * state or message reception on a connection. |
283 | */ | 283 | */ |
284 | static void | 284 | static void |
285 | xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | 285 | xpnet_connection_activity(enum xp_retval reason, short partid, int channel, |
286 | void *data, void *key) | 286 | void *data, void *key) |
287 | { | 287 | { |
288 | long bp; | 288 | long bp; |
@@ -291,13 +291,13 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | |||
291 | DBUG_ON(channel != XPC_NET_CHANNEL); | 291 | DBUG_ON(channel != XPC_NET_CHANNEL); |
292 | 292 | ||
293 | switch (reason) { | 293 | switch (reason) { |
294 | case xpcMsgReceived: /* message received */ | 294 | case xpMsgReceived: /* message received */ |
295 | DBUG_ON(data == NULL); | 295 | DBUG_ON(data == NULL); |
296 | 296 | ||
297 | xpnet_receive(partid, channel, (struct xpnet_message *)data); | 297 | xpnet_receive(partid, channel, (struct xpnet_message *)data); |
298 | break; | 298 | break; |
299 | 299 | ||
300 | case xpcConnected: /* connection completed to a partition */ | 300 | case xpConnected: /* connection completed to a partition */ |
301 | spin_lock_bh(&xpnet_broadcast_lock); | 301 | spin_lock_bh(&xpnet_broadcast_lock); |
302 | xpnet_broadcast_partitions |= 1UL << (partid - 1); | 302 | xpnet_broadcast_partitions |= 1UL << (partid - 1); |
303 | bp = xpnet_broadcast_partitions; | 303 | bp = xpnet_broadcast_partitions; |
@@ -330,7 +330,7 @@ xpnet_connection_activity(enum xpc_retval reason, partid_t partid, int channel, | |||
330 | static int | 330 | static int |
331 | xpnet_dev_open(struct net_device *dev) | 331 | xpnet_dev_open(struct net_device *dev) |
332 | { | 332 | { |
333 | enum xpc_retval ret; | 333 | enum xp_retval ret; |
334 | 334 | ||
335 | dev_dbg(xpnet, "calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, " | 335 | dev_dbg(xpnet, "calling xpc_connect(%d, 0x%p, NULL, %ld, %ld, %ld, " |
336 | "%ld)\n", XPC_NET_CHANNEL, xpnet_connection_activity, | 336 | "%ld)\n", XPC_NET_CHANNEL, xpnet_connection_activity, |
@@ -340,7 +340,7 @@ xpnet_dev_open(struct net_device *dev) | |||
340 | ret = xpc_connect(XPC_NET_CHANNEL, xpnet_connection_activity, NULL, | 340 | ret = xpc_connect(XPC_NET_CHANNEL, xpnet_connection_activity, NULL, |
341 | XPNET_MSG_SIZE, XPNET_MSG_NENTRIES, | 341 | XPNET_MSG_SIZE, XPNET_MSG_NENTRIES, |
342 | XPNET_MAX_KTHREADS, XPNET_MAX_IDLE_KTHREADS); | 342 | XPNET_MAX_KTHREADS, XPNET_MAX_IDLE_KTHREADS); |
343 | if (ret != xpcSuccess) { | 343 | if (ret != xpSuccess) { |
344 | dev_err(xpnet, "ifconfig up of %s failed on XPC connect, " | 344 | dev_err(xpnet, "ifconfig up of %s failed on XPC connect, " |
345 | "ret=%d\n", dev->name, ret); | 345 | "ret=%d\n", dev->name, ret); |
346 | 346 | ||
@@ -407,7 +407,7 @@ xpnet_dev_get_stats(struct net_device *dev) | |||
407 | * release the skb and then release our pending message structure. | 407 | * release the skb and then release our pending message structure. |
408 | */ | 408 | */ |
409 | static void | 409 | static void |
410 | xpnet_send_completed(enum xpc_retval reason, partid_t partid, int channel, | 410 | xpnet_send_completed(enum xp_retval reason, short partid, int channel, |
411 | void *__qm) | 411 | void *__qm) |
412 | { | 412 | { |
413 | struct xpnet_pending_msg *queued_msg = (struct xpnet_pending_msg *)__qm; | 413 | struct xpnet_pending_msg *queued_msg = (struct xpnet_pending_msg *)__qm; |
@@ -439,12 +439,12 @@ static int | |||
439 | xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | 439 | xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) |
440 | { | 440 | { |
441 | struct xpnet_pending_msg *queued_msg; | 441 | struct xpnet_pending_msg *queued_msg; |
442 | enum xpc_retval ret; | 442 | enum xp_retval ret; |
443 | struct xpnet_message *msg; | 443 | struct xpnet_message *msg; |
444 | u64 start_addr, end_addr; | 444 | u64 start_addr, end_addr; |
445 | long dp; | 445 | long dp; |
446 | u8 second_mac_octet; | 446 | u8 second_mac_octet; |
447 | partid_t dest_partid; | 447 | short dest_partid; |
448 | struct xpnet_dev_private *priv; | 448 | struct xpnet_dev_private *priv; |
449 | u16 embedded_bytes; | 449 | u16 embedded_bytes; |
450 | 450 | ||
@@ -528,7 +528,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
528 | 528 | ||
529 | ret = xpc_allocate(dest_partid, XPC_NET_CHANNEL, | 529 | ret = xpc_allocate(dest_partid, XPC_NET_CHANNEL, |
530 | XPC_NOWAIT, (void **)&msg); | 530 | XPC_NOWAIT, (void **)&msg); |
531 | if (unlikely(ret != xpcSuccess)) | 531 | if (unlikely(ret != xpSuccess)) |
532 | continue; | 532 | continue; |
533 | 533 | ||
534 | msg->embedded_bytes = embedded_bytes; | 534 | msg->embedded_bytes = embedded_bytes; |
@@ -557,7 +557,7 @@ xpnet_dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
557 | 557 | ||
558 | ret = xpc_send_notify(dest_partid, XPC_NET_CHANNEL, msg, | 558 | ret = xpc_send_notify(dest_partid, XPC_NET_CHANNEL, msg, |
559 | xpnet_send_completed, queued_msg); | 559 | xpnet_send_completed, queued_msg); |
560 | if (unlikely(ret != xpcSuccess)) { | 560 | if (unlikely(ret != xpSuccess)) { |
561 | atomic_dec(&queued_msg->use_count); | 561 | atomic_dec(&queued_msg->use_count); |
562 | continue; | 562 | continue; |
563 | } | 563 | } |
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c index 626ac083f4e0..da5fecad74d9 100644 --- a/drivers/mmc/host/mmci.c +++ b/drivers/mmc/host/mmci.c | |||
@@ -425,7 +425,7 @@ static void mmci_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
425 | host->cclk = host->mclk; | 425 | host->cclk = host->mclk; |
426 | } else { | 426 | } else { |
427 | clk = host->mclk / (2 * ios->clock) - 1; | 427 | clk = host->mclk / (2 * ios->clock) - 1; |
428 | if (clk > 256) | 428 | if (clk >= 256) |
429 | clk = 255; | 429 | clk = 255; |
430 | host->cclk = host->mclk / (2 * (clk + 1)); | 430 | host->cclk = host->mclk / (2 * (clk + 1)); |
431 | } | 431 | } |
@@ -512,6 +512,18 @@ static int mmci_probe(struct amba_device *dev, void *id) | |||
512 | 512 | ||
513 | host->plat = plat; | 513 | host->plat = plat; |
514 | host->mclk = clk_get_rate(host->clk); | 514 | host->mclk = clk_get_rate(host->clk); |
515 | /* | ||
516 | * According to the spec, mclk is max 100 MHz, | ||
517 | * so we try to adjust the clock down to this, | ||
518 | * (if possible). | ||
519 | */ | ||
520 | if (host->mclk > 100000000) { | ||
521 | ret = clk_set_rate(host->clk, 100000000); | ||
522 | if (ret < 0) | ||
523 | goto clk_disable; | ||
524 | host->mclk = clk_get_rate(host->clk); | ||
525 | DBG(host, "eventual mclk rate: %u Hz\n", host->mclk); | ||
526 | } | ||
515 | host->mmc = mmc; | 527 | host->mmc = mmc; |
516 | host->base = ioremap(dev->res.start, SZ_4K); | 528 | host->base = ioremap(dev->res.start, SZ_4K); |
517 | if (!host->base) { | 529 | if (!host->base) { |
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 7fb02e177a3d..299118de8933 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h | |||
@@ -187,7 +187,7 @@ struct sdhci_host { | |||
187 | struct mmc_request *mrq; /* Current request */ | 187 | struct mmc_request *mrq; /* Current request */ |
188 | struct mmc_command *cmd; /* Current command */ | 188 | struct mmc_command *cmd; /* Current command */ |
189 | struct mmc_data *data; /* Current data request */ | 189 | struct mmc_data *data; /* Current data request */ |
190 | int data_early:1; /* Data finished before cmd */ | 190 | unsigned int data_early:1; /* Data finished before cmd */ |
191 | 191 | ||
192 | struct scatterlist *cur_sg; /* We're working on this */ | 192 | struct scatterlist *cur_sg; /* We're working on this */ |
193 | int num_sg; /* Entries left */ | 193 | int num_sg; /* Entries left */ |
diff --git a/drivers/mtd/maps/Kconfig b/drivers/mtd/maps/Kconfig index 1bd69aa9e22a..17bc87a43ff4 100644 --- a/drivers/mtd/maps/Kconfig +++ b/drivers/mtd/maps/Kconfig | |||
@@ -374,7 +374,7 @@ config MTD_REDWOOD | |||
374 | 374 | ||
375 | config MTD_SOLUTIONENGINE | 375 | config MTD_SOLUTIONENGINE |
376 | tristate "CFI Flash device mapped on Hitachi SolutionEngine" | 376 | tristate "CFI Flash device mapped on Hitachi SolutionEngine" |
377 | depends on SUPERH && MTD_CFI && MTD_REDBOOT_PARTS | 377 | depends on SUPERH && SOLUTION_ENGINE && MTD_CFI && MTD_REDBOOT_PARTS |
378 | help | 378 | help |
379 | This enables access to the flash chips on the Hitachi SolutionEngine and | 379 | This enables access to the flash chips on the Hitachi SolutionEngine and |
380 | similar boards. Say 'Y' if you are building a kernel for such a board. | 380 | similar boards. Say 'Y' if you are building a kernel for such a board. |
@@ -480,13 +480,6 @@ config MTD_H720X | |||
480 | This enables access to the flash chips on the Hynix evaluation boards. | 480 | This enables access to the flash chips on the Hynix evaluation boards. |
481 | If you have such a board, say 'Y'. | 481 | If you have such a board, say 'Y'. |
482 | 482 | ||
483 | config MTD_MPC1211 | ||
484 | tristate "CFI Flash device mapped on Interface MPC-1211" | ||
485 | depends on SH_MPC1211 && MTD_CFI | ||
486 | help | ||
487 | This enables access to the flash chips on the Interface MPC-1211(CTP/PCI/MPC-SH02). | ||
488 | If you have such a board, say 'Y'. | ||
489 | |||
490 | config MTD_OMAP_NOR | 483 | config MTD_OMAP_NOR |
491 | tristate "TI OMAP board mappings" | 484 | tristate "TI OMAP board mappings" |
492 | depends on MTD_CFI && ARCH_OMAP | 485 | depends on MTD_CFI && ARCH_OMAP |
diff --git a/drivers/mtd/maps/Makefile b/drivers/mtd/maps/Makefile index a9cbe80f99a0..957fb5f70f5e 100644 --- a/drivers/mtd/maps/Makefile +++ b/drivers/mtd/maps/Makefile | |||
@@ -58,7 +58,6 @@ obj-$(CONFIG_MTD_WALNUT) += walnut.o | |||
58 | obj-$(CONFIG_MTD_H720X) += h720x-flash.o | 58 | obj-$(CONFIG_MTD_H720X) += h720x-flash.o |
59 | obj-$(CONFIG_MTD_SBC8240) += sbc8240.o | 59 | obj-$(CONFIG_MTD_SBC8240) += sbc8240.o |
60 | obj-$(CONFIG_MTD_NOR_TOTO) += omap-toto-flash.o | 60 | obj-$(CONFIG_MTD_NOR_TOTO) += omap-toto-flash.o |
61 | obj-$(CONFIG_MTD_MPC1211) += mpc1211.o | ||
62 | obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o | 61 | obj-$(CONFIG_MTD_IXP4XX) += ixp4xx.o |
63 | obj-$(CONFIG_MTD_IXP2000) += ixp2000.o | 62 | obj-$(CONFIG_MTD_IXP2000) += ixp2000.o |
64 | obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o | 63 | obj-$(CONFIG_MTD_WRSBC8260) += wr_sbc82xx_flash.o |
diff --git a/drivers/mtd/maps/mpc1211.c b/drivers/mtd/maps/mpc1211.c deleted file mode 100644 index 45a00fac88ac..000000000000 --- a/drivers/mtd/maps/mpc1211.c +++ /dev/null | |||
@@ -1,80 +0,0 @@ | |||
1 | /* | ||
2 | * Flash on MPC-1211 | ||
3 | * | ||
4 | * $Id: mpc1211.c,v 1.4 2004/09/16 23:27:13 gleixner Exp $ | ||
5 | * | ||
6 | * (C) 2002 Interface, Saito.K & Jeanne | ||
7 | * | ||
8 | * GPL'd | ||
9 | */ | ||
10 | |||
11 | #include <linux/module.h> | ||
12 | #include <linux/types.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <asm/io.h> | ||
15 | #include <linux/mtd/mtd.h> | ||
16 | #include <linux/mtd/map.h> | ||
17 | #include <linux/mtd/partitions.h> | ||
18 | |||
19 | static struct mtd_info *flash_mtd; | ||
20 | static struct mtd_partition *parsed_parts; | ||
21 | |||
22 | struct map_info mpc1211_flash_map = { | ||
23 | .name = "MPC-1211 FLASH", | ||
24 | .size = 0x80000, | ||
25 | .bankwidth = 1, | ||
26 | }; | ||
27 | |||
28 | static struct mtd_partition mpc1211_partitions[] = { | ||
29 | { | ||
30 | .name = "IPL & ETH-BOOT", | ||
31 | .offset = 0x00000000, | ||
32 | .size = 0x10000, | ||
33 | }, | ||
34 | { | ||
35 | .name = "Flash FS", | ||
36 | .offset = 0x00010000, | ||
37 | .size = MTDPART_SIZ_FULL, | ||
38 | } | ||
39 | }; | ||
40 | |||
41 | static int __init init_mpc1211_maps(void) | ||
42 | { | ||
43 | int nr_parts; | ||
44 | |||
45 | mpc1211_flash_map.phys = 0; | ||
46 | mpc1211_flash_map.virt = (void __iomem *)P2SEGADDR(0); | ||
47 | |||
48 | simple_map_init(&mpc1211_flash_map); | ||
49 | |||
50 | printk(KERN_NOTICE "Probing for flash chips at 0x00000000:\n"); | ||
51 | flash_mtd = do_map_probe("jedec_probe", &mpc1211_flash_map); | ||
52 | if (!flash_mtd) { | ||
53 | printk(KERN_NOTICE "Flash chips not detected at either possible location.\n"); | ||
54 | return -ENXIO; | ||
55 | } | ||
56 | printk(KERN_NOTICE "MPC-1211: Flash at 0x%08lx\n", mpc1211_flash_map.virt & 0x1fffffff); | ||
57 | flash_mtd->module = THIS_MODULE; | ||
58 | |||
59 | parsed_parts = mpc1211_partitions; | ||
60 | nr_parts = ARRAY_SIZE(mpc1211_partitions); | ||
61 | |||
62 | add_mtd_partitions(flash_mtd, parsed_parts, nr_parts); | ||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static void __exit cleanup_mpc1211_maps(void) | ||
67 | { | ||
68 | if (parsed_parts) | ||
69 | del_mtd_partitions(flash_mtd); | ||
70 | else | ||
71 | del_mtd_device(flash_mtd); | ||
72 | map_destroy(flash_mtd); | ||
73 | } | ||
74 | |||
75 | module_init(init_mpc1211_maps); | ||
76 | module_exit(cleanup_mpc1211_maps); | ||
77 | |||
78 | MODULE_LICENSE("GPL"); | ||
79 | MODULE_AUTHOR("Saito.K & Jeanne <ksaito@interface.co.jp>"); | ||
80 | MODULE_DESCRIPTION("MTD map driver for MPC-1211 boards. Interface"); | ||
diff --git a/drivers/net/3c59x.c b/drivers/net/3c59x.c index 6f8e7d4cf74d..2edda8cc7f99 100644 --- a/drivers/net/3c59x.c +++ b/drivers/net/3c59x.c | |||
@@ -319,7 +319,7 @@ static struct vortex_chip_info { | |||
319 | {"3c920B-EMB-WNM (ATI Radeon 9100 IGP)", | 319 | {"3c920B-EMB-WNM (ATI Radeon 9100 IGP)", |
320 | PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, | 320 | PCI_USES_MASTER, IS_TORNADO|HAS_MII|HAS_HWCKSM, 128, }, |
321 | {"3c980 Cyclone", | 321 | {"3c980 Cyclone", |
322 | PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM, 128, }, | 322 | PCI_USES_MASTER, IS_CYCLONE|HAS_HWCKSM|EXTRA_PREAMBLE, 128, }, |
323 | 323 | ||
324 | {"3c980C Python-T", | 324 | {"3c980C Python-T", |
325 | PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, | 325 | PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_HWCKSM, 128, }, |
@@ -600,7 +600,6 @@ struct vortex_private { | |||
600 | struct sk_buff* tx_skbuff[TX_RING_SIZE]; | 600 | struct sk_buff* tx_skbuff[TX_RING_SIZE]; |
601 | unsigned int cur_rx, cur_tx; /* The next free ring entry */ | 601 | unsigned int cur_rx, cur_tx; /* The next free ring entry */ |
602 | unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ | 602 | unsigned int dirty_rx, dirty_tx; /* The ring entries to be free()ed. */ |
603 | struct net_device_stats stats; /* Generic stats */ | ||
604 | struct vortex_extra_stats xstats; /* NIC-specific extra stats */ | 603 | struct vortex_extra_stats xstats; /* NIC-specific extra stats */ |
605 | struct sk_buff *tx_skb; /* Packet being eaten by bus master ctrl. */ | 604 | struct sk_buff *tx_skb; /* Packet being eaten by bus master ctrl. */ |
606 | dma_addr_t tx_skb_dma; /* Allocated DMA address for bus master ctrl DMA. */ | 605 | dma_addr_t tx_skb_dma; /* Allocated DMA address for bus master ctrl DMA. */ |
@@ -1875,7 +1874,7 @@ static void vortex_tx_timeout(struct net_device *dev) | |||
1875 | 1874 | ||
1876 | issue_and_wait(dev, TxReset); | 1875 | issue_and_wait(dev, TxReset); |
1877 | 1876 | ||
1878 | vp->stats.tx_errors++; | 1877 | dev->stats.tx_errors++; |
1879 | if (vp->full_bus_master_tx) { | 1878 | if (vp->full_bus_master_tx) { |
1880 | printk(KERN_DEBUG "%s: Resetting the Tx ring pointer.\n", dev->name); | 1879 | printk(KERN_DEBUG "%s: Resetting the Tx ring pointer.\n", dev->name); |
1881 | if (vp->cur_tx - vp->dirty_tx > 0 && ioread32(ioaddr + DownListPtr) == 0) | 1880 | if (vp->cur_tx - vp->dirty_tx > 0 && ioread32(ioaddr + DownListPtr) == 0) |
@@ -1887,7 +1886,7 @@ static void vortex_tx_timeout(struct net_device *dev) | |||
1887 | iowrite8(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); | 1886 | iowrite8(PKT_BUF_SZ>>8, ioaddr + TxFreeThreshold); |
1888 | iowrite16(DownUnstall, ioaddr + EL3_CMD); | 1887 | iowrite16(DownUnstall, ioaddr + EL3_CMD); |
1889 | } else { | 1888 | } else { |
1890 | vp->stats.tx_dropped++; | 1889 | dev->stats.tx_dropped++; |
1891 | netif_wake_queue(dev); | 1890 | netif_wake_queue(dev); |
1892 | } | 1891 | } |
1893 | 1892 | ||
@@ -1928,8 +1927,8 @@ vortex_error(struct net_device *dev, int status) | |||
1928 | } | 1927 | } |
1929 | dump_tx_ring(dev); | 1928 | dump_tx_ring(dev); |
1930 | } | 1929 | } |
1931 | if (tx_status & 0x14) vp->stats.tx_fifo_errors++; | 1930 | if (tx_status & 0x14) dev->stats.tx_fifo_errors++; |
1932 | if (tx_status & 0x38) vp->stats.tx_aborted_errors++; | 1931 | if (tx_status & 0x38) dev->stats.tx_aborted_errors++; |
1933 | if (tx_status & 0x08) vp->xstats.tx_max_collisions++; | 1932 | if (tx_status & 0x08) vp->xstats.tx_max_collisions++; |
1934 | iowrite8(0, ioaddr + TxStatus); | 1933 | iowrite8(0, ioaddr + TxStatus); |
1935 | if (tx_status & 0x30) { /* txJabber or txUnderrun */ | 1934 | if (tx_status & 0x30) { /* txJabber or txUnderrun */ |
@@ -2051,8 +2050,8 @@ vortex_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2051 | if (vortex_debug > 2) | 2050 | if (vortex_debug > 2) |
2052 | printk(KERN_DEBUG "%s: Tx error, status %2.2x.\n", | 2051 | printk(KERN_DEBUG "%s: Tx error, status %2.2x.\n", |
2053 | dev->name, tx_status); | 2052 | dev->name, tx_status); |
2054 | if (tx_status & 0x04) vp->stats.tx_fifo_errors++; | 2053 | if (tx_status & 0x04) dev->stats.tx_fifo_errors++; |
2055 | if (tx_status & 0x38) vp->stats.tx_aborted_errors++; | 2054 | if (tx_status & 0x38) dev->stats.tx_aborted_errors++; |
2056 | if (tx_status & 0x30) { | 2055 | if (tx_status & 0x30) { |
2057 | issue_and_wait(dev, TxReset); | 2056 | issue_and_wait(dev, TxReset); |
2058 | } | 2057 | } |
@@ -2350,7 +2349,7 @@ boomerang_interrupt(int irq, void *dev_id) | |||
2350 | } else { | 2349 | } else { |
2351 | printk(KERN_DEBUG "boomerang_interrupt: no skb!\n"); | 2350 | printk(KERN_DEBUG "boomerang_interrupt: no skb!\n"); |
2352 | } | 2351 | } |
2353 | /* vp->stats.tx_packets++; Counted below. */ | 2352 | /* dev->stats.tx_packets++; Counted below. */ |
2354 | dirty_tx++; | 2353 | dirty_tx++; |
2355 | } | 2354 | } |
2356 | vp->dirty_tx = dirty_tx; | 2355 | vp->dirty_tx = dirty_tx; |
@@ -2409,12 +2408,12 @@ static int vortex_rx(struct net_device *dev) | |||
2409 | unsigned char rx_error = ioread8(ioaddr + RxErrors); | 2408 | unsigned char rx_error = ioread8(ioaddr + RxErrors); |
2410 | if (vortex_debug > 2) | 2409 | if (vortex_debug > 2) |
2411 | printk(KERN_DEBUG " Rx error: status %2.2x.\n", rx_error); | 2410 | printk(KERN_DEBUG " Rx error: status %2.2x.\n", rx_error); |
2412 | vp->stats.rx_errors++; | 2411 | dev->stats.rx_errors++; |
2413 | if (rx_error & 0x01) vp->stats.rx_over_errors++; | 2412 | if (rx_error & 0x01) dev->stats.rx_over_errors++; |
2414 | if (rx_error & 0x02) vp->stats.rx_length_errors++; | 2413 | if (rx_error & 0x02) dev->stats.rx_length_errors++; |
2415 | if (rx_error & 0x04) vp->stats.rx_frame_errors++; | 2414 | if (rx_error & 0x04) dev->stats.rx_frame_errors++; |
2416 | if (rx_error & 0x08) vp->stats.rx_crc_errors++; | 2415 | if (rx_error & 0x08) dev->stats.rx_crc_errors++; |
2417 | if (rx_error & 0x10) vp->stats.rx_length_errors++; | 2416 | if (rx_error & 0x10) dev->stats.rx_length_errors++; |
2418 | } else { | 2417 | } else { |
2419 | /* The packet length: up to 4.5K!. */ | 2418 | /* The packet length: up to 4.5K!. */ |
2420 | int pkt_len = rx_status & 0x1fff; | 2419 | int pkt_len = rx_status & 0x1fff; |
@@ -2446,7 +2445,7 @@ static int vortex_rx(struct net_device *dev) | |||
2446 | skb->protocol = eth_type_trans(skb, dev); | 2445 | skb->protocol = eth_type_trans(skb, dev); |
2447 | netif_rx(skb); | 2446 | netif_rx(skb); |
2448 | dev->last_rx = jiffies; | 2447 | dev->last_rx = jiffies; |
2449 | vp->stats.rx_packets++; | 2448 | dev->stats.rx_packets++; |
2450 | /* Wait a limited time to go to next packet. */ | 2449 | /* Wait a limited time to go to next packet. */ |
2451 | for (i = 200; i >= 0; i--) | 2450 | for (i = 200; i >= 0; i--) |
2452 | if ( ! (ioread16(ioaddr + EL3_STATUS) & CmdInProgress)) | 2451 | if ( ! (ioread16(ioaddr + EL3_STATUS) & CmdInProgress)) |
@@ -2455,7 +2454,7 @@ static int vortex_rx(struct net_device *dev) | |||
2455 | } else if (vortex_debug > 0) | 2454 | } else if (vortex_debug > 0) |
2456 | printk(KERN_NOTICE "%s: No memory to allocate a sk_buff of " | 2455 | printk(KERN_NOTICE "%s: No memory to allocate a sk_buff of " |
2457 | "size %d.\n", dev->name, pkt_len); | 2456 | "size %d.\n", dev->name, pkt_len); |
2458 | vp->stats.rx_dropped++; | 2457 | dev->stats.rx_dropped++; |
2459 | } | 2458 | } |
2460 | issue_and_wait(dev, RxDiscard); | 2459 | issue_and_wait(dev, RxDiscard); |
2461 | } | 2460 | } |
@@ -2482,12 +2481,12 @@ boomerang_rx(struct net_device *dev) | |||
2482 | unsigned char rx_error = rx_status >> 16; | 2481 | unsigned char rx_error = rx_status >> 16; |
2483 | if (vortex_debug > 2) | 2482 | if (vortex_debug > 2) |
2484 | printk(KERN_DEBUG " Rx error: status %2.2x.\n", rx_error); | 2483 | printk(KERN_DEBUG " Rx error: status %2.2x.\n", rx_error); |
2485 | vp->stats.rx_errors++; | 2484 | dev->stats.rx_errors++; |
2486 | if (rx_error & 0x01) vp->stats.rx_over_errors++; | 2485 | if (rx_error & 0x01) dev->stats.rx_over_errors++; |
2487 | if (rx_error & 0x02) vp->stats.rx_length_errors++; | 2486 | if (rx_error & 0x02) dev->stats.rx_length_errors++; |
2488 | if (rx_error & 0x04) vp->stats.rx_frame_errors++; | 2487 | if (rx_error & 0x04) dev->stats.rx_frame_errors++; |
2489 | if (rx_error & 0x08) vp->stats.rx_crc_errors++; | 2488 | if (rx_error & 0x08) dev->stats.rx_crc_errors++; |
2490 | if (rx_error & 0x10) vp->stats.rx_length_errors++; | 2489 | if (rx_error & 0x10) dev->stats.rx_length_errors++; |
2491 | } else { | 2490 | } else { |
2492 | /* The packet length: up to 4.5K!. */ | 2491 | /* The packet length: up to 4.5K!. */ |
2493 | int pkt_len = rx_status & 0x1fff; | 2492 | int pkt_len = rx_status & 0x1fff; |
@@ -2529,7 +2528,7 @@ boomerang_rx(struct net_device *dev) | |||
2529 | } | 2528 | } |
2530 | netif_rx(skb); | 2529 | netif_rx(skb); |
2531 | dev->last_rx = jiffies; | 2530 | dev->last_rx = jiffies; |
2532 | vp->stats.rx_packets++; | 2531 | dev->stats.rx_packets++; |
2533 | } | 2532 | } |
2534 | entry = (++vp->cur_rx) % RX_RING_SIZE; | 2533 | entry = (++vp->cur_rx) % RX_RING_SIZE; |
2535 | } | 2534 | } |
@@ -2591,7 +2590,7 @@ vortex_down(struct net_device *dev, int final_down) | |||
2591 | del_timer_sync(&vp->rx_oom_timer); | 2590 | del_timer_sync(&vp->rx_oom_timer); |
2592 | del_timer_sync(&vp->timer); | 2591 | del_timer_sync(&vp->timer); |
2593 | 2592 | ||
2594 | /* Turn off statistics ASAP. We update vp->stats below. */ | 2593 | /* Turn off statistics ASAP. We update dev->stats below. */ |
2595 | iowrite16(StatsDisable, ioaddr + EL3_CMD); | 2594 | iowrite16(StatsDisable, ioaddr + EL3_CMD); |
2596 | 2595 | ||
2597 | /* Disable the receiver and transmitter. */ | 2596 | /* Disable the receiver and transmitter. */ |
@@ -2728,7 +2727,7 @@ static struct net_device_stats *vortex_get_stats(struct net_device *dev) | |||
2728 | update_stats(ioaddr, dev); | 2727 | update_stats(ioaddr, dev); |
2729 | spin_unlock_irqrestore (&vp->lock, flags); | 2728 | spin_unlock_irqrestore (&vp->lock, flags); |
2730 | } | 2729 | } |
2731 | return &vp->stats; | 2730 | return &dev->stats; |
2732 | } | 2731 | } |
2733 | 2732 | ||
2734 | /* Update statistics. | 2733 | /* Update statistics. |
@@ -2748,18 +2747,18 @@ static void update_stats(void __iomem *ioaddr, struct net_device *dev) | |||
2748 | /* Unlike the 3c5x9 we need not turn off stats updates while reading. */ | 2747 | /* Unlike the 3c5x9 we need not turn off stats updates while reading. */ |
2749 | /* Switch to the stats window, and read everything. */ | 2748 | /* Switch to the stats window, and read everything. */ |
2750 | EL3WINDOW(6); | 2749 | EL3WINDOW(6); |
2751 | vp->stats.tx_carrier_errors += ioread8(ioaddr + 0); | 2750 | dev->stats.tx_carrier_errors += ioread8(ioaddr + 0); |
2752 | vp->stats.tx_heartbeat_errors += ioread8(ioaddr + 1); | 2751 | dev->stats.tx_heartbeat_errors += ioread8(ioaddr + 1); |
2753 | vp->stats.tx_window_errors += ioread8(ioaddr + 4); | 2752 | dev->stats.tx_window_errors += ioread8(ioaddr + 4); |
2754 | vp->stats.rx_fifo_errors += ioread8(ioaddr + 5); | 2753 | dev->stats.rx_fifo_errors += ioread8(ioaddr + 5); |
2755 | vp->stats.tx_packets += ioread8(ioaddr + 6); | 2754 | dev->stats.tx_packets += ioread8(ioaddr + 6); |
2756 | vp->stats.tx_packets += (ioread8(ioaddr + 9)&0x30) << 4; | 2755 | dev->stats.tx_packets += (ioread8(ioaddr + 9)&0x30) << 4; |
2757 | /* Rx packets */ ioread8(ioaddr + 7); /* Must read to clear */ | 2756 | /* Rx packets */ ioread8(ioaddr + 7); /* Must read to clear */ |
2758 | /* Don't bother with register 9, an extension of registers 6&7. | 2757 | /* Don't bother with register 9, an extension of registers 6&7. |
2759 | If we do use the 6&7 values the atomic update assumption above | 2758 | If we do use the 6&7 values the atomic update assumption above |
2760 | is invalid. */ | 2759 | is invalid. */ |
2761 | vp->stats.rx_bytes += ioread16(ioaddr + 10); | 2760 | dev->stats.rx_bytes += ioread16(ioaddr + 10); |
2762 | vp->stats.tx_bytes += ioread16(ioaddr + 12); | 2761 | dev->stats.tx_bytes += ioread16(ioaddr + 12); |
2763 | /* Extra stats for get_ethtool_stats() */ | 2762 | /* Extra stats for get_ethtool_stats() */ |
2764 | vp->xstats.tx_multiple_collisions += ioread8(ioaddr + 2); | 2763 | vp->xstats.tx_multiple_collisions += ioread8(ioaddr + 2); |
2765 | vp->xstats.tx_single_collisions += ioread8(ioaddr + 3); | 2764 | vp->xstats.tx_single_collisions += ioread8(ioaddr + 3); |
@@ -2767,14 +2766,14 @@ static void update_stats(void __iomem *ioaddr, struct net_device *dev) | |||
2767 | EL3WINDOW(4); | 2766 | EL3WINDOW(4); |
2768 | vp->xstats.rx_bad_ssd += ioread8(ioaddr + 12); | 2767 | vp->xstats.rx_bad_ssd += ioread8(ioaddr + 12); |
2769 | 2768 | ||
2770 | vp->stats.collisions = vp->xstats.tx_multiple_collisions | 2769 | dev->stats.collisions = vp->xstats.tx_multiple_collisions |
2771 | + vp->xstats.tx_single_collisions | 2770 | + vp->xstats.tx_single_collisions |
2772 | + vp->xstats.tx_max_collisions; | 2771 | + vp->xstats.tx_max_collisions; |
2773 | 2772 | ||
2774 | { | 2773 | { |
2775 | u8 up = ioread8(ioaddr + 13); | 2774 | u8 up = ioread8(ioaddr + 13); |
2776 | vp->stats.rx_bytes += (up & 0x0f) << 16; | 2775 | dev->stats.rx_bytes += (up & 0x0f) << 16; |
2777 | vp->stats.tx_bytes += (up & 0xf0) << 12; | 2776 | dev->stats.tx_bytes += (up & 0xf0) << 12; |
2778 | } | 2777 | } |
2779 | 2778 | ||
2780 | EL3WINDOW(old_window >> 13); | 2779 | EL3WINDOW(old_window >> 13); |
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index af46341827f2..9f6cc8a56073 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
@@ -1273,20 +1273,6 @@ config PCNET32 | |||
1273 | To compile this driver as a module, choose M here. The module | 1273 | To compile this driver as a module, choose M here. The module |
1274 | will be called pcnet32. | 1274 | will be called pcnet32. |
1275 | 1275 | ||
1276 | config PCNET32_NAPI | ||
1277 | bool "Use RX polling (NAPI)" | ||
1278 | depends on PCNET32 | ||
1279 | help | ||
1280 | NAPI is a new driver API designed to reduce CPU and interrupt load | ||
1281 | when the driver is receiving lots of packets from the card. It is | ||
1282 | still somewhat experimental and thus not yet enabled by default. | ||
1283 | |||
1284 | If your estimated Rx load is 10kpps or more, or if the card will be | ||
1285 | deployed on potentially unfriendly networks (e.g. in a firewall), | ||
1286 | then say Y here. | ||
1287 | |||
1288 | If in doubt, say N. | ||
1289 | |||
1290 | config AMD8111_ETH | 1276 | config AMD8111_ETH |
1291 | tristate "AMD 8111 (new PCI lance) support" | 1277 | tristate "AMD 8111 (new PCI lance) support" |
1292 | depends on NET_PCI && PCI | 1278 | depends on NET_PCI && PCI |
@@ -2440,7 +2426,7 @@ config CHELSIO_T3 | |||
2440 | 2426 | ||
2441 | config EHEA | 2427 | config EHEA |
2442 | tristate "eHEA Ethernet support" | 2428 | tristate "eHEA Ethernet support" |
2443 | depends on IBMEBUS && INET && SPARSEMEM | 2429 | depends on IBMEBUS && INET && SPARSEMEM && MEMORY_HOTPLUG |
2444 | select INET_LRO | 2430 | select INET_LRO |
2445 | ---help--- | 2431 | ---help--- |
2446 | This driver supports the IBM pSeries eHEA ethernet adapter. | 2432 | This driver supports the IBM pSeries eHEA ethernet adapter. |
diff --git a/drivers/net/appletalk/cops.c b/drivers/net/appletalk/cops.c index 82e9a5bd0dd2..a0b4c8516073 100644 --- a/drivers/net/appletalk/cops.c +++ b/drivers/net/appletalk/cops.c | |||
@@ -499,19 +499,13 @@ static void cops_reset(struct net_device *dev, int sleep) | |||
499 | { | 499 | { |
500 | outb(0, ioaddr+DAYNA_RESET); /* Assert the reset port */ | 500 | outb(0, ioaddr+DAYNA_RESET); /* Assert the reset port */ |
501 | inb(ioaddr+DAYNA_RESET); /* Clear the reset */ | 501 | inb(ioaddr+DAYNA_RESET); /* Clear the reset */ |
502 | if(sleep) | 502 | if (sleep) |
503 | { | 503 | msleep(333); |
504 | long snap=jiffies; | 504 | else |
505 | 505 | mdelay(333); | |
506 | /* Let card finish initializing, about 1/3 second */ | ||
507 | while (time_before(jiffies, snap + HZ/3)) | ||
508 | schedule(); | ||
509 | } | ||
510 | else | ||
511 | mdelay(333); | ||
512 | } | 506 | } |
507 | |||
513 | netif_wake_queue(dev); | 508 | netif_wake_queue(dev); |
514 | return; | ||
515 | } | 509 | } |
516 | 510 | ||
517 | static void cops_load (struct net_device *dev) | 511 | static void cops_load (struct net_device *dev) |
diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c index 0afe522b8f7b..9c2394d49428 100644 --- a/drivers/net/atlx/atl1.c +++ b/drivers/net/atlx/atl1.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. | 2 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. |
3 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> | 3 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> |
4 | * Copyright(c) 2006 Jay Cliburn <jcliburn@gmail.com> | 4 | * Copyright(c) 2006 - 2008 Jay Cliburn <jcliburn@gmail.com> |
5 | * | 5 | * |
6 | * Derived from Intel e1000 driver | 6 | * Derived from Intel e1000 driver |
7 | * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. | 7 | * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. |
@@ -36,7 +36,6 @@ | |||
36 | * A very incomplete list of things that need to be dealt with: | 36 | * A very incomplete list of things that need to be dealt with: |
37 | * | 37 | * |
38 | * TODO: | 38 | * TODO: |
39 | * Wake on LAN. | ||
40 | * Add more ethtool functions. | 39 | * Add more ethtool functions. |
41 | * Fix abstruse irq enable/disable condition described here: | 40 | * Fix abstruse irq enable/disable condition described here: |
42 | * http://marc.theaimsgroup.com/?l=linux-netdev&m=116398508500553&w=2 | 41 | * http://marc.theaimsgroup.com/?l=linux-netdev&m=116398508500553&w=2 |
@@ -638,21 +637,18 @@ static s32 atl1_phy_leave_power_saving(struct atl1_hw *hw) | |||
638 | } | 637 | } |
639 | 638 | ||
640 | /* | 639 | /* |
641 | *TODO: do something or get rid of this | 640 | * Force the PHY into power saving mode using vendor magic. |
642 | */ | 641 | */ |
643 | #ifdef CONFIG_PM | 642 | #ifdef CONFIG_PM |
644 | static s32 atl1_phy_enter_power_saving(struct atl1_hw *hw) | 643 | static void atl1_phy_enter_power_saving(struct atl1_hw *hw) |
645 | { | 644 | { |
646 | /* s32 ret_val; | 645 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 0); |
647 | * u16 phy_data; | 646 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0x124E); |
648 | */ | 647 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 2); |
648 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0x3000); | ||
649 | atl1_write_phy_reg(hw, MII_DBG_ADDR, 3); | ||
650 | atl1_write_phy_reg(hw, MII_DBG_DATA, 0); | ||
649 | 651 | ||
650 | /* | ||
651 | ret_val = atl1_write_phy_reg(hw, ...); | ||
652 | ret_val = atl1_write_phy_reg(hw, ...); | ||
653 | .... | ||
654 | */ | ||
655 | return 0; | ||
656 | } | 652 | } |
657 | #endif | 653 | #endif |
658 | 654 | ||
@@ -2784,64 +2780,93 @@ static int atl1_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2784 | struct atl1_hw *hw = &adapter->hw; | 2780 | struct atl1_hw *hw = &adapter->hw; |
2785 | u32 ctrl = 0; | 2781 | u32 ctrl = 0; |
2786 | u32 wufc = adapter->wol; | 2782 | u32 wufc = adapter->wol; |
2783 | u32 val; | ||
2784 | int retval; | ||
2785 | u16 speed; | ||
2786 | u16 duplex; | ||
2787 | 2787 | ||
2788 | netif_device_detach(netdev); | 2788 | netif_device_detach(netdev); |
2789 | if (netif_running(netdev)) | 2789 | if (netif_running(netdev)) |
2790 | atl1_down(adapter); | 2790 | atl1_down(adapter); |
2791 | 2791 | ||
2792 | retval = pci_save_state(pdev); | ||
2793 | if (retval) | ||
2794 | return retval; | ||
2795 | |||
2792 | atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl); | 2796 | atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl); |
2793 | atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl); | 2797 | atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl); |
2794 | if (ctrl & BMSR_LSTATUS) | 2798 | val = ctrl & BMSR_LSTATUS; |
2799 | if (val) | ||
2795 | wufc &= ~ATLX_WUFC_LNKC; | 2800 | wufc &= ~ATLX_WUFC_LNKC; |
2796 | 2801 | ||
2797 | /* reduce speed to 10/100M */ | 2802 | if (val && wufc) { |
2798 | if (wufc) { | 2803 | val = atl1_get_speed_and_duplex(hw, &speed, &duplex); |
2799 | atl1_phy_enter_power_saving(hw); | 2804 | if (val) { |
2800 | /* if resume, let driver to re- setup link */ | 2805 | if (netif_msg_ifdown(adapter)) |
2801 | hw->phy_configured = false; | 2806 | dev_printk(KERN_DEBUG, &pdev->dev, |
2802 | atl1_set_mac_addr(hw); | 2807 | "error getting speed/duplex\n"); |
2803 | atlx_set_multi(netdev); | 2808 | goto disable_wol; |
2809 | } | ||
2804 | 2810 | ||
2805 | ctrl = 0; | 2811 | ctrl = 0; |
2806 | /* turn on magic packet wol */ | ||
2807 | if (wufc & ATLX_WUFC_MAG) | ||
2808 | ctrl = WOL_MAGIC_EN | WOL_MAGIC_PME_EN; | ||
2809 | 2812 | ||
2810 | /* turn on Link change WOL */ | 2813 | /* enable magic packet WOL */ |
2811 | if (wufc & ATLX_WUFC_LNKC) | 2814 | if (wufc & ATLX_WUFC_MAG) |
2812 | ctrl |= (WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN); | 2815 | ctrl |= (WOL_MAGIC_EN | WOL_MAGIC_PME_EN); |
2813 | iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL); | 2816 | iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL); |
2814 | 2817 | ioread32(hw->hw_addr + REG_WOL_CTRL); | |
2815 | /* turn on all-multi mode if wake on multicast is enabled */ | 2818 | |
2816 | ctrl = ioread32(hw->hw_addr + REG_MAC_CTRL); | 2819 | /* configure the mac */ |
2817 | ctrl &= ~MAC_CTRL_DBG; | 2820 | ctrl = MAC_CTRL_RX_EN; |
2818 | ctrl &= ~MAC_CTRL_PROMIS_EN; | 2821 | ctrl |= ((u32)((speed == SPEED_1000) ? MAC_CTRL_SPEED_1000 : |
2819 | if (wufc & ATLX_WUFC_MC) | 2822 | MAC_CTRL_SPEED_10_100) << MAC_CTRL_SPEED_SHIFT); |
2820 | ctrl |= MAC_CTRL_MC_ALL_EN; | 2823 | if (duplex == FULL_DUPLEX) |
2821 | else | 2824 | ctrl |= MAC_CTRL_DUPLX; |
2822 | ctrl &= ~MAC_CTRL_MC_ALL_EN; | 2825 | ctrl |= (((u32)adapter->hw.preamble_len & |
2823 | 2826 | MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT); | |
2824 | /* turn on broadcast mode if wake on-BC is enabled */ | 2827 | if (adapter->vlgrp) |
2825 | if (wufc & ATLX_WUFC_BC) | 2828 | ctrl |= MAC_CTRL_RMV_VLAN; |
2829 | if (wufc & ATLX_WUFC_MAG) | ||
2826 | ctrl |= MAC_CTRL_BC_EN; | 2830 | ctrl |= MAC_CTRL_BC_EN; |
2827 | else | ||
2828 | ctrl &= ~MAC_CTRL_BC_EN; | ||
2829 | |||
2830 | /* enable RX */ | ||
2831 | ctrl |= MAC_CTRL_RX_EN; | ||
2832 | iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL); | 2831 | iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL); |
2833 | pci_enable_wake(pdev, PCI_D3hot, 1); | 2832 | ioread32(hw->hw_addr + REG_MAC_CTRL); |
2834 | pci_enable_wake(pdev, PCI_D3cold, 1); | 2833 | |
2835 | } else { | 2834 | /* poke the PHY */ |
2836 | iowrite32(0, hw->hw_addr + REG_WOL_CTRL); | 2835 | ctrl = ioread32(hw->hw_addr + REG_PCIE_PHYMISC); |
2837 | pci_enable_wake(pdev, PCI_D3hot, 0); | 2836 | ctrl |= PCIE_PHYMISC_FORCE_RCV_DET; |
2838 | pci_enable_wake(pdev, PCI_D3cold, 0); | 2837 | iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC); |
2838 | ioread32(hw->hw_addr + REG_PCIE_PHYMISC); | ||
2839 | |||
2840 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 1); | ||
2841 | goto exit; | ||
2839 | } | 2842 | } |
2840 | 2843 | ||
2841 | pci_save_state(pdev); | 2844 | if (!val && wufc) { |
2845 | ctrl |= (WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN); | ||
2846 | iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL); | ||
2847 | ioread32(hw->hw_addr + REG_WOL_CTRL); | ||
2848 | iowrite32(0, hw->hw_addr + REG_MAC_CTRL); | ||
2849 | ioread32(hw->hw_addr + REG_MAC_CTRL); | ||
2850 | hw->phy_configured = false; | ||
2851 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 1); | ||
2852 | goto exit; | ||
2853 | } | ||
2854 | |||
2855 | disable_wol: | ||
2856 | iowrite32(0, hw->hw_addr + REG_WOL_CTRL); | ||
2857 | ioread32(hw->hw_addr + REG_WOL_CTRL); | ||
2858 | ctrl = ioread32(hw->hw_addr + REG_PCIE_PHYMISC); | ||
2859 | ctrl |= PCIE_PHYMISC_FORCE_RCV_DET; | ||
2860 | iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC); | ||
2861 | ioread32(hw->hw_addr + REG_PCIE_PHYMISC); | ||
2862 | atl1_phy_enter_power_saving(hw); | ||
2863 | hw->phy_configured = false; | ||
2864 | pci_enable_wake(pdev, pci_choose_state(pdev, state), 0); | ||
2865 | exit: | ||
2866 | if (netif_running(netdev)) | ||
2867 | pci_disable_msi(adapter->pdev); | ||
2842 | pci_disable_device(pdev); | 2868 | pci_disable_device(pdev); |
2843 | 2869 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | |
2844 | pci_set_power_state(pdev, PCI_D3hot); | ||
2845 | 2870 | ||
2846 | return 0; | 2871 | return 0; |
2847 | } | 2872 | } |
@@ -2855,20 +2880,26 @@ static int atl1_resume(struct pci_dev *pdev) | |||
2855 | pci_set_power_state(pdev, PCI_D0); | 2880 | pci_set_power_state(pdev, PCI_D0); |
2856 | pci_restore_state(pdev); | 2881 | pci_restore_state(pdev); |
2857 | 2882 | ||
2858 | /* FIXME: check and handle */ | ||
2859 | err = pci_enable_device(pdev); | 2883 | err = pci_enable_device(pdev); |
2884 | if (err) { | ||
2885 | if (netif_msg_ifup(adapter)) | ||
2886 | dev_printk(KERN_DEBUG, &pdev->dev, | ||
2887 | "error enabling pci device\n"); | ||
2888 | return err; | ||
2889 | } | ||
2890 | |||
2891 | pci_set_master(pdev); | ||
2892 | iowrite32(0, adapter->hw.hw_addr + REG_WOL_CTRL); | ||
2860 | pci_enable_wake(pdev, PCI_D3hot, 0); | 2893 | pci_enable_wake(pdev, PCI_D3hot, 0); |
2861 | pci_enable_wake(pdev, PCI_D3cold, 0); | 2894 | pci_enable_wake(pdev, PCI_D3cold, 0); |
2862 | 2895 | ||
2863 | iowrite32(0, adapter->hw.hw_addr + REG_WOL_CTRL); | 2896 | atl1_reset_hw(&adapter->hw); |
2864 | atl1_reset(adapter); | 2897 | adapter->cmb.cmb->int_stats = 0; |
2865 | 2898 | ||
2866 | if (netif_running(netdev)) | 2899 | if (netif_running(netdev)) |
2867 | atl1_up(adapter); | 2900 | atl1_up(adapter); |
2868 | netif_device_attach(netdev); | 2901 | netif_device_attach(netdev); |
2869 | 2902 | ||
2870 | atl1_via_workaround(adapter); | ||
2871 | |||
2872 | return 0; | 2903 | return 0; |
2873 | } | 2904 | } |
2874 | #else | 2905 | #else |
@@ -2876,6 +2907,13 @@ static int atl1_resume(struct pci_dev *pdev) | |||
2876 | #define atl1_resume NULL | 2907 | #define atl1_resume NULL |
2877 | #endif | 2908 | #endif |
2878 | 2909 | ||
2910 | static void atl1_shutdown(struct pci_dev *pdev) | ||
2911 | { | ||
2912 | #ifdef CONFIG_PM | ||
2913 | atl1_suspend(pdev, PMSG_SUSPEND); | ||
2914 | #endif | ||
2915 | } | ||
2916 | |||
2879 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2917 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2880 | static void atl1_poll_controller(struct net_device *netdev) | 2918 | static void atl1_poll_controller(struct net_device *netdev) |
2881 | { | 2919 | { |
@@ -3122,7 +3160,8 @@ static struct pci_driver atl1_driver = { | |||
3122 | .probe = atl1_probe, | 3160 | .probe = atl1_probe, |
3123 | .remove = __devexit_p(atl1_remove), | 3161 | .remove = __devexit_p(atl1_remove), |
3124 | .suspend = atl1_suspend, | 3162 | .suspend = atl1_suspend, |
3125 | .resume = atl1_resume | 3163 | .resume = atl1_resume, |
3164 | .shutdown = atl1_shutdown | ||
3126 | }; | 3165 | }; |
3127 | 3166 | ||
3128 | /* | 3167 | /* |
diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h index 51893d66eae1..a5015b14a429 100644 --- a/drivers/net/atlx/atl1.h +++ b/drivers/net/atlx/atl1.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. | 2 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. |
3 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> | 3 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> |
4 | * Copyright(c) 2006 Jay Cliburn <jcliburn@gmail.com> | 4 | * Copyright(c) 2006 - 2008 Jay Cliburn <jcliburn@gmail.com> |
5 | * | 5 | * |
6 | * Derived from Intel e1000 driver | 6 | * Derived from Intel e1000 driver |
7 | * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. | 7 | * Copyright(c) 1999 - 2005 Intel Corporation. All rights reserved. |
diff --git a/drivers/net/atlx/atlx.c b/drivers/net/atlx/atlx.c index f06b854e2501..b3e7fcf0f6e7 100644 --- a/drivers/net/atlx/atlx.c +++ b/drivers/net/atlx/atlx.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * | 2 | * |
3 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. | 3 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. |
4 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> | 4 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> |
5 | * Copyright(c) 2006 Jay Cliburn <jcliburn@gmail.com> | 5 | * Copyright(c) 2006 - 2008 Jay Cliburn <jcliburn@gmail.com> |
6 | * Copyright(c) 2007 Atheros Corporation. All rights reserved. | 6 | * Copyright(c) 2007 Atheros Corporation. All rights reserved. |
7 | * | 7 | * |
8 | * Derived from Intel e1000 driver | 8 | * Derived from Intel e1000 driver |
diff --git a/drivers/net/atlx/atlx.h b/drivers/net/atlx/atlx.h index 3be7c09734d4..297a03da6b7f 100644 --- a/drivers/net/atlx/atlx.h +++ b/drivers/net/atlx/atlx.h | |||
@@ -2,7 +2,7 @@ | |||
2 | * | 2 | * |
3 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. | 3 | * Copyright(c) 2005 - 2006 Attansic Corporation. All rights reserved. |
4 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> | 4 | * Copyright(c) 2006 - 2007 Chris Snook <csnook@redhat.com> |
5 | * Copyright(c) 2006 Jay Cliburn <jcliburn@gmail.com> | 5 | * Copyright(c) 2006 - 2008 Jay Cliburn <jcliburn@gmail.com> |
6 | * Copyright(c) 2007 Atheros Corporation. All rights reserved. | 6 | * Copyright(c) 2007 Atheros Corporation. All rights reserved. |
7 | * | 7 | * |
8 | * Derived from Intel e1000 driver | 8 | * Derived from Intel e1000 driver |
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/module.h> | 29 | #include <linux/module.h> |
30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
31 | 31 | ||
32 | #define ATLX_DRIVER_VERSION "2.1.1" | 32 | #define ATLX_DRIVER_VERSION "2.1.3" |
33 | MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \ | 33 | MODULE_AUTHOR("Xiong Huang <xiong.huang@atheros.com>, \ |
34 | Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>"); | 34 | Chris Snook <csnook@redhat.com>, Jay Cliburn <jcliburn@gmail.com>"); |
35 | MODULE_LICENSE("GPL"); | 35 | MODULE_LICENSE("GPL"); |
@@ -460,6 +460,9 @@ MODULE_VERSION(ATLX_DRIVER_VERSION); | |||
460 | #define MII_ATLX_PSSR_100MBS 0x4000 /* 01=100Mbs */ | 460 | #define MII_ATLX_PSSR_100MBS 0x4000 /* 01=100Mbs */ |
461 | #define MII_ATLX_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ | 461 | #define MII_ATLX_PSSR_1000MBS 0x8000 /* 10=1000Mbs */ |
462 | 462 | ||
463 | #define MII_DBG_ADDR 0x1D | ||
464 | #define MII_DBG_DATA 0x1E | ||
465 | |||
463 | /* PCI Command Register Bit Definitions */ | 466 | /* PCI Command Register Bit Definitions */ |
464 | #define PCI_REG_COMMAND 0x04 /* PCI Command Register */ | 467 | #define PCI_REG_COMMAND 0x04 /* PCI Command Register */ |
465 | #define CMD_IO_SPACE 0x0001 | 468 | #define CMD_IO_SPACE 0x0001 |
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 6425603bc379..50a40e433154 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c | |||
@@ -1425,13 +1425,13 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1425 | res = netdev_set_master(slave_dev, bond_dev); | 1425 | res = netdev_set_master(slave_dev, bond_dev); |
1426 | if (res) { | 1426 | if (res) { |
1427 | dprintk("Error %d calling netdev_set_master\n", res); | 1427 | dprintk("Error %d calling netdev_set_master\n", res); |
1428 | goto err_close; | 1428 | goto err_restore_mac; |
1429 | } | 1429 | } |
1430 | /* open the slave since the application closed it */ | 1430 | /* open the slave since the application closed it */ |
1431 | res = dev_open(slave_dev); | 1431 | res = dev_open(slave_dev); |
1432 | if (res) { | 1432 | if (res) { |
1433 | dprintk("Openning slave %s failed\n", slave_dev->name); | 1433 | dprintk("Openning slave %s failed\n", slave_dev->name); |
1434 | goto err_restore_mac; | 1434 | goto err_unset_master; |
1435 | } | 1435 | } |
1436 | 1436 | ||
1437 | new_slave->dev = slave_dev; | 1437 | new_slave->dev = slave_dev; |
@@ -1444,7 +1444,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1444 | */ | 1444 | */ |
1445 | res = bond_alb_init_slave(bond, new_slave); | 1445 | res = bond_alb_init_slave(bond, new_slave); |
1446 | if (res) { | 1446 | if (res) { |
1447 | goto err_unset_master; | 1447 | goto err_close; |
1448 | } | 1448 | } |
1449 | } | 1449 | } |
1450 | 1450 | ||
@@ -1619,7 +1619,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1619 | 1619 | ||
1620 | res = bond_create_slave_symlinks(bond_dev, slave_dev); | 1620 | res = bond_create_slave_symlinks(bond_dev, slave_dev); |
1621 | if (res) | 1621 | if (res) |
1622 | goto err_unset_master; | 1622 | goto err_close; |
1623 | 1623 | ||
1624 | printk(KERN_INFO DRV_NAME | 1624 | printk(KERN_INFO DRV_NAME |
1625 | ": %s: enslaving %s as a%s interface with a%s link.\n", | 1625 | ": %s: enslaving %s as a%s interface with a%s link.\n", |
@@ -1631,12 +1631,12 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev) | |||
1631 | return 0; | 1631 | return 0; |
1632 | 1632 | ||
1633 | /* Undo stages on error */ | 1633 | /* Undo stages on error */ |
1634 | err_unset_master: | ||
1635 | netdev_set_master(slave_dev, NULL); | ||
1636 | |||
1637 | err_close: | 1634 | err_close: |
1638 | dev_close(slave_dev); | 1635 | dev_close(slave_dev); |
1639 | 1636 | ||
1637 | err_unset_master: | ||
1638 | netdev_set_master(slave_dev, NULL); | ||
1639 | |||
1640 | err_restore_mac: | 1640 | err_restore_mac: |
1641 | if (!bond->params.fail_over_mac) { | 1641 | if (!bond->params.fail_over_mac) { |
1642 | memcpy(addr.sa_data, new_slave->perm_hwaddr, ETH_ALEN); | 1642 | memcpy(addr.sa_data, new_slave->perm_hwaddr, ETH_ALEN); |
@@ -4936,7 +4936,9 @@ int bond_create(char *name, struct bond_params *params, struct bonding **newbond | |||
4936 | if (res < 0) { | 4936 | if (res < 0) { |
4937 | rtnl_lock(); | 4937 | rtnl_lock(); |
4938 | down_write(&bonding_rwsem); | 4938 | down_write(&bonding_rwsem); |
4939 | goto out_bond; | 4939 | bond_deinit(bond_dev); |
4940 | unregister_netdevice(bond_dev); | ||
4941 | goto out_rtnl; | ||
4940 | } | 4942 | } |
4941 | 4943 | ||
4942 | return 0; | 4944 | return 0; |
@@ -4990,9 +4992,10 @@ err: | |||
4990 | destroy_workqueue(bond->wq); | 4992 | destroy_workqueue(bond->wq); |
4991 | } | 4993 | } |
4992 | 4994 | ||
4995 | bond_destroy_sysfs(); | ||
4996 | |||
4993 | rtnl_lock(); | 4997 | rtnl_lock(); |
4994 | bond_free_all(); | 4998 | bond_free_all(); |
4995 | bond_destroy_sysfs(); | ||
4996 | rtnl_unlock(); | 4999 | rtnl_unlock(); |
4997 | out: | 5000 | out: |
4998 | return res; | 5001 | return res; |
@@ -5004,9 +5007,10 @@ static void __exit bonding_exit(void) | |||
5004 | unregister_netdevice_notifier(&bond_netdev_notifier); | 5007 | unregister_netdevice_notifier(&bond_netdev_notifier); |
5005 | unregister_inetaddr_notifier(&bond_inetaddr_notifier); | 5008 | unregister_inetaddr_notifier(&bond_inetaddr_notifier); |
5006 | 5009 | ||
5010 | bond_destroy_sysfs(); | ||
5011 | |||
5007 | rtnl_lock(); | 5012 | rtnl_lock(); |
5008 | bond_free_all(); | 5013 | bond_free_all(); |
5009 | bond_destroy_sysfs(); | ||
5010 | rtnl_unlock(); | 5014 | rtnl_unlock(); |
5011 | } | 5015 | } |
5012 | 5016 | ||
diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c index 979c2d05ff9c..08f3d396bcd6 100644 --- a/drivers/net/bonding/bond_sysfs.c +++ b/drivers/net/bonding/bond_sysfs.c | |||
@@ -146,29 +146,29 @@ static ssize_t bonding_store_bonds(struct class *cls, const char *buffer, size_t | |||
146 | ": Unable remove bond %s due to open references.\n", | 146 | ": Unable remove bond %s due to open references.\n", |
147 | ifname); | 147 | ifname); |
148 | res = -EPERM; | 148 | res = -EPERM; |
149 | goto out; | 149 | goto out_unlock; |
150 | } | 150 | } |
151 | printk(KERN_INFO DRV_NAME | 151 | printk(KERN_INFO DRV_NAME |
152 | ": %s is being deleted...\n", | 152 | ": %s is being deleted...\n", |
153 | bond->dev->name); | 153 | bond->dev->name); |
154 | bond_destroy(bond); | 154 | bond_destroy(bond); |
155 | up_write(&bonding_rwsem); | 155 | goto out_unlock; |
156 | rtnl_unlock(); | ||
157 | goto out; | ||
158 | } | 156 | } |
159 | 157 | ||
160 | printk(KERN_ERR DRV_NAME | 158 | printk(KERN_ERR DRV_NAME |
161 | ": unable to delete non-existent bond %s\n", ifname); | 159 | ": unable to delete non-existent bond %s\n", ifname); |
162 | res = -ENODEV; | 160 | res = -ENODEV; |
163 | up_write(&bonding_rwsem); | 161 | goto out_unlock; |
164 | rtnl_unlock(); | ||
165 | goto out; | ||
166 | } | 162 | } |
167 | 163 | ||
168 | err_no_cmd: | 164 | err_no_cmd: |
169 | printk(KERN_ERR DRV_NAME | 165 | printk(KERN_ERR DRV_NAME |
170 | ": no command found in bonding_masters. Use +ifname or -ifname.\n"); | 166 | ": no command found in bonding_masters. Use +ifname or -ifname.\n"); |
171 | res = -EPERM; | 167 | return -EPERM; |
168 | |||
169 | out_unlock: | ||
170 | up_write(&bonding_rwsem); | ||
171 | rtnl_unlock(); | ||
172 | 172 | ||
173 | /* Always return either count or an error. If you return 0, you'll | 173 | /* Always return either count or an error. If you return 0, you'll |
174 | * get called forever, which is bad. | 174 | * get called forever, which is bad. |
@@ -1437,8 +1437,16 @@ int bond_create_sysfs(void) | |||
1437 | * configure multiple bonding devices. | 1437 | * configure multiple bonding devices. |
1438 | */ | 1438 | */ |
1439 | if (ret == -EEXIST) { | 1439 | if (ret == -EEXIST) { |
1440 | netdev_class = NULL; | 1440 | /* Is someone being kinky and naming a device bonding_master? */ |
1441 | return 0; | 1441 | if (__dev_get_by_name(&init_net, |
1442 | class_attr_bonding_masters.attr.name)) | ||
1443 | printk(KERN_ERR | ||
1444 | "network device named %s already exists in sysfs", | ||
1445 | class_attr_bonding_masters.attr.name); | ||
1446 | else { | ||
1447 | netdev_class = NULL; | ||
1448 | return 0; | ||
1449 | } | ||
1442 | } | 1450 | } |
1443 | 1451 | ||
1444 | return ret; | 1452 | return ret; |
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h index 4fdb13f8447b..acebe431d068 100644 --- a/drivers/net/cxgb3/adapter.h +++ b/drivers/net/cxgb3/adapter.h | |||
@@ -71,6 +71,7 @@ enum { /* adapter flags */ | |||
71 | USING_MSIX = (1 << 2), | 71 | USING_MSIX = (1 << 2), |
72 | QUEUES_BOUND = (1 << 3), | 72 | QUEUES_BOUND = (1 << 3), |
73 | TP_PARITY_INIT = (1 << 4), | 73 | TP_PARITY_INIT = (1 << 4), |
74 | NAPI_INIT = (1 << 5), | ||
74 | }; | 75 | }; |
75 | 76 | ||
76 | struct fl_pg_chunk { | 77 | struct fl_pg_chunk { |
diff --git a/drivers/net/cxgb3/common.h b/drivers/net/cxgb3/common.h index 91ee7277b813..579bee42a5cb 100644 --- a/drivers/net/cxgb3/common.h +++ b/drivers/net/cxgb3/common.h | |||
@@ -698,6 +698,7 @@ void mac_prep(struct cmac *mac, struct adapter *adapter, int index); | |||
698 | void early_hw_init(struct adapter *adapter, const struct adapter_info *ai); | 698 | void early_hw_init(struct adapter *adapter, const struct adapter_info *ai); |
699 | int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai, | 699 | int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai, |
700 | int reset); | 700 | int reset); |
701 | int t3_replay_prep_adapter(struct adapter *adapter); | ||
701 | void t3_led_ready(struct adapter *adapter); | 702 | void t3_led_ready(struct adapter *adapter); |
702 | void t3_fatal_err(struct adapter *adapter); | 703 | void t3_fatal_err(struct adapter *adapter); |
703 | void t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on); | 704 | void t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on); |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 05e5f59e87fa..3a3127216791 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -421,6 +421,13 @@ static void init_napi(struct adapter *adap) | |||
421 | netif_napi_add(qs->netdev, &qs->napi, qs->napi.poll, | 421 | netif_napi_add(qs->netdev, &qs->napi, qs->napi.poll, |
422 | 64); | 422 | 64); |
423 | } | 423 | } |
424 | |||
425 | /* | ||
426 | * netif_napi_add() can be called only once per napi_struct because it | ||
427 | * adds each new napi_struct to a list. Be careful not to call it a | ||
428 | * second time, e.g., during EEH recovery, by making a note of it. | ||
429 | */ | ||
430 | adap->flags |= NAPI_INIT; | ||
424 | } | 431 | } |
425 | 432 | ||
426 | /* | 433 | /* |
@@ -896,7 +903,8 @@ static int cxgb_up(struct adapter *adap) | |||
896 | goto out; | 903 | goto out; |
897 | 904 | ||
898 | setup_rss(adap); | 905 | setup_rss(adap); |
899 | init_napi(adap); | 906 | if (!(adap->flags & NAPI_INIT)) |
907 | init_napi(adap); | ||
900 | adap->flags |= FULL_INIT_DONE; | 908 | adap->flags |= FULL_INIT_DONE; |
901 | } | 909 | } |
902 | 910 | ||
@@ -999,7 +1007,7 @@ static int offload_open(struct net_device *dev) | |||
999 | return 0; | 1007 | return 0; |
1000 | 1008 | ||
1001 | if (!adap_up && (err = cxgb_up(adapter)) < 0) | 1009 | if (!adap_up && (err = cxgb_up(adapter)) < 0) |
1002 | return err; | 1010 | goto out; |
1003 | 1011 | ||
1004 | t3_tp_set_offload_mode(adapter, 1); | 1012 | t3_tp_set_offload_mode(adapter, 1); |
1005 | tdev->lldev = adapter->port[0]; | 1013 | tdev->lldev = adapter->port[0]; |
@@ -1061,10 +1069,8 @@ static int cxgb_open(struct net_device *dev) | |||
1061 | int other_ports = adapter->open_device_map & PORT_MASK; | 1069 | int other_ports = adapter->open_device_map & PORT_MASK; |
1062 | int err; | 1070 | int err; |
1063 | 1071 | ||
1064 | if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) { | 1072 | if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) |
1065 | quiesce_rx(adapter); | ||
1066 | return err; | 1073 | return err; |
1067 | } | ||
1068 | 1074 | ||
1069 | set_bit(pi->port_id, &adapter->open_device_map); | 1075 | set_bit(pi->port_id, &adapter->open_device_map); |
1070 | if (is_offload(adapter) && !ofld_disable) { | 1076 | if (is_offload(adapter) && !ofld_disable) { |
@@ -1894,11 +1900,11 @@ static int cxgb_extension_ioctl(struct net_device *dev, void __user *useraddr) | |||
1894 | u8 *fw_data; | 1900 | u8 *fw_data; |
1895 | struct ch_mem_range t; | 1901 | struct ch_mem_range t; |
1896 | 1902 | ||
1897 | if (!capable(CAP_NET_ADMIN)) | 1903 | if (!capable(CAP_SYS_RAWIO)) |
1898 | return -EPERM; | 1904 | return -EPERM; |
1899 | if (copy_from_user(&t, useraddr, sizeof(t))) | 1905 | if (copy_from_user(&t, useraddr, sizeof(t))) |
1900 | return -EFAULT; | 1906 | return -EFAULT; |
1901 | 1907 | /* Check t.len sanity ? */ | |
1902 | fw_data = kmalloc(t.len, GFP_KERNEL); | 1908 | fw_data = kmalloc(t.len, GFP_KERNEL); |
1903 | if (!fw_data) | 1909 | if (!fw_data) |
1904 | return -ENOMEM; | 1910 | return -ENOMEM; |
@@ -2424,14 +2430,11 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev, | |||
2424 | test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) | 2430 | test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map)) |
2425 | offload_close(&adapter->tdev); | 2431 | offload_close(&adapter->tdev); |
2426 | 2432 | ||
2427 | /* Free sge resources */ | ||
2428 | t3_free_sge_resources(adapter); | ||
2429 | |||
2430 | adapter->flags &= ~FULL_INIT_DONE; | 2433 | adapter->flags &= ~FULL_INIT_DONE; |
2431 | 2434 | ||
2432 | pci_disable_device(pdev); | 2435 | pci_disable_device(pdev); |
2433 | 2436 | ||
2434 | /* Request a slot slot reset. */ | 2437 | /* Request a slot reset. */ |
2435 | return PCI_ERS_RESULT_NEED_RESET; | 2438 | return PCI_ERS_RESULT_NEED_RESET; |
2436 | } | 2439 | } |
2437 | 2440 | ||
@@ -2448,13 +2451,20 @@ static pci_ers_result_t t3_io_slot_reset(struct pci_dev *pdev) | |||
2448 | if (pci_enable_device(pdev)) { | 2451 | if (pci_enable_device(pdev)) { |
2449 | dev_err(&pdev->dev, | 2452 | dev_err(&pdev->dev, |
2450 | "Cannot re-enable PCI device after reset.\n"); | 2453 | "Cannot re-enable PCI device after reset.\n"); |
2451 | return PCI_ERS_RESULT_DISCONNECT; | 2454 | goto err; |
2452 | } | 2455 | } |
2453 | pci_set_master(pdev); | 2456 | pci_set_master(pdev); |
2457 | pci_restore_state(pdev); | ||
2454 | 2458 | ||
2455 | t3_prep_adapter(adapter, adapter->params.info, 1); | 2459 | /* Free sge resources */ |
2460 | t3_free_sge_resources(adapter); | ||
2461 | |||
2462 | if (t3_replay_prep_adapter(adapter)) | ||
2463 | goto err; | ||
2456 | 2464 | ||
2457 | return PCI_ERS_RESULT_RECOVERED; | 2465 | return PCI_ERS_RESULT_RECOVERED; |
2466 | err: | ||
2467 | return PCI_ERS_RESULT_DISCONNECT; | ||
2458 | } | 2468 | } |
2459 | 2469 | ||
2460 | /** | 2470 | /** |
@@ -2483,13 +2493,6 @@ static void t3_io_resume(struct pci_dev *pdev) | |||
2483 | netif_device_attach(netdev); | 2493 | netif_device_attach(netdev); |
2484 | } | 2494 | } |
2485 | } | 2495 | } |
2486 | |||
2487 | if (is_offload(adapter)) { | ||
2488 | __set_bit(OFFLOAD_DEVMAP_BIT, &adapter->registered_device_map); | ||
2489 | if (offload_open(adapter->port[0])) | ||
2490 | printk(KERN_WARNING | ||
2491 | "Could not bring back offload capabilities\n"); | ||
2492 | } | ||
2493 | } | 2496 | } |
2494 | 2497 | ||
2495 | static struct pci_error_handlers t3_err_handler = { | 2498 | static struct pci_error_handlers t3_err_handler = { |
@@ -2608,6 +2611,7 @@ static int __devinit init_one(struct pci_dev *pdev, | |||
2608 | } | 2611 | } |
2609 | 2612 | ||
2610 | pci_set_master(pdev); | 2613 | pci_set_master(pdev); |
2614 | pci_save_state(pdev); | ||
2611 | 2615 | ||
2612 | mmio_start = pci_resource_start(pdev, 0); | 2616 | mmio_start = pci_resource_start(pdev, 0); |
2613 | mmio_len = pci_resource_len(pdev, 0); | 2617 | mmio_len = pci_resource_len(pdev, 0); |
diff --git a/drivers/net/cxgb3/regs.h b/drivers/net/cxgb3/regs.h index 02dbbb300929..567178879345 100644 --- a/drivers/net/cxgb3/regs.h +++ b/drivers/net/cxgb3/regs.h | |||
@@ -444,6 +444,14 @@ | |||
444 | 444 | ||
445 | #define A_PCIE_CFG 0x88 | 445 | #define A_PCIE_CFG 0x88 |
446 | 446 | ||
447 | #define S_ENABLELINKDWNDRST 21 | ||
448 | #define V_ENABLELINKDWNDRST(x) ((x) << S_ENABLELINKDWNDRST) | ||
449 | #define F_ENABLELINKDWNDRST V_ENABLELINKDWNDRST(1U) | ||
450 | |||
451 | #define S_ENABLELINKDOWNRST 20 | ||
452 | #define V_ENABLELINKDOWNRST(x) ((x) << S_ENABLELINKDOWNRST) | ||
453 | #define F_ENABLELINKDOWNRST V_ENABLELINKDOWNRST(1U) | ||
454 | |||
447 | #define S_PCIE_CLIDECEN 16 | 455 | #define S_PCIE_CLIDECEN 16 |
448 | #define V_PCIE_CLIDECEN(x) ((x) << S_PCIE_CLIDECEN) | 456 | #define V_PCIE_CLIDECEN(x) ((x) << S_PCIE_CLIDECEN) |
449 | #define F_PCIE_CLIDECEN V_PCIE_CLIDECEN(1U) | 457 | #define F_PCIE_CLIDECEN V_PCIE_CLIDECEN(1U) |
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index 98a6bbd11d4c..796eb305cdc3 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -539,6 +539,31 @@ static void *alloc_ring(struct pci_dev *pdev, size_t nelem, size_t elem_size, | |||
539 | } | 539 | } |
540 | 540 | ||
541 | /** | 541 | /** |
542 | * t3_reset_qset - reset a sge qset | ||
543 | * @q: the queue set | ||
544 | * | ||
545 | * Reset the qset structure. | ||
546 | * the NAPI structure is preserved in the event of | ||
547 | * the qset's reincarnation, for example during EEH recovery. | ||
548 | */ | ||
549 | static void t3_reset_qset(struct sge_qset *q) | ||
550 | { | ||
551 | if (q->adap && | ||
552 | !(q->adap->flags & NAPI_INIT)) { | ||
553 | memset(q, 0, sizeof(*q)); | ||
554 | return; | ||
555 | } | ||
556 | |||
557 | q->adap = NULL; | ||
558 | memset(&q->rspq, 0, sizeof(q->rspq)); | ||
559 | memset(q->fl, 0, sizeof(struct sge_fl) * SGE_RXQ_PER_SET); | ||
560 | memset(q->txq, 0, sizeof(struct sge_txq) * SGE_TXQ_PER_SET); | ||
561 | q->txq_stopped = 0; | ||
562 | memset(&q->tx_reclaim_timer, 0, sizeof(q->tx_reclaim_timer)); | ||
563 | } | ||
564 | |||
565 | |||
566 | /** | ||
542 | * free_qset - free the resources of an SGE queue set | 567 | * free_qset - free the resources of an SGE queue set |
543 | * @adapter: the adapter owning the queue set | 568 | * @adapter: the adapter owning the queue set |
544 | * @q: the queue set | 569 | * @q: the queue set |
@@ -594,7 +619,7 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q) | |||
594 | q->rspq.desc, q->rspq.phys_addr); | 619 | q->rspq.desc, q->rspq.phys_addr); |
595 | } | 620 | } |
596 | 621 | ||
597 | memset(q, 0, sizeof(*q)); | 622 | t3_reset_qset(q); |
598 | } | 623 | } |
599 | 624 | ||
600 | /** | 625 | /** |
@@ -1365,7 +1390,7 @@ static void restart_ctrlq(unsigned long data) | |||
1365 | */ | 1390 | */ |
1366 | int t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb) | 1391 | int t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb) |
1367 | { | 1392 | { |
1368 | int ret; | 1393 | int ret; |
1369 | local_bh_disable(); | 1394 | local_bh_disable(); |
1370 | ret = ctrl_xmit(adap, &adap->sge.qs[0].txq[TXQ_CTRL], skb); | 1395 | ret = ctrl_xmit(adap, &adap->sge.qs[0].txq[TXQ_CTRL], skb); |
1371 | local_bh_enable(); | 1396 | local_bh_enable(); |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index a99496a431c4..d405a932c73a 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -3264,6 +3264,7 @@ static void config_pcie(struct adapter *adap) | |||
3264 | 3264 | ||
3265 | t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); | 3265 | t3_write_reg(adap, A_PCIE_PEX_ERR, 0xffffffff); |
3266 | t3_set_reg_field(adap, A_PCIE_CFG, 0, | 3266 | t3_set_reg_field(adap, A_PCIE_CFG, 0, |
3267 | F_ENABLELINKDWNDRST | F_ENABLELINKDOWNRST | | ||
3267 | F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN); | 3268 | F_PCIE_DMASTOPEN | F_PCIE_CLIDECEN); |
3268 | } | 3269 | } |
3269 | 3270 | ||
@@ -3655,3 +3656,30 @@ void t3_led_ready(struct adapter *adapter) | |||
3655 | t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL, | 3656 | t3_set_reg_field(adapter, A_T3DBG_GPIO_EN, F_GPIO0_OUT_VAL, |
3656 | F_GPIO0_OUT_VAL); | 3657 | F_GPIO0_OUT_VAL); |
3657 | } | 3658 | } |
3659 | |||
3660 | int t3_replay_prep_adapter(struct adapter *adapter) | ||
3661 | { | ||
3662 | const struct adapter_info *ai = adapter->params.info; | ||
3663 | unsigned int i, j = 0; | ||
3664 | int ret; | ||
3665 | |||
3666 | early_hw_init(adapter, ai); | ||
3667 | ret = init_parity(adapter); | ||
3668 | if (ret) | ||
3669 | return ret; | ||
3670 | |||
3671 | for_each_port(adapter, i) { | ||
3672 | struct port_info *p = adap2pinfo(adapter, i); | ||
3673 | while (!adapter->params.vpd.port_type[j]) | ||
3674 | ++j; | ||
3675 | |||
3676 | p->port_type->phy_prep(&p->phy, adapter, ai->phy_base_addr + j, | ||
3677 | ai->mdio_ops); | ||
3678 | |||
3679 | p->phy.ops->power_down(&p->phy, 1); | ||
3680 | ++j; | ||
3681 | } | ||
3682 | |||
3683 | return 0; | ||
3684 | } | ||
3685 | |||
diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index 12b4626102e1..32a9a922f153 100644 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c | |||
@@ -117,6 +117,9 @@ typedef struct board_info { | |||
117 | 117 | ||
118 | struct mutex addr_lock; /* phy and eeprom access lock */ | 118 | struct mutex addr_lock; /* phy and eeprom access lock */ |
119 | 119 | ||
120 | struct delayed_work phy_poll; | ||
121 | struct net_device *ndev; | ||
122 | |||
120 | spinlock_t lock; | 123 | spinlock_t lock; |
121 | 124 | ||
122 | struct mii_if_info mii; | 125 | struct mii_if_info mii; |
@@ -297,6 +300,10 @@ static void dm9000_set_io(struct board_info *db, int byte_width) | |||
297 | } | 300 | } |
298 | } | 301 | } |
299 | 302 | ||
303 | static void dm9000_schedule_poll(board_info_t *db) | ||
304 | { | ||
305 | schedule_delayed_work(&db->phy_poll, HZ * 2); | ||
306 | } | ||
300 | 307 | ||
301 | /* Our watchdog timed out. Called by the networking layer */ | 308 | /* Our watchdog timed out. Called by the networking layer */ |
302 | static void dm9000_timeout(struct net_device *dev) | 309 | static void dm9000_timeout(struct net_device *dev) |
@@ -465,6 +472,17 @@ static const struct ethtool_ops dm9000_ethtool_ops = { | |||
465 | .set_eeprom = dm9000_set_eeprom, | 472 | .set_eeprom = dm9000_set_eeprom, |
466 | }; | 473 | }; |
467 | 474 | ||
475 | static void | ||
476 | dm9000_poll_work(struct work_struct *w) | ||
477 | { | ||
478 | struct delayed_work *dw = container_of(w, struct delayed_work, work); | ||
479 | board_info_t *db = container_of(dw, board_info_t, phy_poll); | ||
480 | |||
481 | mii_check_media(&db->mii, netif_msg_link(db), 0); | ||
482 | |||
483 | if (netif_running(db->ndev)) | ||
484 | dm9000_schedule_poll(db); | ||
485 | } | ||
468 | 486 | ||
469 | /* dm9000_release_board | 487 | /* dm9000_release_board |
470 | * | 488 | * |
@@ -503,7 +521,7 @@ dm9000_release_board(struct platform_device *pdev, struct board_info *db) | |||
503 | /* | 521 | /* |
504 | * Search DM9000 board, allocate space and register it | 522 | * Search DM9000 board, allocate space and register it |
505 | */ | 523 | */ |
506 | static int | 524 | static int __devinit |
507 | dm9000_probe(struct platform_device *pdev) | 525 | dm9000_probe(struct platform_device *pdev) |
508 | { | 526 | { |
509 | struct dm9000_plat_data *pdata = pdev->dev.platform_data; | 527 | struct dm9000_plat_data *pdata = pdev->dev.platform_data; |
@@ -525,17 +543,21 @@ dm9000_probe(struct platform_device *pdev) | |||
525 | 543 | ||
526 | SET_NETDEV_DEV(ndev, &pdev->dev); | 544 | SET_NETDEV_DEV(ndev, &pdev->dev); |
527 | 545 | ||
528 | dev_dbg(&pdev->dev, "dm9000_probe()"); | 546 | dev_dbg(&pdev->dev, "dm9000_probe()\n"); |
529 | 547 | ||
530 | /* setup board info structure */ | 548 | /* setup board info structure */ |
531 | db = (struct board_info *) ndev->priv; | 549 | db = (struct board_info *) ndev->priv; |
532 | memset(db, 0, sizeof (*db)); | 550 | memset(db, 0, sizeof (*db)); |
533 | 551 | ||
534 | db->dev = &pdev->dev; | 552 | db->dev = &pdev->dev; |
553 | db->ndev = ndev; | ||
535 | 554 | ||
536 | spin_lock_init(&db->lock); | 555 | spin_lock_init(&db->lock); |
537 | mutex_init(&db->addr_lock); | 556 | mutex_init(&db->addr_lock); |
538 | 557 | ||
558 | INIT_DELAYED_WORK(&db->phy_poll, dm9000_poll_work); | ||
559 | |||
560 | |||
539 | if (pdev->num_resources < 2) { | 561 | if (pdev->num_resources < 2) { |
540 | ret = -ENODEV; | 562 | ret = -ENODEV; |
541 | goto out; | 563 | goto out; |
@@ -761,6 +783,8 @@ dm9000_open(struct net_device *dev) | |||
761 | 783 | ||
762 | mii_check_media(&db->mii, netif_msg_link(db), 1); | 784 | mii_check_media(&db->mii, netif_msg_link(db), 1); |
763 | netif_start_queue(dev); | 785 | netif_start_queue(dev); |
786 | |||
787 | dm9000_schedule_poll(db); | ||
764 | 788 | ||
765 | return 0; | 789 | return 0; |
766 | } | 790 | } |
@@ -879,6 +903,8 @@ dm9000_stop(struct net_device *ndev) | |||
879 | if (netif_msg_ifdown(db)) | 903 | if (netif_msg_ifdown(db)) |
880 | dev_dbg(db->dev, "shutting down %s\n", ndev->name); | 904 | dev_dbg(db->dev, "shutting down %s\n", ndev->name); |
881 | 905 | ||
906 | cancel_delayed_work(&db->phy_poll); | ||
907 | |||
882 | netif_stop_queue(ndev); | 908 | netif_stop_queue(ndev); |
883 | netif_carrier_off(ndev); | 909 | netif_carrier_off(ndev); |
884 | 910 | ||
@@ -1288,6 +1314,8 @@ dm9000_phy_read(struct net_device *dev, int phy_reg_unused, int reg) | |||
1288 | spin_unlock_irqrestore(&db->lock,flags); | 1314 | spin_unlock_irqrestore(&db->lock,flags); |
1289 | 1315 | ||
1290 | mutex_unlock(&db->addr_lock); | 1316 | mutex_unlock(&db->addr_lock); |
1317 | |||
1318 | dm9000_dbg(db, 5, "phy_read[%02x] -> %04x\n", reg, ret); | ||
1291 | return ret; | 1319 | return ret; |
1292 | } | 1320 | } |
1293 | 1321 | ||
@@ -1301,6 +1329,7 @@ dm9000_phy_write(struct net_device *dev, int phyaddr_unused, int reg, int value) | |||
1301 | unsigned long flags; | 1329 | unsigned long flags; |
1302 | unsigned long reg_save; | 1330 | unsigned long reg_save; |
1303 | 1331 | ||
1332 | dm9000_dbg(db, 5, "phy_write[%02x] = %04x\n", reg, value); | ||
1304 | mutex_lock(&db->addr_lock); | 1333 | mutex_lock(&db->addr_lock); |
1305 | 1334 | ||
1306 | spin_lock_irqsave(&db->lock,flags); | 1335 | spin_lock_irqsave(&db->lock,flags); |
@@ -1372,7 +1401,7 @@ dm9000_drv_resume(struct platform_device *dev) | |||
1372 | return 0; | 1401 | return 0; |
1373 | } | 1402 | } |
1374 | 1403 | ||
1375 | static int | 1404 | static int __devexit |
1376 | dm9000_drv_remove(struct platform_device *pdev) | 1405 | dm9000_drv_remove(struct platform_device *pdev) |
1377 | { | 1406 | { |
1378 | struct net_device *ndev = platform_get_drvdata(pdev); | 1407 | struct net_device *ndev = platform_get_drvdata(pdev); |
@@ -1393,7 +1422,7 @@ static struct platform_driver dm9000_driver = { | |||
1393 | .owner = THIS_MODULE, | 1422 | .owner = THIS_MODULE, |
1394 | }, | 1423 | }, |
1395 | .probe = dm9000_probe, | 1424 | .probe = dm9000_probe, |
1396 | .remove = dm9000_drv_remove, | 1425 | .remove = __devexit_p(dm9000_drv_remove), |
1397 | .suspend = dm9000_drv_suspend, | 1426 | .suspend = dm9000_drv_suspend, |
1398 | .resume = dm9000_drv_resume, | 1427 | .resume = dm9000_drv_resume, |
1399 | }; | 1428 | }; |
diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h index 2a53875cddbf..f823b8ba5785 100644 --- a/drivers/net/e1000e/defines.h +++ b/drivers/net/e1000e/defines.h | |||
@@ -648,6 +648,8 @@ | |||
648 | #define IFE_E_PHY_ID 0x02A80330 | 648 | #define IFE_E_PHY_ID 0x02A80330 |
649 | #define IFE_PLUS_E_PHY_ID 0x02A80320 | 649 | #define IFE_PLUS_E_PHY_ID 0x02A80320 |
650 | #define IFE_C_E_PHY_ID 0x02A80310 | 650 | #define IFE_C_E_PHY_ID 0x02A80310 |
651 | #define BME1000_E_PHY_ID 0x01410CB0 | ||
652 | #define BME1000_E_PHY_ID_R2 0x01410CB1 | ||
651 | 653 | ||
652 | /* M88E1000 Specific Registers */ | 654 | /* M88E1000 Specific Registers */ |
653 | #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ | 655 | #define M88E1000_PHY_SPEC_CTRL 0x10 /* PHY Specific Control Register */ |
@@ -701,6 +703,14 @@ | |||
701 | #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 | 703 | #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_MASK 0x0E00 |
702 | #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 | 704 | #define M88EC018_EPSCR_DOWNSHIFT_COUNTER_5X 0x0800 |
703 | 705 | ||
706 | /* BME1000 PHY Specific Control Register */ | ||
707 | #define BME1000_PSCR_ENABLE_DOWNSHIFT 0x0800 /* 1 = enable downshift */ | ||
708 | |||
709 | |||
710 | #define PHY_PAGE_SHIFT 5 | ||
711 | #define PHY_REG(page, reg) (((page) << PHY_PAGE_SHIFT) | \ | ||
712 | ((reg) & MAX_PHY_REG_ADDRESS)) | ||
713 | |||
704 | /* | 714 | /* |
705 | * Bits... | 715 | * Bits... |
706 | * 15-5: page | 716 | * 15-5: page |
diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h index 38bfd0d261fe..d3bc6f8101fa 100644 --- a/drivers/net/e1000e/e1000.h +++ b/drivers/net/e1000e/e1000.h | |||
@@ -127,7 +127,7 @@ struct e1000_buffer { | |||
127 | /* arrays of page information for packet split */ | 127 | /* arrays of page information for packet split */ |
128 | struct e1000_ps_page *ps_pages; | 128 | struct e1000_ps_page *ps_pages; |
129 | }; | 129 | }; |
130 | 130 | struct page *page; | |
131 | }; | 131 | }; |
132 | 132 | ||
133 | struct e1000_ring { | 133 | struct e1000_ring { |
@@ -304,6 +304,7 @@ struct e1000_info { | |||
304 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) | 304 | #define FLAG_HAS_CTRLEXT_ON_LOAD (1 << 5) |
305 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) | 305 | #define FLAG_HAS_SWSM_ON_LOAD (1 << 6) |
306 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) | 306 | #define FLAG_HAS_JUMBO_FRAMES (1 << 7) |
307 | #define FLAG_IS_ICH (1 << 9) | ||
307 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) | 308 | #define FLAG_HAS_SMART_POWER_DOWN (1 << 11) |
308 | #define FLAG_IS_QUAD_PORT_A (1 << 12) | 309 | #define FLAG_IS_QUAD_PORT_A (1 << 12) |
309 | #define FLAG_IS_QUAD_PORT (1 << 13) | 310 | #define FLAG_IS_QUAD_PORT (1 << 13) |
@@ -386,6 +387,7 @@ extern void e1000e_set_kmrn_lock_loss_workaround_ich8lan(struct e1000_hw *hw, | |||
386 | bool state); | 387 | bool state); |
387 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); | 388 | extern void e1000e_igp3_phy_powerdown_workaround_ich8lan(struct e1000_hw *hw); |
388 | extern void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); | 389 | extern void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw); |
390 | extern void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw); | ||
389 | 391 | ||
390 | extern s32 e1000e_check_for_copper_link(struct e1000_hw *hw); | 392 | extern s32 e1000e_check_for_copper_link(struct e1000_hw *hw); |
391 | extern s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); | 393 | extern s32 e1000e_check_for_fiber_link(struct e1000_hw *hw); |
@@ -443,6 +445,9 @@ extern s32 e1000e_get_phy_info_m88(struct e1000_hw *hw); | |||
443 | extern s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); | 445 | extern s32 e1000e_read_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 *data); |
444 | extern s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); | 446 | extern s32 e1000e_write_phy_reg_m88(struct e1000_hw *hw, u32 offset, u16 data); |
445 | extern enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id); | 447 | extern enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id); |
448 | extern s32 e1000e_determine_phy_address(struct e1000_hw *hw); | ||
449 | extern s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data); | ||
450 | extern s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data); | ||
446 | extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); | 451 | extern void e1000e_phy_force_speed_duplex_setup(struct e1000_hw *hw, u16 *phy_ctrl); |
447 | extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); | 452 | extern s32 e1000e_write_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 data); |
448 | extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); | 453 | extern s32 e1000e_read_kmrn_reg(struct e1000_hw *hw, u32 offset, u16 *data); |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index ce045acce63e..a14561f40db0 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -494,8 +494,12 @@ static int e1000_get_eeprom(struct net_device *netdev, | |||
494 | for (i = 0; i < last_word - first_word + 1; i++) { | 494 | for (i = 0; i < last_word - first_word + 1; i++) { |
495 | ret_val = e1000_read_nvm(hw, first_word + i, 1, | 495 | ret_val = e1000_read_nvm(hw, first_word + i, 1, |
496 | &eeprom_buff[i]); | 496 | &eeprom_buff[i]); |
497 | if (ret_val) | 497 | if (ret_val) { |
498 | /* a read error occurred, throw away the | ||
499 | * result */ | ||
500 | memset(eeprom_buff, 0xff, sizeof(eeprom_buff)); | ||
498 | break; | 501 | break; |
502 | } | ||
499 | } | 503 | } |
500 | } | 504 | } |
501 | 505 | ||
@@ -803,8 +807,7 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) | |||
803 | /* restore previous status */ | 807 | /* restore previous status */ |
804 | ew32(STATUS, before); | 808 | ew32(STATUS, before); |
805 | 809 | ||
806 | if ((mac->type != e1000_ich8lan) && | 810 | if (!(adapter->flags & FLAG_IS_ICH)) { |
807 | (mac->type != e1000_ich9lan)) { | ||
808 | REG_PATTERN_TEST(E1000_FCAL, 0xFFFFFFFF, 0xFFFFFFFF); | 811 | REG_PATTERN_TEST(E1000_FCAL, 0xFFFFFFFF, 0xFFFFFFFF); |
809 | REG_PATTERN_TEST(E1000_FCAH, 0x0000FFFF, 0xFFFFFFFF); | 812 | REG_PATTERN_TEST(E1000_FCAH, 0x0000FFFF, 0xFFFFFFFF); |
810 | REG_PATTERN_TEST(E1000_FCT, 0x0000FFFF, 0xFFFFFFFF); | 813 | REG_PATTERN_TEST(E1000_FCT, 0x0000FFFF, 0xFFFFFFFF); |
@@ -824,15 +827,13 @@ static int e1000_reg_test(struct e1000_adapter *adapter, u64 *data) | |||
824 | 827 | ||
825 | REG_SET_AND_CHECK(E1000_RCTL, 0xFFFFFFFF, 0x00000000); | 828 | REG_SET_AND_CHECK(E1000_RCTL, 0xFFFFFFFF, 0x00000000); |
826 | 829 | ||
827 | before = (((mac->type == e1000_ich8lan) || | 830 | before = ((adapter->flags & FLAG_IS_ICH) ? 0x06C3B33E : 0x06DFB3FE); |
828 | (mac->type == e1000_ich9lan)) ? 0x06C3B33E : 0x06DFB3FE); | ||
829 | REG_SET_AND_CHECK(E1000_RCTL, before, 0x003FFFFB); | 831 | REG_SET_AND_CHECK(E1000_RCTL, before, 0x003FFFFB); |
830 | REG_SET_AND_CHECK(E1000_TCTL, 0xFFFFFFFF, 0x00000000); | 832 | REG_SET_AND_CHECK(E1000_TCTL, 0xFFFFFFFF, 0x00000000); |
831 | 833 | ||
832 | REG_SET_AND_CHECK(E1000_RCTL, before, 0xFFFFFFFF); | 834 | REG_SET_AND_CHECK(E1000_RCTL, before, 0xFFFFFFFF); |
833 | REG_PATTERN_TEST(E1000_RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); | 835 | REG_PATTERN_TEST(E1000_RDBAL, 0xFFFFFFF0, 0xFFFFFFFF); |
834 | if ((mac->type != e1000_ich8lan) && | 836 | if (!(adapter->flags & FLAG_IS_ICH)) |
835 | (mac->type != e1000_ich9lan)) | ||
836 | REG_PATTERN_TEST(E1000_TXCW, 0xC000FFFF, 0x0000FFFF); | 837 | REG_PATTERN_TEST(E1000_TXCW, 0xC000FFFF, 0x0000FFFF); |
837 | REG_PATTERN_TEST(E1000_TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); | 838 | REG_PATTERN_TEST(E1000_TDBAL, 0xFFFFFFF0, 0xFFFFFFFF); |
838 | REG_PATTERN_TEST(E1000_TIDV, 0x0000FFFF, 0x0000FFFF); | 839 | REG_PATTERN_TEST(E1000_TIDV, 0x0000FFFF, 0x0000FFFF); |
@@ -911,9 +912,7 @@ static int e1000_intr_test(struct e1000_adapter *adapter, u64 *data) | |||
911 | 912 | ||
912 | /* Test each interrupt */ | 913 | /* Test each interrupt */ |
913 | for (i = 0; i < 10; i++) { | 914 | for (i = 0; i < 10; i++) { |
914 | 915 | if ((adapter->flags & FLAG_IS_ICH) && (i == 8)) | |
915 | if (((adapter->hw.mac.type == e1000_ich8lan) || | ||
916 | (adapter->hw.mac.type == e1000_ich9lan)) && i == 8) | ||
917 | continue; | 916 | continue; |
918 | 917 | ||
919 | /* Interrupt to test */ | 918 | /* Interrupt to test */ |
@@ -1184,6 +1183,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1184 | struct e1000_hw *hw = &adapter->hw; | 1183 | struct e1000_hw *hw = &adapter->hw; |
1185 | u32 ctrl_reg = 0; | 1184 | u32 ctrl_reg = 0; |
1186 | u32 stat_reg = 0; | 1185 | u32 stat_reg = 0; |
1186 | u16 phy_reg = 0; | ||
1187 | 1187 | ||
1188 | hw->mac.autoneg = 0; | 1188 | hw->mac.autoneg = 0; |
1189 | 1189 | ||
@@ -1211,6 +1211,28 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1211 | E1000_CTRL_SPD_100 |/* Force Speed to 100 */ | 1211 | E1000_CTRL_SPD_100 |/* Force Speed to 100 */ |
1212 | E1000_CTRL_FD); /* Force Duplex to FULL */ | 1212 | E1000_CTRL_FD); /* Force Duplex to FULL */ |
1213 | break; | 1213 | break; |
1214 | case e1000_phy_bm: | ||
1215 | /* Set Default MAC Interface speed to 1GB */ | ||
1216 | e1e_rphy(hw, PHY_REG(2, 21), &phy_reg); | ||
1217 | phy_reg &= ~0x0007; | ||
1218 | phy_reg |= 0x006; | ||
1219 | e1e_wphy(hw, PHY_REG(2, 21), phy_reg); | ||
1220 | /* Assert SW reset for above settings to take effect */ | ||
1221 | e1000e_commit_phy(hw); | ||
1222 | mdelay(1); | ||
1223 | /* Force Full Duplex */ | ||
1224 | e1e_rphy(hw, PHY_REG(769, 16), &phy_reg); | ||
1225 | e1e_wphy(hw, PHY_REG(769, 16), phy_reg | 0x000C); | ||
1226 | /* Set Link Up (in force link) */ | ||
1227 | e1e_rphy(hw, PHY_REG(776, 16), &phy_reg); | ||
1228 | e1e_wphy(hw, PHY_REG(776, 16), phy_reg | 0x0040); | ||
1229 | /* Force Link */ | ||
1230 | e1e_rphy(hw, PHY_REG(769, 16), &phy_reg); | ||
1231 | e1e_wphy(hw, PHY_REG(769, 16), phy_reg | 0x0040); | ||
1232 | /* Set Early Link Enable */ | ||
1233 | e1e_rphy(hw, PHY_REG(769, 20), &phy_reg); | ||
1234 | e1e_wphy(hw, PHY_REG(769, 20), phy_reg | 0x0400); | ||
1235 | /* fall through */ | ||
1214 | default: | 1236 | default: |
1215 | /* force 1000, set loopback */ | 1237 | /* force 1000, set loopback */ |
1216 | e1e_wphy(hw, PHY_CONTROL, 0x4140); | 1238 | e1e_wphy(hw, PHY_CONTROL, 0x4140); |
@@ -1224,8 +1246,7 @@ static int e1000_integrated_phy_loopback(struct e1000_adapter *adapter) | |||
1224 | E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */ | 1246 | E1000_CTRL_SPD_1000 |/* Force Speed to 1000 */ |
1225 | E1000_CTRL_FD); /* Force Duplex to FULL */ | 1247 | E1000_CTRL_FD); /* Force Duplex to FULL */ |
1226 | 1248 | ||
1227 | if ((adapter->hw.mac.type == e1000_ich8lan) || | 1249 | if (adapter->flags & FLAG_IS_ICH) |
1228 | (adapter->hw.mac.type == e1000_ich9lan)) | ||
1229 | ctrl_reg |= E1000_CTRL_SLU; /* Set Link Up */ | 1250 | ctrl_reg |= E1000_CTRL_SLU; /* Set Link Up */ |
1230 | } | 1251 | } |
1231 | 1252 | ||
diff --git a/drivers/net/e1000e/hw.h b/drivers/net/e1000e/hw.h index a930e6d9cf02..74f263acb172 100644 --- a/drivers/net/e1000e/hw.h +++ b/drivers/net/e1000e/hw.h | |||
@@ -216,6 +216,21 @@ enum e1e_registers { | |||
216 | #define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ | 216 | #define IGP01E1000_PHY_LINK_HEALTH 0x13 /* PHY Link Health */ |
217 | #define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ | 217 | #define IGP02E1000_PHY_POWER_MGMT 0x19 /* Power Management */ |
218 | #define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ | 218 | #define IGP01E1000_PHY_PAGE_SELECT 0x1F /* Page Select */ |
219 | #define BM_PHY_PAGE_SELECT 22 /* Page Select for BM */ | ||
220 | #define IGP_PAGE_SHIFT 5 | ||
221 | #define PHY_REG_MASK 0x1F | ||
222 | |||
223 | #define BM_WUC_PAGE 800 | ||
224 | #define BM_WUC_ADDRESS_OPCODE 0x11 | ||
225 | #define BM_WUC_DATA_OPCODE 0x12 | ||
226 | #define BM_WUC_ENABLE_PAGE 769 | ||
227 | #define BM_WUC_ENABLE_REG 17 | ||
228 | #define BM_WUC_ENABLE_BIT (1 << 2) | ||
229 | #define BM_WUC_HOST_WU_BIT (1 << 4) | ||
230 | |||
231 | #define BM_WUC PHY_REG(BM_WUC_PAGE, 1) | ||
232 | #define BM_WUFC PHY_REG(BM_WUC_PAGE, 2) | ||
233 | #define BM_WUS PHY_REG(BM_WUC_PAGE, 3) | ||
219 | 234 | ||
220 | #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 | 235 | #define IGP01E1000_PHY_PCS_INIT_REG 0x00B4 |
221 | #define IGP01E1000_PHY_POLARITY_MASK 0x0078 | 236 | #define IGP01E1000_PHY_POLARITY_MASK 0x0078 |
@@ -331,10 +346,16 @@ enum e1e_registers { | |||
331 | #define E1000_DEV_ID_ICH8_IFE_G 0x10C5 | 346 | #define E1000_DEV_ID_ICH8_IFE_G 0x10C5 |
332 | #define E1000_DEV_ID_ICH8_IGP_M 0x104D | 347 | #define E1000_DEV_ID_ICH8_IGP_M 0x104D |
333 | #define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD | 348 | #define E1000_DEV_ID_ICH9_IGP_AMT 0x10BD |
349 | #define E1000_DEV_ID_ICH9_IGP_M_AMT 0x10F5 | ||
350 | #define E1000_DEV_ID_ICH9_IGP_M 0x10BF | ||
351 | #define E1000_DEV_ID_ICH9_IGP_M_V 0x10CB | ||
334 | #define E1000_DEV_ID_ICH9_IGP_C 0x294C | 352 | #define E1000_DEV_ID_ICH9_IGP_C 0x294C |
335 | #define E1000_DEV_ID_ICH9_IFE 0x10C0 | 353 | #define E1000_DEV_ID_ICH9_IFE 0x10C0 |
336 | #define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 | 354 | #define E1000_DEV_ID_ICH9_IFE_GT 0x10C3 |
337 | #define E1000_DEV_ID_ICH9_IFE_G 0x10C2 | 355 | #define E1000_DEV_ID_ICH9_IFE_G 0x10C2 |
356 | #define E1000_DEV_ID_ICH10_R_BM_LM 0x10CC | ||
357 | #define E1000_DEV_ID_ICH10_R_BM_LF 0x10CD | ||
358 | #define E1000_DEV_ID_ICH10_R_BM_V 0x10CE | ||
338 | 359 | ||
339 | #define E1000_FUNC_1 1 | 360 | #define E1000_FUNC_1 1 |
340 | 361 | ||
@@ -378,6 +399,7 @@ enum e1000_phy_type { | |||
378 | e1000_phy_gg82563, | 399 | e1000_phy_gg82563, |
379 | e1000_phy_igp_3, | 400 | e1000_phy_igp_3, |
380 | e1000_phy_ife, | 401 | e1000_phy_ife, |
402 | e1000_phy_bm, | ||
381 | }; | 403 | }; |
382 | 404 | ||
383 | enum e1000_bus_width { | 405 | enum e1000_bus_width { |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 768485dbb2c6..9e38452a738c 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
@@ -38,6 +38,12 @@ | |||
38 | * 82566DM Gigabit Network Connection | 38 | * 82566DM Gigabit Network Connection |
39 | * 82566MC Gigabit Network Connection | 39 | * 82566MC Gigabit Network Connection |
40 | * 82566MM Gigabit Network Connection | 40 | * 82566MM Gigabit Network Connection |
41 | * 82567LM Gigabit Network Connection | ||
42 | * 82567LF Gigabit Network Connection | ||
43 | * 82567LM-2 Gigabit Network Connection | ||
44 | * 82567LF-2 Gigabit Network Connection | ||
45 | * 82567V-2 Gigabit Network Connection | ||
46 | * 82562GT-3 10/100 Network Connection | ||
41 | */ | 47 | */ |
42 | 48 | ||
43 | #include <linux/netdevice.h> | 49 | #include <linux/netdevice.h> |
@@ -198,6 +204,19 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) | |||
198 | phy->addr = 1; | 204 | phy->addr = 1; |
199 | phy->reset_delay_us = 100; | 205 | phy->reset_delay_us = 100; |
200 | 206 | ||
207 | /* | ||
208 | * We may need to do this twice - once for IGP and if that fails, | ||
209 | * we'll set BM func pointers and try again | ||
210 | */ | ||
211 | ret_val = e1000e_determine_phy_address(hw); | ||
212 | if (ret_val) { | ||
213 | hw->phy.ops.write_phy_reg = e1000e_write_phy_reg_bm; | ||
214 | hw->phy.ops.read_phy_reg = e1000e_read_phy_reg_bm; | ||
215 | ret_val = e1000e_determine_phy_address(hw); | ||
216 | if (ret_val) | ||
217 | return ret_val; | ||
218 | } | ||
219 | |||
201 | phy->id = 0; | 220 | phy->id = 0; |
202 | while ((e1000_phy_unknown == e1000e_get_phy_type_from_id(phy->id)) && | 221 | while ((e1000_phy_unknown == e1000e_get_phy_type_from_id(phy->id)) && |
203 | (i++ < 100)) { | 222 | (i++ < 100)) { |
@@ -219,6 +238,13 @@ static s32 e1000_init_phy_params_ich8lan(struct e1000_hw *hw) | |||
219 | phy->type = e1000_phy_ife; | 238 | phy->type = e1000_phy_ife; |
220 | phy->autoneg_mask = E1000_ALL_NOT_GIG; | 239 | phy->autoneg_mask = E1000_ALL_NOT_GIG; |
221 | break; | 240 | break; |
241 | case BME1000_E_PHY_ID: | ||
242 | phy->type = e1000_phy_bm; | ||
243 | phy->autoneg_mask = AUTONEG_ADVERTISE_SPEED_DEFAULT; | ||
244 | hw->phy.ops.read_phy_reg = e1000e_read_phy_reg_bm; | ||
245 | hw->phy.ops.write_phy_reg = e1000e_write_phy_reg_bm; | ||
246 | hw->phy.ops.commit_phy = e1000e_phy_sw_reset; | ||
247 | break; | ||
222 | default: | 248 | default: |
223 | return -E1000_ERR_PHY; | 249 | return -E1000_ERR_PHY; |
224 | break; | 250 | break; |
@@ -664,6 +690,7 @@ static s32 e1000_get_phy_info_ich8lan(struct e1000_hw *hw) | |||
664 | return e1000_get_phy_info_ife_ich8lan(hw); | 690 | return e1000_get_phy_info_ife_ich8lan(hw); |
665 | break; | 691 | break; |
666 | case e1000_phy_igp_3: | 692 | case e1000_phy_igp_3: |
693 | case e1000_phy_bm: | ||
667 | return e1000e_get_phy_info_igp(hw); | 694 | return e1000e_get_phy_info_igp(hw); |
668 | break; | 695 | break; |
669 | default: | 696 | default: |
@@ -728,7 +755,7 @@ static s32 e1000_set_d0_lplu_state_ich8lan(struct e1000_hw *hw, bool active) | |||
728 | s32 ret_val = 0; | 755 | s32 ret_val = 0; |
729 | u16 data; | 756 | u16 data; |
730 | 757 | ||
731 | if (phy->type != e1000_phy_igp_3) | 758 | if (phy->type == e1000_phy_ife) |
732 | return ret_val; | 759 | return ret_val; |
733 | 760 | ||
734 | phy_ctrl = er32(PHY_CTRL); | 761 | phy_ctrl = er32(PHY_CTRL); |
@@ -1918,8 +1945,35 @@ static s32 e1000_setup_copper_link_ich8lan(struct e1000_hw *hw) | |||
1918 | ret_val = e1000e_copper_link_setup_igp(hw); | 1945 | ret_val = e1000e_copper_link_setup_igp(hw); |
1919 | if (ret_val) | 1946 | if (ret_val) |
1920 | return ret_val; | 1947 | return ret_val; |
1948 | } else if (hw->phy.type == e1000_phy_bm) { | ||
1949 | ret_val = e1000e_copper_link_setup_m88(hw); | ||
1950 | if (ret_val) | ||
1951 | return ret_val; | ||
1921 | } | 1952 | } |
1922 | 1953 | ||
1954 | if (hw->phy.type == e1000_phy_ife) { | ||
1955 | ret_val = e1e_rphy(hw, IFE_PHY_MDIX_CONTROL, ®_data); | ||
1956 | if (ret_val) | ||
1957 | return ret_val; | ||
1958 | |||
1959 | reg_data &= ~IFE_PMC_AUTO_MDIX; | ||
1960 | |||
1961 | switch (hw->phy.mdix) { | ||
1962 | case 1: | ||
1963 | reg_data &= ~IFE_PMC_FORCE_MDIX; | ||
1964 | break; | ||
1965 | case 2: | ||
1966 | reg_data |= IFE_PMC_FORCE_MDIX; | ||
1967 | break; | ||
1968 | case 0: | ||
1969 | default: | ||
1970 | reg_data |= IFE_PMC_AUTO_MDIX; | ||
1971 | break; | ||
1972 | } | ||
1973 | ret_val = e1e_wphy(hw, IFE_PHY_MDIX_CONTROL, reg_data); | ||
1974 | if (ret_val) | ||
1975 | return ret_val; | ||
1976 | } | ||
1923 | return e1000e_setup_copper_link(hw); | 1977 | return e1000e_setup_copper_link(hw); |
1924 | } | 1978 | } |
1925 | 1979 | ||
@@ -2127,6 +2181,31 @@ void e1000e_gig_downshift_workaround_ich8lan(struct e1000_hw *hw) | |||
2127 | } | 2181 | } |
2128 | 2182 | ||
2129 | /** | 2183 | /** |
2184 | * e1000e_disable_gig_wol_ich8lan - disable gig during WoL | ||
2185 | * @hw: pointer to the HW structure | ||
2186 | * | ||
2187 | * During S0 to Sx transition, it is possible the link remains at gig | ||
2188 | * instead of negotiating to a lower speed. Before going to Sx, set | ||
2189 | * 'LPLU Enabled' and 'Gig Disable' to force link speed negotiation | ||
2190 | * to a lower speed. | ||
2191 | * | ||
2192 | * Should only be called for ICH9 devices. | ||
2193 | **/ | ||
2194 | void e1000e_disable_gig_wol_ich8lan(struct e1000_hw *hw) | ||
2195 | { | ||
2196 | u32 phy_ctrl; | ||
2197 | |||
2198 | if (hw->mac.type == e1000_ich9lan) { | ||
2199 | phy_ctrl = er32(PHY_CTRL); | ||
2200 | phy_ctrl |= E1000_PHY_CTRL_D0A_LPLU | | ||
2201 | E1000_PHY_CTRL_GBE_DISABLE; | ||
2202 | ew32(PHY_CTRL, phy_ctrl); | ||
2203 | } | ||
2204 | |||
2205 | return; | ||
2206 | } | ||
2207 | |||
2208 | /** | ||
2130 | * e1000_cleanup_led_ich8lan - Restore the default LED operation | 2209 | * e1000_cleanup_led_ich8lan - Restore the default LED operation |
2131 | * @hw: pointer to the HW structure | 2210 | * @hw: pointer to the HW structure |
2132 | * | 2211 | * |
@@ -2247,6 +2326,7 @@ static struct e1000_nvm_operations ich8_nvm_ops = { | |||
2247 | struct e1000_info e1000_ich8_info = { | 2326 | struct e1000_info e1000_ich8_info = { |
2248 | .mac = e1000_ich8lan, | 2327 | .mac = e1000_ich8lan, |
2249 | .flags = FLAG_HAS_WOL | 2328 | .flags = FLAG_HAS_WOL |
2329 | | FLAG_IS_ICH | ||
2250 | | FLAG_RX_CSUM_ENABLED | 2330 | | FLAG_RX_CSUM_ENABLED |
2251 | | FLAG_HAS_CTRLEXT_ON_LOAD | 2331 | | FLAG_HAS_CTRLEXT_ON_LOAD |
2252 | | FLAG_HAS_AMT | 2332 | | FLAG_HAS_AMT |
@@ -2262,6 +2342,7 @@ struct e1000_info e1000_ich8_info = { | |||
2262 | struct e1000_info e1000_ich9_info = { | 2342 | struct e1000_info e1000_ich9_info = { |
2263 | .mac = e1000_ich9lan, | 2343 | .mac = e1000_ich9lan, |
2264 | .flags = FLAG_HAS_JUMBO_FRAMES | 2344 | .flags = FLAG_HAS_JUMBO_FRAMES |
2345 | | FLAG_IS_ICH | ||
2265 | | FLAG_HAS_WOL | 2346 | | FLAG_HAS_WOL |
2266 | | FLAG_RX_CSUM_ENABLED | 2347 | | FLAG_RX_CSUM_ENABLED |
2267 | | FLAG_HAS_CTRLEXT_ON_LOAD | 2348 | | FLAG_HAS_CTRLEXT_ON_LOAD |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 8991ab8911e2..8cbb40f3a506 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -43,10 +43,11 @@ | |||
43 | #include <linux/if_vlan.h> | 43 | #include <linux/if_vlan.h> |
44 | #include <linux/cpu.h> | 44 | #include <linux/cpu.h> |
45 | #include <linux/smp.h> | 45 | #include <linux/smp.h> |
46 | #include <linux/pm_qos_params.h> | ||
46 | 47 | ||
47 | #include "e1000.h" | 48 | #include "e1000.h" |
48 | 49 | ||
49 | #define DRV_VERSION "0.2.1" | 50 | #define DRV_VERSION "0.3.3.3-k2" |
50 | char e1000e_driver_name[] = "e1000e"; | 51 | char e1000e_driver_name[] = "e1000e"; |
51 | const char e1000e_driver_version[] = DRV_VERSION; | 52 | const char e1000e_driver_version[] = DRV_VERSION; |
52 | 53 | ||
@@ -341,6 +342,89 @@ no_buffers: | |||
341 | } | 342 | } |
342 | 343 | ||
343 | /** | 344 | /** |
345 | * e1000_alloc_jumbo_rx_buffers - Replace used jumbo receive buffers | ||
346 | * @adapter: address of board private structure | ||
347 | * @rx_ring: pointer to receive ring structure | ||
348 | * @cleaned_count: number of buffers to allocate this pass | ||
349 | **/ | ||
350 | |||
351 | static void e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter, | ||
352 | int cleaned_count) | ||
353 | { | ||
354 | struct net_device *netdev = adapter->netdev; | ||
355 | struct pci_dev *pdev = adapter->pdev; | ||
356 | struct e1000_rx_desc *rx_desc; | ||
357 | struct e1000_ring *rx_ring = adapter->rx_ring; | ||
358 | struct e1000_buffer *buffer_info; | ||
359 | struct sk_buff *skb; | ||
360 | unsigned int i; | ||
361 | unsigned int bufsz = 256 - | ||
362 | 16 /* for skb_reserve */ - | ||
363 | NET_IP_ALIGN; | ||
364 | |||
365 | i = rx_ring->next_to_use; | ||
366 | buffer_info = &rx_ring->buffer_info[i]; | ||
367 | |||
368 | while (cleaned_count--) { | ||
369 | skb = buffer_info->skb; | ||
370 | if (skb) { | ||
371 | skb_trim(skb, 0); | ||
372 | goto check_page; | ||
373 | } | ||
374 | |||
375 | skb = netdev_alloc_skb(netdev, bufsz); | ||
376 | if (unlikely(!skb)) { | ||
377 | /* Better luck next round */ | ||
378 | adapter->alloc_rx_buff_failed++; | ||
379 | break; | ||
380 | } | ||
381 | |||
382 | /* Make buffer alignment 2 beyond a 16 byte boundary | ||
383 | * this will result in a 16 byte aligned IP header after | ||
384 | * the 14 byte MAC header is removed | ||
385 | */ | ||
386 | skb_reserve(skb, NET_IP_ALIGN); | ||
387 | |||
388 | buffer_info->skb = skb; | ||
389 | check_page: | ||
390 | /* allocate a new page if necessary */ | ||
391 | if (!buffer_info->page) { | ||
392 | buffer_info->page = alloc_page(GFP_ATOMIC); | ||
393 | if (unlikely(!buffer_info->page)) { | ||
394 | adapter->alloc_rx_buff_failed++; | ||
395 | break; | ||
396 | } | ||
397 | } | ||
398 | |||
399 | if (!buffer_info->dma) | ||
400 | buffer_info->dma = pci_map_page(pdev, | ||
401 | buffer_info->page, 0, | ||
402 | PAGE_SIZE, | ||
403 | PCI_DMA_FROMDEVICE); | ||
404 | |||
405 | rx_desc = E1000_RX_DESC(*rx_ring, i); | ||
406 | rx_desc->buffer_addr = cpu_to_le64(buffer_info->dma); | ||
407 | |||
408 | if (unlikely(++i == rx_ring->count)) | ||
409 | i = 0; | ||
410 | buffer_info = &rx_ring->buffer_info[i]; | ||
411 | } | ||
412 | |||
413 | if (likely(rx_ring->next_to_use != i)) { | ||
414 | rx_ring->next_to_use = i; | ||
415 | if (unlikely(i-- == 0)) | ||
416 | i = (rx_ring->count - 1); | ||
417 | |||
418 | /* Force memory writes to complete before letting h/w | ||
419 | * know there are new descriptors to fetch. (Only | ||
420 | * applicable for weak-ordered memory model archs, | ||
421 | * such as IA-64). */ | ||
422 | wmb(); | ||
423 | writel(i, adapter->hw.hw_addr + rx_ring->tail); | ||
424 | } | ||
425 | } | ||
426 | |||
427 | /** | ||
344 | * e1000_clean_rx_irq - Send received data up the network stack; legacy | 428 | * e1000_clean_rx_irq - Send received data up the network stack; legacy |
345 | * @adapter: board private structure | 429 | * @adapter: board private structure |
346 | * | 430 | * |
@@ -783,6 +867,186 @@ next_desc: | |||
783 | } | 867 | } |
784 | 868 | ||
785 | /** | 869 | /** |
870 | * e1000_consume_page - helper function | ||
871 | **/ | ||
872 | static void e1000_consume_page(struct e1000_buffer *bi, struct sk_buff *skb, | ||
873 | u16 length) | ||
874 | { | ||
875 | bi->page = NULL; | ||
876 | skb->len += length; | ||
877 | skb->data_len += length; | ||
878 | skb->truesize += length; | ||
879 | } | ||
880 | |||
881 | /** | ||
882 | * e1000_clean_jumbo_rx_irq - Send received data up the network stack; legacy | ||
883 | * @adapter: board private structure | ||
884 | * | ||
885 | * the return value indicates whether actual cleaning was done, there | ||
886 | * is no guarantee that everything was cleaned | ||
887 | **/ | ||
888 | |||
889 | static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, | ||
890 | int *work_done, int work_to_do) | ||
891 | { | ||
892 | struct net_device *netdev = adapter->netdev; | ||
893 | struct pci_dev *pdev = adapter->pdev; | ||
894 | struct e1000_ring *rx_ring = adapter->rx_ring; | ||
895 | struct e1000_rx_desc *rx_desc, *next_rxd; | ||
896 | struct e1000_buffer *buffer_info, *next_buffer; | ||
897 | u32 length; | ||
898 | unsigned int i; | ||
899 | int cleaned_count = 0; | ||
900 | bool cleaned = false; | ||
901 | unsigned int total_rx_bytes=0, total_rx_packets=0; | ||
902 | |||
903 | i = rx_ring->next_to_clean; | ||
904 | rx_desc = E1000_RX_DESC(*rx_ring, i); | ||
905 | buffer_info = &rx_ring->buffer_info[i]; | ||
906 | |||
907 | while (rx_desc->status & E1000_RXD_STAT_DD) { | ||
908 | struct sk_buff *skb; | ||
909 | u8 status; | ||
910 | |||
911 | if (*work_done >= work_to_do) | ||
912 | break; | ||
913 | (*work_done)++; | ||
914 | |||
915 | status = rx_desc->status; | ||
916 | skb = buffer_info->skb; | ||
917 | buffer_info->skb = NULL; | ||
918 | |||
919 | ++i; | ||
920 | if (i == rx_ring->count) | ||
921 | i = 0; | ||
922 | next_rxd = E1000_RX_DESC(*rx_ring, i); | ||
923 | prefetch(next_rxd); | ||
924 | |||
925 | next_buffer = &rx_ring->buffer_info[i]; | ||
926 | |||
927 | cleaned = true; | ||
928 | cleaned_count++; | ||
929 | pci_unmap_page(pdev, buffer_info->dma, PAGE_SIZE, | ||
930 | PCI_DMA_FROMDEVICE); | ||
931 | buffer_info->dma = 0; | ||
932 | |||
933 | length = le16_to_cpu(rx_desc->length); | ||
934 | |||
935 | /* errors is only valid for DD + EOP descriptors */ | ||
936 | if (unlikely((status & E1000_RXD_STAT_EOP) && | ||
937 | (rx_desc->errors & E1000_RXD_ERR_FRAME_ERR_MASK))) { | ||
938 | /* recycle both page and skb */ | ||
939 | buffer_info->skb = skb; | ||
940 | /* an error means any chain goes out the window | ||
941 | * too */ | ||
942 | if (rx_ring->rx_skb_top) | ||
943 | dev_kfree_skb(rx_ring->rx_skb_top); | ||
944 | rx_ring->rx_skb_top = NULL; | ||
945 | goto next_desc; | ||
946 | } | ||
947 | |||
948 | #define rxtop rx_ring->rx_skb_top | ||
949 | if (!(status & E1000_RXD_STAT_EOP)) { | ||
950 | /* this descriptor is only the beginning (or middle) */ | ||
951 | if (!rxtop) { | ||
952 | /* this is the beginning of a chain */ | ||
953 | rxtop = skb; | ||
954 | skb_fill_page_desc(rxtop, 0, buffer_info->page, | ||
955 | 0, length); | ||
956 | } else { | ||
957 | /* this is the middle of a chain */ | ||
958 | skb_fill_page_desc(rxtop, | ||
959 | skb_shinfo(rxtop)->nr_frags, | ||
960 | buffer_info->page, 0, length); | ||
961 | /* re-use the skb, only consumed the page */ | ||
962 | buffer_info->skb = skb; | ||
963 | } | ||
964 | e1000_consume_page(buffer_info, rxtop, length); | ||
965 | goto next_desc; | ||
966 | } else { | ||
967 | if (rxtop) { | ||
968 | /* end of the chain */ | ||
969 | skb_fill_page_desc(rxtop, | ||
970 | skb_shinfo(rxtop)->nr_frags, | ||
971 | buffer_info->page, 0, length); | ||
972 | /* re-use the current skb, we only consumed the | ||
973 | * page */ | ||
974 | buffer_info->skb = skb; | ||
975 | skb = rxtop; | ||
976 | rxtop = NULL; | ||
977 | e1000_consume_page(buffer_info, skb, length); | ||
978 | } else { | ||
979 | /* no chain, got EOP, this buf is the packet | ||
980 | * copybreak to save the put_page/alloc_page */ | ||
981 | if (length <= copybreak && | ||
982 | skb_tailroom(skb) >= length) { | ||
983 | u8 *vaddr; | ||
984 | vaddr = kmap_atomic(buffer_info->page, | ||
985 | KM_SKB_DATA_SOFTIRQ); | ||
986 | memcpy(skb_tail_pointer(skb), vaddr, | ||
987 | length); | ||
988 | kunmap_atomic(vaddr, | ||
989 | KM_SKB_DATA_SOFTIRQ); | ||
990 | /* re-use the page, so don't erase | ||
991 | * buffer_info->page */ | ||
992 | skb_put(skb, length); | ||
993 | } else { | ||
994 | skb_fill_page_desc(skb, 0, | ||
995 | buffer_info->page, 0, | ||
996 | length); | ||
997 | e1000_consume_page(buffer_info, skb, | ||
998 | length); | ||
999 | } | ||
1000 | } | ||
1001 | } | ||
1002 | |||
1003 | /* Receive Checksum Offload XXX recompute due to CRC strip? */ | ||
1004 | e1000_rx_checksum(adapter, | ||
1005 | (u32)(status) | | ||
1006 | ((u32)(rx_desc->errors) << 24), | ||
1007 | le16_to_cpu(rx_desc->csum), skb); | ||
1008 | |||
1009 | /* probably a little skewed due to removing CRC */ | ||
1010 | total_rx_bytes += skb->len; | ||
1011 | total_rx_packets++; | ||
1012 | |||
1013 | /* eth type trans needs skb->data to point to something */ | ||
1014 | if (!pskb_may_pull(skb, ETH_HLEN)) { | ||
1015 | ndev_err(netdev, "pskb_may_pull failed.\n"); | ||
1016 | dev_kfree_skb(skb); | ||
1017 | goto next_desc; | ||
1018 | } | ||
1019 | |||
1020 | e1000_receive_skb(adapter, netdev, skb, status, | ||
1021 | rx_desc->special); | ||
1022 | |||
1023 | next_desc: | ||
1024 | rx_desc->status = 0; | ||
1025 | |||
1026 | /* return some buffers to hardware, one at a time is too slow */ | ||
1027 | if (unlikely(cleaned_count >= E1000_RX_BUFFER_WRITE)) { | ||
1028 | adapter->alloc_rx_buf(adapter, cleaned_count); | ||
1029 | cleaned_count = 0; | ||
1030 | } | ||
1031 | |||
1032 | /* use prefetched values */ | ||
1033 | rx_desc = next_rxd; | ||
1034 | buffer_info = next_buffer; | ||
1035 | } | ||
1036 | rx_ring->next_to_clean = i; | ||
1037 | |||
1038 | cleaned_count = e1000_desc_unused(rx_ring); | ||
1039 | if (cleaned_count) | ||
1040 | adapter->alloc_rx_buf(adapter, cleaned_count); | ||
1041 | |||
1042 | adapter->total_rx_bytes += total_rx_bytes; | ||
1043 | adapter->total_rx_packets += total_rx_packets; | ||
1044 | adapter->net_stats.rx_bytes += total_rx_bytes; | ||
1045 | adapter->net_stats.rx_packets += total_rx_packets; | ||
1046 | return cleaned; | ||
1047 | } | ||
1048 | |||
1049 | /** | ||
786 | * e1000_clean_rx_ring - Free Rx Buffers per Queue | 1050 | * e1000_clean_rx_ring - Free Rx Buffers per Queue |
787 | * @adapter: board private structure | 1051 | * @adapter: board private structure |
788 | **/ | 1052 | **/ |
@@ -802,6 +1066,10 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter) | |||
802 | pci_unmap_single(pdev, buffer_info->dma, | 1066 | pci_unmap_single(pdev, buffer_info->dma, |
803 | adapter->rx_buffer_len, | 1067 | adapter->rx_buffer_len, |
804 | PCI_DMA_FROMDEVICE); | 1068 | PCI_DMA_FROMDEVICE); |
1069 | else if (adapter->clean_rx == e1000_clean_jumbo_rx_irq) | ||
1070 | pci_unmap_page(pdev, buffer_info->dma, | ||
1071 | PAGE_SIZE, | ||
1072 | PCI_DMA_FROMDEVICE); | ||
805 | else if (adapter->clean_rx == e1000_clean_rx_irq_ps) | 1073 | else if (adapter->clean_rx == e1000_clean_rx_irq_ps) |
806 | pci_unmap_single(pdev, buffer_info->dma, | 1074 | pci_unmap_single(pdev, buffer_info->dma, |
807 | adapter->rx_ps_bsize0, | 1075 | adapter->rx_ps_bsize0, |
@@ -809,6 +1077,11 @@ static void e1000_clean_rx_ring(struct e1000_adapter *adapter) | |||
809 | buffer_info->dma = 0; | 1077 | buffer_info->dma = 0; |
810 | } | 1078 | } |
811 | 1079 | ||
1080 | if (buffer_info->page) { | ||
1081 | put_page(buffer_info->page); | ||
1082 | buffer_info->page = NULL; | ||
1083 | } | ||
1084 | |||
812 | if (buffer_info->skb) { | 1085 | if (buffer_info->skb) { |
813 | dev_kfree_skb(buffer_info->skb); | 1086 | dev_kfree_skb(buffer_info->skb); |
814 | buffer_info->skb = NULL; | 1087 | buffer_info->skb = NULL; |
@@ -1755,10 +2028,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter) | |||
1755 | * a lot of memory, since we allocate 3 pages at all times | 2028 | * a lot of memory, since we allocate 3 pages at all times |
1756 | * per packet. | 2029 | * per packet. |
1757 | */ | 2030 | */ |
1758 | adapter->rx_ps_pages = 0; | ||
1759 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); | 2031 | pages = PAGE_USE_COUNT(adapter->netdev->mtu); |
1760 | if ((pages <= 3) && (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE)) | 2032 | if (!(adapter->flags & FLAG_IS_ICH) && (pages <= 3) && |
2033 | (PAGE_SIZE <= 16384) && (rctl & E1000_RCTL_LPE)) | ||
1761 | adapter->rx_ps_pages = pages; | 2034 | adapter->rx_ps_pages = pages; |
2035 | else | ||
2036 | adapter->rx_ps_pages = 0; | ||
1762 | 2037 | ||
1763 | if (adapter->rx_ps_pages) { | 2038 | if (adapter->rx_ps_pages) { |
1764 | /* Configure extra packet-split registers */ | 2039 | /* Configure extra packet-split registers */ |
@@ -1819,9 +2094,12 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
1819 | sizeof(union e1000_rx_desc_packet_split); | 2094 | sizeof(union e1000_rx_desc_packet_split); |
1820 | adapter->clean_rx = e1000_clean_rx_irq_ps; | 2095 | adapter->clean_rx = e1000_clean_rx_irq_ps; |
1821 | adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps; | 2096 | adapter->alloc_rx_buf = e1000_alloc_rx_buffers_ps; |
2097 | } else if (adapter->netdev->mtu > ETH_FRAME_LEN + ETH_FCS_LEN) { | ||
2098 | rdlen = rx_ring->count * sizeof(struct e1000_rx_desc); | ||
2099 | adapter->clean_rx = e1000_clean_jumbo_rx_irq; | ||
2100 | adapter->alloc_rx_buf = e1000_alloc_jumbo_rx_buffers; | ||
1822 | } else { | 2101 | } else { |
1823 | rdlen = rx_ring->count * | 2102 | rdlen = rx_ring->count * sizeof(struct e1000_rx_desc); |
1824 | sizeof(struct e1000_rx_desc); | ||
1825 | adapter->clean_rx = e1000_clean_rx_irq; | 2103 | adapter->clean_rx = e1000_clean_rx_irq; |
1826 | adapter->alloc_rx_buf = e1000_alloc_rx_buffers; | 2104 | adapter->alloc_rx_buf = e1000_alloc_rx_buffers; |
1827 | } | 2105 | } |
@@ -1885,8 +2163,21 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) | |||
1885 | * units), e.g. using jumbo frames when setting to E1000_ERT_2048 | 2163 | * units), e.g. using jumbo frames when setting to E1000_ERT_2048 |
1886 | */ | 2164 | */ |
1887 | if ((adapter->flags & FLAG_HAS_ERT) && | 2165 | if ((adapter->flags & FLAG_HAS_ERT) && |
1888 | (adapter->netdev->mtu > ETH_DATA_LEN)) | 2166 | (adapter->netdev->mtu > ETH_DATA_LEN)) { |
1889 | ew32(ERT, E1000_ERT_2048); | 2167 | u32 rxdctl = er32(RXDCTL(0)); |
2168 | ew32(RXDCTL(0), rxdctl | 0x3); | ||
2169 | ew32(ERT, E1000_ERT_2048 | (1 << 13)); | ||
2170 | /* | ||
2171 | * With jumbo frames and early-receive enabled, excessive | ||
2172 | * C4->C2 latencies result in dropped transactions. | ||
2173 | */ | ||
2174 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, | ||
2175 | e1000e_driver_name, 55); | ||
2176 | } else { | ||
2177 | pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, | ||
2178 | e1000e_driver_name, | ||
2179 | PM_QOS_DEFAULT_VALUE); | ||
2180 | } | ||
1890 | 2181 | ||
1891 | /* Enable Receives */ | 2182 | /* Enable Receives */ |
1892 | ew32(RCTL, rctl); | 2183 | ew32(RCTL, rctl); |
@@ -2155,6 +2446,14 @@ void e1000e_reset(struct e1000_adapter *adapter) | |||
2155 | 2446 | ||
2156 | /* Allow time for pending master requests to run */ | 2447 | /* Allow time for pending master requests to run */ |
2157 | mac->ops.reset_hw(hw); | 2448 | mac->ops.reset_hw(hw); |
2449 | |||
2450 | /* | ||
2451 | * For parts with AMT enabled, let the firmware know | ||
2452 | * that the network interface is in control | ||
2453 | */ | ||
2454 | if ((adapter->flags & FLAG_HAS_AMT) && e1000e_check_mng_mode(hw)) | ||
2455 | e1000_get_hw_control(adapter); | ||
2456 | |||
2158 | ew32(WUC, 0); | 2457 | ew32(WUC, 0); |
2159 | 2458 | ||
2160 | if (mac->ops.init_hw(hw)) | 2459 | if (mac->ops.init_hw(hw)) |
@@ -3469,6 +3768,8 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | |||
3469 | * means we reserve 2 more, this pushes us to allocate from the next | 3768 | * means we reserve 2 more, this pushes us to allocate from the next |
3470 | * larger slab size. | 3769 | * larger slab size. |
3471 | * i.e. RXBUFFER_2048 --> size-4096 slab | 3770 | * i.e. RXBUFFER_2048 --> size-4096 slab |
3771 | * However with the new *_jumbo_rx* routines, jumbo receives will use | ||
3772 | * fragmented skbs | ||
3472 | */ | 3773 | */ |
3473 | 3774 | ||
3474 | if (max_frame <= 256) | 3775 | if (max_frame <= 256) |
@@ -3626,6 +3927,9 @@ static int e1000_suspend(struct pci_dev *pdev, pm_message_t state) | |||
3626 | ew32(CTRL_EXT, ctrl_ext); | 3927 | ew32(CTRL_EXT, ctrl_ext); |
3627 | } | 3928 | } |
3628 | 3929 | ||
3930 | if (adapter->flags & FLAG_IS_ICH) | ||
3931 | e1000e_disable_gig_wol_ich8lan(&adapter->hw); | ||
3932 | |||
3629 | /* Allow time for pending master requests to run */ | 3933 | /* Allow time for pending master requests to run */ |
3630 | e1000e_disable_pcie_master(&adapter->hw); | 3934 | e1000e_disable_pcie_master(&adapter->hw); |
3631 | 3935 | ||
@@ -4292,6 +4596,13 @@ static struct pci_device_id e1000_pci_tbl[] = { | |||
4292 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan }, | 4596 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IFE_GT), board_ich9lan }, |
4293 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan }, | 4597 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_AMT), board_ich9lan }, |
4294 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan }, | 4598 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_C), board_ich9lan }, |
4599 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M), board_ich9lan }, | ||
4600 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_AMT), board_ich9lan }, | ||
4601 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH9_IGP_M_V), board_ich9lan }, | ||
4602 | |||
4603 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LM), board_ich9lan }, | ||
4604 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_LF), board_ich9lan }, | ||
4605 | { PCI_VDEVICE(INTEL, E1000_DEV_ID_ICH10_R_BM_V), board_ich9lan }, | ||
4295 | 4606 | ||
4296 | { } /* terminate list */ | 4607 | { } /* terminate list */ |
4297 | }; | 4608 | }; |
@@ -4326,7 +4637,9 @@ static int __init e1000_init_module(void) | |||
4326 | printk(KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n", | 4637 | printk(KERN_INFO "%s: Copyright (c) 1999-2008 Intel Corporation.\n", |
4327 | e1000e_driver_name); | 4638 | e1000e_driver_name); |
4328 | ret = pci_register_driver(&e1000_driver); | 4639 | ret = pci_register_driver(&e1000_driver); |
4329 | 4640 | pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name, | |
4641 | PM_QOS_DEFAULT_VALUE); | ||
4642 | |||
4330 | return ret; | 4643 | return ret; |
4331 | } | 4644 | } |
4332 | module_init(e1000_init_module); | 4645 | module_init(e1000_init_module); |
@@ -4340,6 +4653,7 @@ module_init(e1000_init_module); | |||
4340 | static void __exit e1000_exit_module(void) | 4653 | static void __exit e1000_exit_module(void) |
4341 | { | 4654 | { |
4342 | pci_unregister_driver(&e1000_driver); | 4655 | pci_unregister_driver(&e1000_driver); |
4656 | pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name); | ||
4343 | } | 4657 | } |
4344 | module_exit(e1000_exit_module); | 4658 | module_exit(e1000_exit_module); |
4345 | 4659 | ||
diff --git a/drivers/net/e1000e/phy.c b/drivers/net/e1000e/phy.c index e102332a6bee..b133dcf0e950 100644 --- a/drivers/net/e1000e/phy.c +++ b/drivers/net/e1000e/phy.c | |||
@@ -34,6 +34,9 @@ static s32 e1000_get_phy_cfg_done(struct e1000_hw *hw); | |||
34 | static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw); | 34 | static s32 e1000_phy_force_speed_duplex(struct e1000_hw *hw); |
35 | static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); | 35 | static s32 e1000_set_d0_lplu_state(struct e1000_hw *hw, bool active); |
36 | static s32 e1000_wait_autoneg(struct e1000_hw *hw); | 36 | static s32 e1000_wait_autoneg(struct e1000_hw *hw); |
37 | static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg); | ||
38 | static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, | ||
39 | u16 *data, bool read); | ||
37 | 40 | ||
38 | /* Cable length tables */ | 41 | /* Cable length tables */ |
39 | static const u16 e1000_m88_cable_length_table[] = | 42 | static const u16 e1000_m88_cable_length_table[] = |
@@ -465,6 +468,10 @@ s32 e1000e_copper_link_setup_m88(struct e1000_hw *hw) | |||
465 | if (phy->disable_polarity_correction == 1) | 468 | if (phy->disable_polarity_correction == 1) |
466 | phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; | 469 | phy_data |= M88E1000_PSCR_POLARITY_REVERSAL; |
467 | 470 | ||
471 | /* Enable downshift on BM (disabled by default) */ | ||
472 | if (phy->type == e1000_phy_bm) | ||
473 | phy_data |= BME1000_PSCR_ENABLE_DOWNSHIFT; | ||
474 | |||
468 | ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data); | 475 | ret_val = e1e_wphy(hw, M88E1000_PHY_SPEC_CTRL, phy_data); |
469 | if (ret_val) | 476 | if (ret_val) |
470 | return ret_val; | 477 | return ret_val; |
@@ -1776,6 +1783,10 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id) | |||
1776 | case IFE_C_E_PHY_ID: | 1783 | case IFE_C_E_PHY_ID: |
1777 | phy_type = e1000_phy_ife; | 1784 | phy_type = e1000_phy_ife; |
1778 | break; | 1785 | break; |
1786 | case BME1000_E_PHY_ID: | ||
1787 | case BME1000_E_PHY_ID_R2: | ||
1788 | phy_type = e1000_phy_bm; | ||
1789 | break; | ||
1779 | default: | 1790 | default: |
1780 | phy_type = e1000_phy_unknown; | 1791 | phy_type = e1000_phy_unknown; |
1781 | break; | 1792 | break; |
@@ -1784,6 +1795,273 @@ enum e1000_phy_type e1000e_get_phy_type_from_id(u32 phy_id) | |||
1784 | } | 1795 | } |
1785 | 1796 | ||
1786 | /** | 1797 | /** |
1798 | * e1000e_determine_phy_address - Determines PHY address. | ||
1799 | * @hw: pointer to the HW structure | ||
1800 | * | ||
1801 | * This uses a trial and error method to loop through possible PHY | ||
1802 | * addresses. It tests each by reading the PHY ID registers and | ||
1803 | * checking for a match. | ||
1804 | **/ | ||
1805 | s32 e1000e_determine_phy_address(struct e1000_hw *hw) | ||
1806 | { | ||
1807 | s32 ret_val = -E1000_ERR_PHY_TYPE; | ||
1808 | u32 phy_addr= 0; | ||
1809 | u32 i = 0; | ||
1810 | enum e1000_phy_type phy_type = e1000_phy_unknown; | ||
1811 | |||
1812 | do { | ||
1813 | for (phy_addr = 0; phy_addr < 4; phy_addr++) { | ||
1814 | hw->phy.addr = phy_addr; | ||
1815 | e1000e_get_phy_id(hw); | ||
1816 | phy_type = e1000e_get_phy_type_from_id(hw->phy.id); | ||
1817 | |||
1818 | /* | ||
1819 | * If phy_type is valid, break - we found our | ||
1820 | * PHY address | ||
1821 | */ | ||
1822 | if (phy_type != e1000_phy_unknown) { | ||
1823 | ret_val = 0; | ||
1824 | break; | ||
1825 | } | ||
1826 | } | ||
1827 | i++; | ||
1828 | } while ((ret_val != 0) && (i < 100)); | ||
1829 | |||
1830 | return ret_val; | ||
1831 | } | ||
1832 | |||
1833 | /** | ||
1834 | * e1000_get_phy_addr_for_bm_page - Retrieve PHY page address | ||
1835 | * @page: page to access | ||
1836 | * | ||
1837 | * Returns the phy address for the page requested. | ||
1838 | **/ | ||
1839 | static u32 e1000_get_phy_addr_for_bm_page(u32 page, u32 reg) | ||
1840 | { | ||
1841 | u32 phy_addr = 2; | ||
1842 | |||
1843 | if ((page >= 768) || (page == 0 && reg == 25) || (reg == 31)) | ||
1844 | phy_addr = 1; | ||
1845 | |||
1846 | return phy_addr; | ||
1847 | } | ||
1848 | |||
1849 | /** | ||
1850 | * e1000e_write_phy_reg_bm - Write BM PHY register | ||
1851 | * @hw: pointer to the HW structure | ||
1852 | * @offset: register offset to write to | ||
1853 | * @data: data to write at register offset | ||
1854 | * | ||
1855 | * Acquires semaphore, if necessary, then writes the data to PHY register | ||
1856 | * at the offset. Release any acquired semaphores before exiting. | ||
1857 | **/ | ||
1858 | s32 e1000e_write_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 data) | ||
1859 | { | ||
1860 | s32 ret_val; | ||
1861 | u32 page_select = 0; | ||
1862 | u32 page = offset >> IGP_PAGE_SHIFT; | ||
1863 | u32 page_shift = 0; | ||
1864 | |||
1865 | /* Page 800 works differently than the rest so it has its own func */ | ||
1866 | if (page == BM_WUC_PAGE) { | ||
1867 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, &data, | ||
1868 | false); | ||
1869 | goto out; | ||
1870 | } | ||
1871 | |||
1872 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
1873 | if (ret_val) | ||
1874 | goto out; | ||
1875 | |||
1876 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); | ||
1877 | |||
1878 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | ||
1879 | /* | ||
1880 | * Page select is register 31 for phy address 1 and 22 for | ||
1881 | * phy address 2 and 3. Page select is shifted only for | ||
1882 | * phy address 1. | ||
1883 | */ | ||
1884 | if (hw->phy.addr == 1) { | ||
1885 | page_shift = IGP_PAGE_SHIFT; | ||
1886 | page_select = IGP01E1000_PHY_PAGE_SELECT; | ||
1887 | } else { | ||
1888 | page_shift = 0; | ||
1889 | page_select = BM_PHY_PAGE_SELECT; | ||
1890 | } | ||
1891 | |||
1892 | /* Page is shifted left, PHY expects (page x 32) */ | ||
1893 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, | ||
1894 | (page << page_shift)); | ||
1895 | if (ret_val) { | ||
1896 | hw->phy.ops.release_phy(hw); | ||
1897 | goto out; | ||
1898 | } | ||
1899 | } | ||
1900 | |||
1901 | ret_val = e1000e_write_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | ||
1902 | data); | ||
1903 | |||
1904 | hw->phy.ops.release_phy(hw); | ||
1905 | |||
1906 | out: | ||
1907 | return ret_val; | ||
1908 | } | ||
1909 | |||
1910 | /** | ||
1911 | * e1000e_read_phy_reg_bm - Read BM PHY register | ||
1912 | * @hw: pointer to the HW structure | ||
1913 | * @offset: register offset to be read | ||
1914 | * @data: pointer to the read data | ||
1915 | * | ||
1916 | * Acquires semaphore, if necessary, then reads the PHY register at offset | ||
1917 | * and storing the retrieved information in data. Release any acquired | ||
1918 | * semaphores before exiting. | ||
1919 | **/ | ||
1920 | s32 e1000e_read_phy_reg_bm(struct e1000_hw *hw, u32 offset, u16 *data) | ||
1921 | { | ||
1922 | s32 ret_val; | ||
1923 | u32 page_select = 0; | ||
1924 | u32 page = offset >> IGP_PAGE_SHIFT; | ||
1925 | u32 page_shift = 0; | ||
1926 | |||
1927 | /* Page 800 works differently than the rest so it has its own func */ | ||
1928 | if (page == BM_WUC_PAGE) { | ||
1929 | ret_val = e1000_access_phy_wakeup_reg_bm(hw, offset, data, | ||
1930 | true); | ||
1931 | goto out; | ||
1932 | } | ||
1933 | |||
1934 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
1935 | if (ret_val) | ||
1936 | goto out; | ||
1937 | |||
1938 | hw->phy.addr = e1000_get_phy_addr_for_bm_page(page, offset); | ||
1939 | |||
1940 | if (offset > MAX_PHY_MULTI_PAGE_REG) { | ||
1941 | /* | ||
1942 | * Page select is register 31 for phy address 1 and 22 for | ||
1943 | * phy address 2 and 3. Page select is shifted only for | ||
1944 | * phy address 1. | ||
1945 | */ | ||
1946 | if (hw->phy.addr == 1) { | ||
1947 | page_shift = IGP_PAGE_SHIFT; | ||
1948 | page_select = IGP01E1000_PHY_PAGE_SELECT; | ||
1949 | } else { | ||
1950 | page_shift = 0; | ||
1951 | page_select = BM_PHY_PAGE_SELECT; | ||
1952 | } | ||
1953 | |||
1954 | /* Page is shifted left, PHY expects (page x 32) */ | ||
1955 | ret_val = e1000e_write_phy_reg_mdic(hw, page_select, | ||
1956 | (page << page_shift)); | ||
1957 | if (ret_val) { | ||
1958 | hw->phy.ops.release_phy(hw); | ||
1959 | goto out; | ||
1960 | } | ||
1961 | } | ||
1962 | |||
1963 | ret_val = e1000e_read_phy_reg_mdic(hw, MAX_PHY_REG_ADDRESS & offset, | ||
1964 | data); | ||
1965 | hw->phy.ops.release_phy(hw); | ||
1966 | |||
1967 | out: | ||
1968 | return ret_val; | ||
1969 | } | ||
1970 | |||
1971 | /** | ||
1972 | * e1000_access_phy_wakeup_reg_bm - Read BM PHY wakeup register | ||
1973 | * @hw: pointer to the HW structure | ||
1974 | * @offset: register offset to be read or written | ||
1975 | * @data: pointer to the data to read or write | ||
1976 | * @read: determines if operation is read or write | ||
1977 | * | ||
1978 | * Acquires semaphore, if necessary, then reads the PHY register at offset | ||
1979 | * and storing the retrieved information in data. Release any acquired | ||
1980 | * semaphores before exiting. Note that procedure to read the wakeup | ||
1981 | * registers are different. It works as such: | ||
1982 | * 1) Set page 769, register 17, bit 2 = 1 | ||
1983 | * 2) Set page to 800 for host (801 if we were manageability) | ||
1984 | * 3) Write the address using the address opcode (0x11) | ||
1985 | * 4) Read or write the data using the data opcode (0x12) | ||
1986 | * 5) Restore 769_17.2 to its original value | ||
1987 | **/ | ||
1988 | static s32 e1000_access_phy_wakeup_reg_bm(struct e1000_hw *hw, u32 offset, | ||
1989 | u16 *data, bool read) | ||
1990 | { | ||
1991 | s32 ret_val; | ||
1992 | u16 reg = ((u16)offset) & PHY_REG_MASK; | ||
1993 | u16 phy_reg = 0; | ||
1994 | u8 phy_acquired = 1; | ||
1995 | |||
1996 | |||
1997 | ret_val = hw->phy.ops.acquire_phy(hw); | ||
1998 | if (ret_val) { | ||
1999 | phy_acquired = 0; | ||
2000 | goto out; | ||
2001 | } | ||
2002 | |||
2003 | /* All operations in this function are phy address 1 */ | ||
2004 | hw->phy.addr = 1; | ||
2005 | |||
2006 | /* Set page 769 */ | ||
2007 | e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, | ||
2008 | (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); | ||
2009 | |||
2010 | ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, &phy_reg); | ||
2011 | if (ret_val) | ||
2012 | goto out; | ||
2013 | |||
2014 | /* First clear bit 4 to avoid a power state change */ | ||
2015 | phy_reg &= ~(BM_WUC_HOST_WU_BIT); | ||
2016 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); | ||
2017 | if (ret_val) | ||
2018 | goto out; | ||
2019 | |||
2020 | /* Write bit 2 = 1, and clear bit 4 to 769_17 */ | ||
2021 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, | ||
2022 | phy_reg | BM_WUC_ENABLE_BIT); | ||
2023 | if (ret_val) | ||
2024 | goto out; | ||
2025 | |||
2026 | /* Select page 800 */ | ||
2027 | ret_val = e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, | ||
2028 | (BM_WUC_PAGE << IGP_PAGE_SHIFT)); | ||
2029 | |||
2030 | /* Write the page 800 offset value using opcode 0x11 */ | ||
2031 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ADDRESS_OPCODE, reg); | ||
2032 | if (ret_val) | ||
2033 | goto out; | ||
2034 | |||
2035 | if (read) { | ||
2036 | /* Read the page 800 value using opcode 0x12 */ | ||
2037 | ret_val = e1000e_read_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, | ||
2038 | data); | ||
2039 | } else { | ||
2040 | /* Read the page 800 value using opcode 0x12 */ | ||
2041 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_DATA_OPCODE, | ||
2042 | *data); | ||
2043 | } | ||
2044 | |||
2045 | if (ret_val) | ||
2046 | goto out; | ||
2047 | |||
2048 | /* | ||
2049 | * Restore 769_17.2 to its original value | ||
2050 | * Set page 769 | ||
2051 | */ | ||
2052 | e1000e_write_phy_reg_mdic(hw, IGP01E1000_PHY_PAGE_SELECT, | ||
2053 | (BM_WUC_ENABLE_PAGE << IGP_PAGE_SHIFT)); | ||
2054 | |||
2055 | /* Clear 769_17.2 */ | ||
2056 | ret_val = e1000e_write_phy_reg_mdic(hw, BM_WUC_ENABLE_REG, phy_reg); | ||
2057 | |||
2058 | out: | ||
2059 | if (phy_acquired == 1) | ||
2060 | hw->phy.ops.release_phy(hw); | ||
2061 | return ret_val; | ||
2062 | } | ||
2063 | |||
2064 | /** | ||
1787 | * e1000e_commit_phy - Soft PHY reset | 2065 | * e1000e_commit_phy - Soft PHY reset |
1788 | * @hw: pointer to the HW structure | 2066 | * @hw: pointer to the HW structure |
1789 | * | 2067 | * |
diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index 2eb82aba4a8b..795c594a4b7c 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c | |||
@@ -202,7 +202,7 @@ static unsigned short start_code[] = { | |||
202 | 0x0000,Cmd_MCast, | 202 | 0x0000,Cmd_MCast, |
203 | 0x0076, /* link to next command */ | 203 | 0x0076, /* link to next command */ |
204 | #define CONF_NR_MULTICAST 0x44 | 204 | #define CONF_NR_MULTICAST 0x44 |
205 | 0x0000, /* number of multicast addresses */ | 205 | 0x0000, /* number of bytes in multicast address(es) */ |
206 | #define CONF_MULTICAST 0x46 | 206 | #define CONF_MULTICAST 0x46 |
207 | 0x0000, 0x0000, 0x0000, /* some addresses */ | 207 | 0x0000, 0x0000, 0x0000, /* some addresses */ |
208 | 0x0000, 0x0000, 0x0000, | 208 | 0x0000, 0x0000, 0x0000, |
@@ -1569,7 +1569,7 @@ static void eexp_hw_init586(struct net_device *dev) | |||
1569 | 1569 | ||
1570 | static void eexp_setup_filter(struct net_device *dev) | 1570 | static void eexp_setup_filter(struct net_device *dev) |
1571 | { | 1571 | { |
1572 | struct dev_mc_list *dmi = dev->mc_list; | 1572 | struct dev_mc_list *dmi; |
1573 | unsigned short ioaddr = dev->base_addr; | 1573 | unsigned short ioaddr = dev->base_addr; |
1574 | int count = dev->mc_count; | 1574 | int count = dev->mc_count; |
1575 | int i; | 1575 | int i; |
@@ -1580,9 +1580,9 @@ static void eexp_setup_filter(struct net_device *dev) | |||
1580 | } | 1580 | } |
1581 | 1581 | ||
1582 | outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR); | 1582 | outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR); |
1583 | outw(count, ioaddr+SHADOW(CONF_NR_MULTICAST)); | 1583 | outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST)); |
1584 | for (i = 0; i < count; i++) { | 1584 | for (i = 0, dmi = dev->mc_list; i < count; i++, dmi = dmi->next) { |
1585 | unsigned short *data = (unsigned short *)dmi->dmi_addr; | 1585 | unsigned short *data; |
1586 | if (!dmi) { | 1586 | if (!dmi) { |
1587 | printk(KERN_INFO "%s: too few multicast addresses\n", dev->name); | 1587 | printk(KERN_INFO "%s: too few multicast addresses\n", dev->name); |
1588 | break; | 1588 | break; |
@@ -1591,6 +1591,7 @@ static void eexp_setup_filter(struct net_device *dev) | |||
1591 | printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name); | 1591 | printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name); |
1592 | continue; | 1592 | continue; |
1593 | } | 1593 | } |
1594 | data = (unsigned short *)dmi->dmi_addr; | ||
1594 | outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR); | 1595 | outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR); |
1595 | outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i))); | 1596 | outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i))); |
1596 | outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR); | 1597 | outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR); |
diff --git a/drivers/net/ehea/ehea.h b/drivers/net/ehea/ehea.h index f5dacceab95b..fe872fbd671e 100644 --- a/drivers/net/ehea/ehea.h +++ b/drivers/net/ehea/ehea.h | |||
@@ -40,7 +40,7 @@ | |||
40 | #include <asm/io.h> | 40 | #include <asm/io.h> |
41 | 41 | ||
42 | #define DRV_NAME "ehea" | 42 | #define DRV_NAME "ehea" |
43 | #define DRV_VERSION "EHEA_0090" | 43 | #define DRV_VERSION "EHEA_0091" |
44 | 44 | ||
45 | /* eHEA capability flags */ | 45 | /* eHEA capability flags */ |
46 | #define DLPAR_PORT_ADD_REM 1 | 46 | #define DLPAR_PORT_ADD_REM 1 |
@@ -118,6 +118,13 @@ | |||
118 | #define EHEA_MR_ACC_CTRL 0x00800000 | 118 | #define EHEA_MR_ACC_CTRL 0x00800000 |
119 | 119 | ||
120 | #define EHEA_BUSMAP_START 0x8000000000000000ULL | 120 | #define EHEA_BUSMAP_START 0x8000000000000000ULL |
121 | #define EHEA_INVAL_ADDR 0xFFFFFFFFFFFFFFFFULL | ||
122 | #define EHEA_DIR_INDEX_SHIFT 13 /* 8k Entries in 64k block */ | ||
123 | #define EHEA_TOP_INDEX_SHIFT (EHEA_DIR_INDEX_SHIFT * 2) | ||
124 | #define EHEA_MAP_ENTRIES (1 << EHEA_DIR_INDEX_SHIFT) | ||
125 | #define EHEA_MAP_SIZE (0x10000) /* currently fixed map size */ | ||
126 | #define EHEA_INDEX_MASK (EHEA_MAP_ENTRIES - 1) | ||
127 | |||
121 | 128 | ||
122 | #define EHEA_WATCH_DOG_TIMEOUT 10*HZ | 129 | #define EHEA_WATCH_DOG_TIMEOUT 10*HZ |
123 | 130 | ||
@@ -192,10 +199,20 @@ struct h_epas { | |||
192 | set to 0 if unused */ | 199 | set to 0 if unused */ |
193 | }; | 200 | }; |
194 | 201 | ||
195 | struct ehea_busmap { | 202 | /* |
196 | unsigned int entries; /* total number of entries */ | 203 | * Memory map data structures |
197 | unsigned int valid_sections; /* number of valid sections */ | 204 | */ |
198 | u64 *vaddr; | 205 | struct ehea_dir_bmap |
206 | { | ||
207 | u64 ent[EHEA_MAP_ENTRIES]; | ||
208 | }; | ||
209 | struct ehea_top_bmap | ||
210 | { | ||
211 | struct ehea_dir_bmap *dir[EHEA_MAP_ENTRIES]; | ||
212 | }; | ||
213 | struct ehea_bmap | ||
214 | { | ||
215 | struct ehea_top_bmap *top[EHEA_MAP_ENTRIES]; | ||
199 | }; | 216 | }; |
200 | 217 | ||
201 | struct ehea_qp; | 218 | struct ehea_qp; |
diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c index f9bc21c74b59..d1b6d4e7495d 100644 --- a/drivers/net/ehea/ehea_main.c +++ b/drivers/net/ehea/ehea_main.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/if_ether.h> | 35 | #include <linux/if_ether.h> |
36 | #include <linux/notifier.h> | 36 | #include <linux/notifier.h> |
37 | #include <linux/reboot.h> | 37 | #include <linux/reboot.h> |
38 | #include <linux/memory.h> | ||
38 | #include <asm/kexec.h> | 39 | #include <asm/kexec.h> |
39 | #include <linux/mutex.h> | 40 | #include <linux/mutex.h> |
40 | 41 | ||
@@ -3503,6 +3504,24 @@ void ehea_crash_handler(void) | |||
3503 | 0, H_DEREG_BCMC); | 3504 | 0, H_DEREG_BCMC); |
3504 | } | 3505 | } |
3505 | 3506 | ||
3507 | static int ehea_mem_notifier(struct notifier_block *nb, | ||
3508 | unsigned long action, void *data) | ||
3509 | { | ||
3510 | switch (action) { | ||
3511 | case MEM_OFFLINE: | ||
3512 | ehea_info("memory has been removed"); | ||
3513 | ehea_rereg_mrs(NULL); | ||
3514 | break; | ||
3515 | default: | ||
3516 | break; | ||
3517 | } | ||
3518 | return NOTIFY_OK; | ||
3519 | } | ||
3520 | |||
3521 | static struct notifier_block ehea_mem_nb = { | ||
3522 | .notifier_call = ehea_mem_notifier, | ||
3523 | }; | ||
3524 | |||
3506 | static int ehea_reboot_notifier(struct notifier_block *nb, | 3525 | static int ehea_reboot_notifier(struct notifier_block *nb, |
3507 | unsigned long action, void *unused) | 3526 | unsigned long action, void *unused) |
3508 | { | 3527 | { |
@@ -3581,6 +3600,10 @@ int __init ehea_module_init(void) | |||
3581 | if (ret) | 3600 | if (ret) |
3582 | ehea_info("failed registering reboot notifier"); | 3601 | ehea_info("failed registering reboot notifier"); |
3583 | 3602 | ||
3603 | ret = register_memory_notifier(&ehea_mem_nb); | ||
3604 | if (ret) | ||
3605 | ehea_info("failed registering memory remove notifier"); | ||
3606 | |||
3584 | ret = crash_shutdown_register(&ehea_crash_handler); | 3607 | ret = crash_shutdown_register(&ehea_crash_handler); |
3585 | if (ret) | 3608 | if (ret) |
3586 | ehea_info("failed registering crash handler"); | 3609 | ehea_info("failed registering crash handler"); |
@@ -3604,6 +3627,7 @@ int __init ehea_module_init(void) | |||
3604 | out3: | 3627 | out3: |
3605 | ibmebus_unregister_driver(&ehea_driver); | 3628 | ibmebus_unregister_driver(&ehea_driver); |
3606 | out2: | 3629 | out2: |
3630 | unregister_memory_notifier(&ehea_mem_nb); | ||
3607 | unregister_reboot_notifier(&ehea_reboot_nb); | 3631 | unregister_reboot_notifier(&ehea_reboot_nb); |
3608 | crash_shutdown_unregister(&ehea_crash_handler); | 3632 | crash_shutdown_unregister(&ehea_crash_handler); |
3609 | out: | 3633 | out: |
@@ -3621,6 +3645,7 @@ static void __exit ehea_module_exit(void) | |||
3621 | ret = crash_shutdown_unregister(&ehea_crash_handler); | 3645 | ret = crash_shutdown_unregister(&ehea_crash_handler); |
3622 | if (ret) | 3646 | if (ret) |
3623 | ehea_info("failed unregistering crash handler"); | 3647 | ehea_info("failed unregistering crash handler"); |
3648 | unregister_memory_notifier(&ehea_mem_nb); | ||
3624 | kfree(ehea_fw_handles.arr); | 3649 | kfree(ehea_fw_handles.arr); |
3625 | kfree(ehea_bcmc_regs.arr); | 3650 | kfree(ehea_bcmc_regs.arr); |
3626 | ehea_destroy_busmap(); | 3651 | ehea_destroy_busmap(); |
diff --git a/drivers/net/ehea/ehea_qmr.c b/drivers/net/ehea/ehea_qmr.c index d522e905f460..140f05baafd8 100644 --- a/drivers/net/ehea/ehea_qmr.c +++ b/drivers/net/ehea/ehea_qmr.c | |||
@@ -31,8 +31,8 @@ | |||
31 | #include "ehea_phyp.h" | 31 | #include "ehea_phyp.h" |
32 | #include "ehea_qmr.h" | 32 | #include "ehea_qmr.h" |
33 | 33 | ||
34 | struct ehea_bmap *ehea_bmap = NULL; | ||
34 | 35 | ||
35 | struct ehea_busmap ehea_bmap = { 0, 0, NULL }; | ||
36 | 36 | ||
37 | 37 | ||
38 | static void *hw_qpageit_get_inc(struct hw_queue *queue) | 38 | static void *hw_qpageit_get_inc(struct hw_queue *queue) |
@@ -559,125 +559,253 @@ int ehea_destroy_qp(struct ehea_qp *qp) | |||
559 | return 0; | 559 | return 0; |
560 | } | 560 | } |
561 | 561 | ||
562 | int ehea_create_busmap(void) | 562 | static inline int ehea_calc_index(unsigned long i, unsigned long s) |
563 | { | 563 | { |
564 | u64 vaddr = EHEA_BUSMAP_START; | 564 | return (i >> s) & EHEA_INDEX_MASK; |
565 | unsigned long high_section_index = 0; | 565 | } |
566 | int i; | ||
567 | 566 | ||
568 | /* | 567 | static inline int ehea_init_top_bmap(struct ehea_top_bmap *ehea_top_bmap, |
569 | * Sections are not in ascending order -> Loop over all sections and | 568 | int dir) |
570 | * find the highest PFN to compute the required map size. | 569 | { |
571 | */ | 570 | if(!ehea_top_bmap->dir[dir]) { |
572 | ehea_bmap.valid_sections = 0; | 571 | ehea_top_bmap->dir[dir] = |
572 | kzalloc(sizeof(struct ehea_dir_bmap), GFP_KERNEL); | ||
573 | if (!ehea_top_bmap->dir[dir]) | ||
574 | return -ENOMEM; | ||
575 | } | ||
576 | return 0; | ||
577 | } | ||
573 | 578 | ||
574 | for (i = 0; i < NR_MEM_SECTIONS; i++) | 579 | static inline int ehea_init_bmap(struct ehea_bmap *ehea_bmap, int top, int dir) |
575 | if (valid_section_nr(i)) | 580 | { |
576 | high_section_index = i; | 581 | if(!ehea_bmap->top[top]) { |
582 | ehea_bmap->top[top] = | ||
583 | kzalloc(sizeof(struct ehea_top_bmap), GFP_KERNEL); | ||
584 | if (!ehea_bmap->top[top]) | ||
585 | return -ENOMEM; | ||
586 | } | ||
587 | return ehea_init_top_bmap(ehea_bmap->top[top], dir); | ||
588 | } | ||
577 | 589 | ||
578 | ehea_bmap.entries = high_section_index + 1; | 590 | static int ehea_create_busmap_callback(unsigned long pfn, |
579 | ehea_bmap.vaddr = vmalloc(ehea_bmap.entries * sizeof(*ehea_bmap.vaddr)); | 591 | unsigned long nr_pages, void *arg) |
592 | { | ||
593 | unsigned long i, mr_len, start_section, end_section; | ||
594 | start_section = (pfn * PAGE_SIZE) / EHEA_SECTSIZE; | ||
595 | end_section = start_section + ((nr_pages * PAGE_SIZE) / EHEA_SECTSIZE); | ||
596 | mr_len = *(unsigned long *)arg; | ||
580 | 597 | ||
581 | if (!ehea_bmap.vaddr) | 598 | ehea_bmap = kzalloc(sizeof(struct ehea_bmap), GFP_KERNEL); |
599 | if (!ehea_bmap) | ||
582 | return -ENOMEM; | 600 | return -ENOMEM; |
583 | 601 | ||
584 | for (i = 0 ; i < ehea_bmap.entries; i++) { | 602 | for (i = start_section; i < end_section; i++) { |
585 | unsigned long pfn = section_nr_to_pfn(i); | 603 | int ret; |
604 | int top, dir, idx; | ||
605 | u64 vaddr; | ||
606 | |||
607 | top = ehea_calc_index(i, EHEA_TOP_INDEX_SHIFT); | ||
608 | dir = ehea_calc_index(i, EHEA_DIR_INDEX_SHIFT); | ||
609 | |||
610 | ret = ehea_init_bmap(ehea_bmap, top, dir); | ||
611 | if(ret) | ||
612 | return ret; | ||
586 | 613 | ||
587 | if (pfn_valid(pfn)) { | 614 | idx = i & EHEA_INDEX_MASK; |
588 | ehea_bmap.vaddr[i] = vaddr; | 615 | vaddr = EHEA_BUSMAP_START + mr_len + i * EHEA_SECTSIZE; |
589 | vaddr += EHEA_SECTSIZE; | 616 | |
590 | ehea_bmap.valid_sections++; | 617 | ehea_bmap->top[top]->dir[dir]->ent[idx] = vaddr; |
591 | } else | ||
592 | ehea_bmap.vaddr[i] = 0; | ||
593 | } | 618 | } |
594 | 619 | ||
620 | mr_len += nr_pages * PAGE_SIZE; | ||
621 | *(unsigned long *)arg = mr_len; | ||
622 | |||
595 | return 0; | 623 | return 0; |
596 | } | 624 | } |
597 | 625 | ||
626 | static unsigned long ehea_mr_len; | ||
627 | |||
628 | static DEFINE_MUTEX(ehea_busmap_mutex); | ||
629 | |||
630 | int ehea_create_busmap(void) | ||
631 | { | ||
632 | int ret; | ||
633 | mutex_lock(&ehea_busmap_mutex); | ||
634 | ehea_mr_len = 0; | ||
635 | ret = walk_memory_resource(0, 1ULL << MAX_PHYSMEM_BITS, &ehea_mr_len, | ||
636 | ehea_create_busmap_callback); | ||
637 | mutex_unlock(&ehea_busmap_mutex); | ||
638 | return ret; | ||
639 | } | ||
640 | |||
598 | void ehea_destroy_busmap(void) | 641 | void ehea_destroy_busmap(void) |
599 | { | 642 | { |
600 | vfree(ehea_bmap.vaddr); | 643 | int top, dir; |
644 | mutex_lock(&ehea_busmap_mutex); | ||
645 | if (!ehea_bmap) | ||
646 | goto out_destroy; | ||
647 | |||
648 | for (top = 0; top < EHEA_MAP_ENTRIES; top++) { | ||
649 | if (!ehea_bmap->top[top]) | ||
650 | continue; | ||
651 | |||
652 | for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) { | ||
653 | if (!ehea_bmap->top[top]->dir[dir]) | ||
654 | continue; | ||
655 | |||
656 | kfree(ehea_bmap->top[top]->dir[dir]); | ||
657 | } | ||
658 | |||
659 | kfree(ehea_bmap->top[top]); | ||
660 | } | ||
661 | |||
662 | kfree(ehea_bmap); | ||
663 | ehea_bmap = NULL; | ||
664 | out_destroy: | ||
665 | mutex_unlock(&ehea_busmap_mutex); | ||
601 | } | 666 | } |
602 | 667 | ||
603 | u64 ehea_map_vaddr(void *caddr) | 668 | u64 ehea_map_vaddr(void *caddr) |
604 | { | 669 | { |
605 | u64 mapped_addr; | 670 | int top, dir, idx; |
606 | unsigned long index = __pa(caddr) >> SECTION_SIZE_BITS; | 671 | unsigned long index, offset; |
607 | 672 | ||
608 | if (likely(index < ehea_bmap.entries)) { | 673 | if (!ehea_bmap) |
609 | mapped_addr = ehea_bmap.vaddr[index]; | 674 | return EHEA_INVAL_ADDR; |
610 | if (likely(mapped_addr)) | 675 | |
611 | mapped_addr |= (((unsigned long)caddr) | 676 | index = virt_to_abs(caddr) >> SECTION_SIZE_BITS; |
612 | & (EHEA_SECTSIZE - 1)); | 677 | top = (index >> EHEA_TOP_INDEX_SHIFT) & EHEA_INDEX_MASK; |
613 | else | 678 | if (!ehea_bmap->top[top]) |
614 | mapped_addr = -1; | 679 | return EHEA_INVAL_ADDR; |
615 | } else | 680 | |
616 | mapped_addr = -1; | 681 | dir = (index >> EHEA_DIR_INDEX_SHIFT) & EHEA_INDEX_MASK; |
617 | 682 | if (!ehea_bmap->top[top]->dir[dir]) | |
618 | if (unlikely(mapped_addr == -1)) | 683 | return EHEA_INVAL_ADDR; |
619 | if (!test_and_set_bit(__EHEA_STOP_XFER, &ehea_driver_flags)) | 684 | |
620 | schedule_work(&ehea_rereg_mr_task); | 685 | idx = index & EHEA_INDEX_MASK; |
621 | 686 | if (!ehea_bmap->top[top]->dir[dir]->ent[idx]) | |
622 | return mapped_addr; | 687 | return EHEA_INVAL_ADDR; |
688 | |||
689 | offset = (unsigned long)caddr & (EHEA_SECTSIZE - 1); | ||
690 | return ehea_bmap->top[top]->dir[dir]->ent[idx] | offset; | ||
691 | } | ||
692 | |||
693 | static inline void *ehea_calc_sectbase(int top, int dir, int idx) | ||
694 | { | ||
695 | unsigned long ret = idx; | ||
696 | ret |= dir << EHEA_DIR_INDEX_SHIFT; | ||
697 | ret |= top << EHEA_TOP_INDEX_SHIFT; | ||
698 | return abs_to_virt(ret << SECTION_SIZE_BITS); | ||
699 | } | ||
700 | |||
701 | static u64 ehea_reg_mr_section(int top, int dir, int idx, u64 *pt, | ||
702 | struct ehea_adapter *adapter, | ||
703 | struct ehea_mr *mr) | ||
704 | { | ||
705 | void *pg; | ||
706 | u64 j, m, hret; | ||
707 | unsigned long k = 0; | ||
708 | u64 pt_abs = virt_to_abs(pt); | ||
709 | |||
710 | void *sectbase = ehea_calc_sectbase(top, dir, idx); | ||
711 | |||
712 | for (j = 0; j < (EHEA_PAGES_PER_SECTION / EHEA_MAX_RPAGE); j++) { | ||
713 | |||
714 | for (m = 0; m < EHEA_MAX_RPAGE; m++) { | ||
715 | pg = sectbase + ((k++) * EHEA_PAGESIZE); | ||
716 | pt[m] = virt_to_abs(pg); | ||
717 | } | ||
718 | hret = ehea_h_register_rpage_mr(adapter->handle, mr->handle, 0, | ||
719 | 0, pt_abs, EHEA_MAX_RPAGE); | ||
720 | |||
721 | if ((hret != H_SUCCESS) | ||
722 | && (hret != H_PAGE_REGISTERED)) { | ||
723 | ehea_h_free_resource(adapter->handle, mr->handle, | ||
724 | FORCE_FREE); | ||
725 | ehea_error("register_rpage_mr failed"); | ||
726 | return hret; | ||
727 | } | ||
728 | } | ||
729 | return hret; | ||
730 | } | ||
731 | |||
732 | static u64 ehea_reg_mr_sections(int top, int dir, u64 *pt, | ||
733 | struct ehea_adapter *adapter, | ||
734 | struct ehea_mr *mr) | ||
735 | { | ||
736 | u64 hret = H_SUCCESS; | ||
737 | int idx; | ||
738 | |||
739 | for (idx = 0; idx < EHEA_MAP_ENTRIES; idx++) { | ||
740 | if (!ehea_bmap->top[top]->dir[dir]->ent[idx]) | ||
741 | continue; | ||
742 | |||
743 | hret = ehea_reg_mr_section(top, dir, idx, pt, adapter, mr); | ||
744 | if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED)) | ||
745 | return hret; | ||
746 | } | ||
747 | return hret; | ||
748 | } | ||
749 | |||
750 | static u64 ehea_reg_mr_dir_sections(int top, u64 *pt, | ||
751 | struct ehea_adapter *adapter, | ||
752 | struct ehea_mr *mr) | ||
753 | { | ||
754 | u64 hret = H_SUCCESS; | ||
755 | int dir; | ||
756 | |||
757 | for (dir = 0; dir < EHEA_MAP_ENTRIES; dir++) { | ||
758 | if (!ehea_bmap->top[top]->dir[dir]) | ||
759 | continue; | ||
760 | |||
761 | hret = ehea_reg_mr_sections(top, dir, pt, adapter, mr); | ||
762 | if ((hret != H_SUCCESS) && (hret != H_PAGE_REGISTERED)) | ||
763 | return hret; | ||
764 | } | ||
765 | return hret; | ||
623 | } | 766 | } |
624 | 767 | ||
625 | int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr) | 768 | int ehea_reg_kernel_mr(struct ehea_adapter *adapter, struct ehea_mr *mr) |
626 | { | 769 | { |
627 | int ret; | 770 | int ret; |
628 | u64 *pt; | 771 | u64 *pt; |
629 | void *pg; | 772 | u64 hret; |
630 | u64 hret, pt_abs, i, j, m, mr_len; | ||
631 | u32 acc_ctrl = EHEA_MR_ACC_CTRL; | 773 | u32 acc_ctrl = EHEA_MR_ACC_CTRL; |
632 | 774 | ||
633 | mr_len = ehea_bmap.valid_sections * EHEA_SECTSIZE; | 775 | unsigned long top; |
634 | 776 | ||
635 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); | 777 | pt = kzalloc(PAGE_SIZE, GFP_KERNEL); |
636 | if (!pt) { | 778 | if (!pt) { |
637 | ehea_error("no mem"); | 779 | ehea_error("no mem"); |
638 | ret = -ENOMEM; | 780 | ret = -ENOMEM; |
639 | goto out; | 781 | goto out; |
640 | } | 782 | } |
641 | pt_abs = virt_to_abs(pt); | ||
642 | 783 | ||
643 | hret = ehea_h_alloc_resource_mr(adapter->handle, | 784 | hret = ehea_h_alloc_resource_mr(adapter->handle, EHEA_BUSMAP_START, |
644 | EHEA_BUSMAP_START, mr_len, | 785 | ehea_mr_len, acc_ctrl, adapter->pd, |
645 | acc_ctrl, adapter->pd, | ||
646 | &mr->handle, &mr->lkey); | 786 | &mr->handle, &mr->lkey); |
787 | |||
647 | if (hret != H_SUCCESS) { | 788 | if (hret != H_SUCCESS) { |
648 | ehea_error("alloc_resource_mr failed"); | 789 | ehea_error("alloc_resource_mr failed"); |
649 | ret = -EIO; | 790 | ret = -EIO; |
650 | goto out; | 791 | goto out; |
651 | } | 792 | } |
652 | 793 | ||
653 | for (i = 0 ; i < ehea_bmap.entries; i++) | 794 | if (!ehea_bmap) { |
654 | if (ehea_bmap.vaddr[i]) { | 795 | ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE); |
655 | void *sectbase = __va(i << SECTION_SIZE_BITS); | 796 | ehea_error("no busmap available"); |
656 | unsigned long k = 0; | 797 | ret = -EIO; |
657 | 798 | goto out; | |
658 | for (j = 0; j < (EHEA_PAGES_PER_SECTION / | 799 | } |
659 | EHEA_MAX_RPAGE); j++) { | 800 | |
660 | 801 | for (top = 0; top < EHEA_MAP_ENTRIES; top++) { | |
661 | for (m = 0; m < EHEA_MAX_RPAGE; m++) { | 802 | if (!ehea_bmap->top[top]) |
662 | pg = sectbase + ((k++) * EHEA_PAGESIZE); | 803 | continue; |
663 | pt[m] = virt_to_abs(pg); | 804 | |
664 | } | 805 | hret = ehea_reg_mr_dir_sections(top, pt, adapter, mr); |
665 | 806 | if((hret != H_PAGE_REGISTERED) && (hret != H_SUCCESS)) | |
666 | hret = ehea_h_register_rpage_mr(adapter->handle, | 807 | break; |
667 | mr->handle, | 808 | } |
668 | 0, 0, pt_abs, | ||
669 | EHEA_MAX_RPAGE); | ||
670 | if ((hret != H_SUCCESS) | ||
671 | && (hret != H_PAGE_REGISTERED)) { | ||
672 | ehea_h_free_resource(adapter->handle, | ||
673 | mr->handle, | ||
674 | FORCE_FREE); | ||
675 | ehea_error("register_rpage_mr failed"); | ||
676 | ret = -EIO; | ||
677 | goto out; | ||
678 | } | ||
679 | } | ||
680 | } | ||
681 | 809 | ||
682 | if (hret != H_SUCCESS) { | 810 | if (hret != H_SUCCESS) { |
683 | ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE); | 811 | ehea_h_free_resource(adapter->handle, mr->handle, FORCE_FREE); |
diff --git a/drivers/net/fs_enet/mii-fec.c b/drivers/net/fs_enet/mii-fec.c index ba75efc9f5b5..f0014cfbb275 100644 --- a/drivers/net/fs_enet/mii-fec.c +++ b/drivers/net/fs_enet/mii-fec.c | |||
@@ -194,7 +194,7 @@ static int __devinit fs_enet_mdio_probe(struct of_device *ofdev, | |||
194 | 194 | ||
195 | ret = of_address_to_resource(ofdev->node, 0, &res); | 195 | ret = of_address_to_resource(ofdev->node, 0, &res); |
196 | if (ret) | 196 | if (ret) |
197 | return ret; | 197 | goto out_res; |
198 | 198 | ||
199 | snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start); | 199 | snprintf(new_bus->id, MII_BUS_ID_SIZE, "%x", res.start); |
200 | 200 | ||
@@ -236,6 +236,7 @@ out_free_irqs: | |||
236 | kfree(new_bus->irq); | 236 | kfree(new_bus->irq); |
237 | out_unmap_regs: | 237 | out_unmap_regs: |
238 | iounmap(fec->fecp); | 238 | iounmap(fec->fecp); |
239 | out_res: | ||
239 | out_fec: | 240 | out_fec: |
240 | kfree(fec); | 241 | kfree(fec); |
241 | out_mii: | 242 | out_mii: |
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 642dc633b444..393a0f175302 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -138,6 +138,7 @@ static int gfar_poll(struct napi_struct *napi, int budget); | |||
138 | static void gfar_netpoll(struct net_device *dev); | 138 | static void gfar_netpoll(struct net_device *dev); |
139 | #endif | 139 | #endif |
140 | int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit); | 140 | int gfar_clean_rx_ring(struct net_device *dev, int rx_work_limit); |
141 | static int gfar_clean_tx_ring(struct net_device *dev); | ||
141 | static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length); | 142 | static int gfar_process_frame(struct net_device *dev, struct sk_buff *skb, int length); |
142 | static void gfar_vlan_rx_register(struct net_device *netdev, | 143 | static void gfar_vlan_rx_register(struct net_device *netdev, |
143 | struct vlan_group *grp); | 144 | struct vlan_group *grp); |
@@ -634,6 +635,8 @@ static void free_skb_resources(struct gfar_private *priv) | |||
634 | dev_kfree_skb_any(priv->tx_skbuff[i]); | 635 | dev_kfree_skb_any(priv->tx_skbuff[i]); |
635 | priv->tx_skbuff[i] = NULL; | 636 | priv->tx_skbuff[i] = NULL; |
636 | } | 637 | } |
638 | |||
639 | txbdp++; | ||
637 | } | 640 | } |
638 | 641 | ||
639 | kfree(priv->tx_skbuff); | 642 | kfree(priv->tx_skbuff); |
@@ -1141,7 +1144,7 @@ static int gfar_close(struct net_device *dev) | |||
1141 | } | 1144 | } |
1142 | 1145 | ||
1143 | /* Changes the mac address if the controller is not running. */ | 1146 | /* Changes the mac address if the controller is not running. */ |
1144 | int gfar_set_mac_address(struct net_device *dev) | 1147 | static int gfar_set_mac_address(struct net_device *dev) |
1145 | { | 1148 | { |
1146 | gfar_set_mac_for_addr(dev, 0, dev->dev_addr); | 1149 | gfar_set_mac_for_addr(dev, 0, dev->dev_addr); |
1147 | 1150 | ||
@@ -1260,7 +1263,7 @@ static void gfar_timeout(struct net_device *dev) | |||
1260 | } | 1263 | } |
1261 | 1264 | ||
1262 | /* Interrupt Handler for Transmit complete */ | 1265 | /* Interrupt Handler for Transmit complete */ |
1263 | int gfar_clean_tx_ring(struct net_device *dev) | 1266 | static int gfar_clean_tx_ring(struct net_device *dev) |
1264 | { | 1267 | { |
1265 | struct txbd8 *bdp; | 1268 | struct txbd8 *bdp; |
1266 | struct gfar_private *priv = netdev_priv(dev); | 1269 | struct gfar_private *priv = netdev_priv(dev); |
diff --git a/drivers/net/gianfar.h b/drivers/net/gianfar.h index fd487be3993e..27f37c81e52c 100644 --- a/drivers/net/gianfar.h +++ b/drivers/net/gianfar.h | |||
@@ -782,5 +782,8 @@ extern void gfar_halt(struct net_device *dev); | |||
782 | extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, | 782 | extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev, |
783 | int enable, u32 regnum, u32 read); | 783 | int enable, u32 regnum, u32 read); |
784 | void gfar_init_sysfs(struct net_device *dev); | 784 | void gfar_init_sysfs(struct net_device *dev); |
785 | int gfar_local_mdio_write(struct gfar_mii __iomem *regs, int mii_id, | ||
786 | int regnum, u16 value); | ||
787 | int gfar_local_mdio_read(struct gfar_mii __iomem *regs, int mii_id, int regnum); | ||
785 | 788 | ||
786 | #endif /* __GIANFAR_H */ | 789 | #endif /* __GIANFAR_H */ |
diff --git a/drivers/net/gianfar_sysfs.c b/drivers/net/gianfar_sysfs.c index 230878b94190..5116f68e01b9 100644 --- a/drivers/net/gianfar_sysfs.c +++ b/drivers/net/gianfar_sysfs.c | |||
@@ -103,10 +103,10 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev, | |||
103 | 103 | ||
104 | spin_lock_irqsave(&priv->rxlock, flags); | 104 | spin_lock_irqsave(&priv->rxlock, flags); |
105 | if (length > priv->rx_buffer_size) | 105 | if (length > priv->rx_buffer_size) |
106 | return count; | 106 | goto out; |
107 | 107 | ||
108 | if (length == priv->rx_stash_size) | 108 | if (length == priv->rx_stash_size) |
109 | return count; | 109 | goto out; |
110 | 110 | ||
111 | priv->rx_stash_size = length; | 111 | priv->rx_stash_size = length; |
112 | 112 | ||
@@ -125,6 +125,7 @@ static ssize_t gfar_set_rx_stash_size(struct device *dev, | |||
125 | 125 | ||
126 | gfar_write(&priv->regs->attr, temp); | 126 | gfar_write(&priv->regs->attr, temp); |
127 | 127 | ||
128 | out: | ||
128 | spin_unlock_irqrestore(&priv->rxlock, flags); | 129 | spin_unlock_irqrestore(&priv->rxlock, flags); |
129 | 130 | ||
130 | return count; | 131 | return count; |
@@ -154,10 +155,10 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev, | |||
154 | 155 | ||
155 | spin_lock_irqsave(&priv->rxlock, flags); | 156 | spin_lock_irqsave(&priv->rxlock, flags); |
156 | if (index > priv->rx_stash_size) | 157 | if (index > priv->rx_stash_size) |
157 | return count; | 158 | goto out; |
158 | 159 | ||
159 | if (index == priv->rx_stash_index) | 160 | if (index == priv->rx_stash_index) |
160 | return count; | 161 | goto out; |
161 | 162 | ||
162 | priv->rx_stash_index = index; | 163 | priv->rx_stash_index = index; |
163 | 164 | ||
@@ -166,6 +167,7 @@ static ssize_t gfar_set_rx_stash_index(struct device *dev, | |||
166 | temp |= ATTRELI_EI(index); | 167 | temp |= ATTRELI_EI(index); |
167 | gfar_write(&priv->regs->attreli, flags); | 168 | gfar_write(&priv->regs->attreli, flags); |
168 | 169 | ||
170 | out: | ||
169 | spin_unlock_irqrestore(&priv->rxlock, flags); | 171 | spin_unlock_irqrestore(&priv->rxlock, flags); |
170 | 172 | ||
171 | return count; | 173 | return count; |
diff --git a/drivers/net/irda/nsc-ircc.c b/drivers/net/irda/nsc-ircc.c index a873d2b315ca..a7714da7c283 100644 --- a/drivers/net/irda/nsc-ircc.c +++ b/drivers/net/irda/nsc-ircc.c | |||
@@ -100,7 +100,9 @@ static int nsc_ircc_probe_39x(nsc_chip_t *chip, chipio_t *info); | |||
100 | static int nsc_ircc_init_108(nsc_chip_t *chip, chipio_t *info); | 100 | static int nsc_ircc_init_108(nsc_chip_t *chip, chipio_t *info); |
101 | static int nsc_ircc_init_338(nsc_chip_t *chip, chipio_t *info); | 101 | static int nsc_ircc_init_338(nsc_chip_t *chip, chipio_t *info); |
102 | static int nsc_ircc_init_39x(nsc_chip_t *chip, chipio_t *info); | 102 | static int nsc_ircc_init_39x(nsc_chip_t *chip, chipio_t *info); |
103 | #ifdef CONFIG_PNP | ||
103 | static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id); | 104 | static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id); |
105 | #endif | ||
104 | 106 | ||
105 | /* These are the known NSC chips */ | 107 | /* These are the known NSC chips */ |
106 | static nsc_chip_t chips[] = { | 108 | static nsc_chip_t chips[] = { |
@@ -156,9 +158,11 @@ static const struct pnp_device_id nsc_ircc_pnp_table[] = { | |||
156 | MODULE_DEVICE_TABLE(pnp, nsc_ircc_pnp_table); | 158 | MODULE_DEVICE_TABLE(pnp, nsc_ircc_pnp_table); |
157 | 159 | ||
158 | static struct pnp_driver nsc_ircc_pnp_driver = { | 160 | static struct pnp_driver nsc_ircc_pnp_driver = { |
161 | #ifdef CONFIG_PNP | ||
159 | .name = "nsc-ircc", | 162 | .name = "nsc-ircc", |
160 | .id_table = nsc_ircc_pnp_table, | 163 | .id_table = nsc_ircc_pnp_table, |
161 | .probe = nsc_ircc_pnp_probe, | 164 | .probe = nsc_ircc_pnp_probe, |
165 | #endif | ||
162 | }; | 166 | }; |
163 | 167 | ||
164 | /* Some prototypes */ | 168 | /* Some prototypes */ |
@@ -916,6 +920,7 @@ static int nsc_ircc_probe_39x(nsc_chip_t *chip, chipio_t *info) | |||
916 | return 0; | 920 | return 0; |
917 | } | 921 | } |
918 | 922 | ||
923 | #ifdef CONFIG_PNP | ||
919 | /* PNP probing */ | 924 | /* PNP probing */ |
920 | static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id) | 925 | static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *id) |
921 | { | 926 | { |
@@ -952,6 +957,7 @@ static int nsc_ircc_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *i | |||
952 | 957 | ||
953 | return 0; | 958 | return 0; |
954 | } | 959 | } |
960 | #endif | ||
955 | 961 | ||
956 | /* | 962 | /* |
957 | * Function nsc_ircc_setup (info) | 963 | * Function nsc_ircc_setup (info) |
diff --git a/drivers/net/irda/smsc-ircc2.c b/drivers/net/irda/smsc-ircc2.c index 1f26da761e9f..cfe0194fef71 100644 --- a/drivers/net/irda/smsc-ircc2.c +++ b/drivers/net/irda/smsc-ircc2.c | |||
@@ -376,6 +376,7 @@ MODULE_DEVICE_TABLE(pnp, smsc_ircc_pnp_table); | |||
376 | 376 | ||
377 | static int pnp_driver_registered; | 377 | static int pnp_driver_registered; |
378 | 378 | ||
379 | #ifdef CONFIG_PNP | ||
379 | static int __init smsc_ircc_pnp_probe(struct pnp_dev *dev, | 380 | static int __init smsc_ircc_pnp_probe(struct pnp_dev *dev, |
380 | const struct pnp_device_id *dev_id) | 381 | const struct pnp_device_id *dev_id) |
381 | { | 382 | { |
@@ -402,7 +403,9 @@ static struct pnp_driver smsc_ircc_pnp_driver = { | |||
402 | .id_table = smsc_ircc_pnp_table, | 403 | .id_table = smsc_ircc_pnp_table, |
403 | .probe = smsc_ircc_pnp_probe, | 404 | .probe = smsc_ircc_pnp_probe, |
404 | }; | 405 | }; |
405 | 406 | #else /* CONFIG_PNP */ | |
407 | static struct pnp_driver smsc_ircc_pnp_driver; | ||
408 | #endif | ||
406 | 409 | ||
407 | /******************************************************************************* | 410 | /******************************************************************************* |
408 | * | 411 | * |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 2056cfc624dc..c36a03ae9bfb 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -450,7 +450,7 @@ static void macvlan_dellink(struct net_device *dev) | |||
450 | unregister_netdevice(dev); | 450 | unregister_netdevice(dev); |
451 | 451 | ||
452 | if (list_empty(&port->vlans)) | 452 | if (list_empty(&port->vlans)) |
453 | macvlan_port_destroy(dev); | 453 | macvlan_port_destroy(port->dev); |
454 | } | 454 | } |
455 | 455 | ||
456 | static struct rtnl_link_ops macvlan_link_ops __read_mostly = { | 456 | static struct rtnl_link_ops macvlan_link_ops __read_mostly = { |
diff --git a/drivers/net/mlx4/mr.c b/drivers/net/mlx4/mr.c index cb46446b2691..03a9abcce524 100644 --- a/drivers/net/mlx4/mr.c +++ b/drivers/net/mlx4/mr.c | |||
@@ -551,7 +551,7 @@ int mlx4_fmr_alloc(struct mlx4_dev *dev, u32 pd, u32 access, int max_pages, | |||
551 | u64 mtt_seg; | 551 | u64 mtt_seg; |
552 | int err = -ENOMEM; | 552 | int err = -ENOMEM; |
553 | 553 | ||
554 | if (page_shift < 12 || page_shift >= 32) | 554 | if (page_shift < (ffs(dev->caps.page_size_cap) - 1) || page_shift >= 32) |
555 | return -EINVAL; | 555 | return -EINVAL; |
556 | 556 | ||
557 | /* All MTTs must fit in the same page */ | 557 | /* All MTTs must fit in the same page */ |
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index 381b36e5f64c..b7915cdcc6a5 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -91,6 +91,11 @@ | |||
91 | */ | 91 | */ |
92 | #define PHY_ADDR_REG 0x0000 | 92 | #define PHY_ADDR_REG 0x0000 |
93 | #define SMI_REG 0x0004 | 93 | #define SMI_REG 0x0004 |
94 | #define WINDOW_BASE(i) (0x0200 + ((i) << 3)) | ||
95 | #define WINDOW_SIZE(i) (0x0204 + ((i) << 3)) | ||
96 | #define WINDOW_REMAP_HIGH(i) (0x0280 + ((i) << 2)) | ||
97 | #define WINDOW_BAR_ENABLE 0x0290 | ||
98 | #define WINDOW_PROTECT(i) (0x0294 + ((i) << 4)) | ||
94 | 99 | ||
95 | /* | 100 | /* |
96 | * Per-port registers. | 101 | * Per-port registers. |
@@ -507,9 +512,23 @@ struct mv643xx_mib_counters { | |||
507 | u32 late_collision; | 512 | u32 late_collision; |
508 | }; | 513 | }; |
509 | 514 | ||
515 | struct mv643xx_shared_private { | ||
516 | void __iomem *eth_base; | ||
517 | |||
518 | /* used to protect SMI_REG, which is shared across ports */ | ||
519 | spinlock_t phy_lock; | ||
520 | |||
521 | u32 win_protect; | ||
522 | |||
523 | unsigned int t_clk; | ||
524 | }; | ||
525 | |||
510 | struct mv643xx_private { | 526 | struct mv643xx_private { |
527 | struct mv643xx_shared_private *shared; | ||
511 | int port_num; /* User Ethernet port number */ | 528 | int port_num; /* User Ethernet port number */ |
512 | 529 | ||
530 | struct mv643xx_shared_private *shared_smi; | ||
531 | |||
513 | u32 rx_sram_addr; /* Base address of rx sram area */ | 532 | u32 rx_sram_addr; /* Base address of rx sram area */ |
514 | u32 rx_sram_size; /* Size of rx sram area */ | 533 | u32 rx_sram_size; /* Size of rx sram area */ |
515 | u32 tx_sram_addr; /* Base address of tx sram area */ | 534 | u32 tx_sram_addr; /* Base address of tx sram area */ |
@@ -614,19 +633,14 @@ static const struct ethtool_ops mv643xx_ethtool_ops; | |||
614 | static char mv643xx_driver_name[] = "mv643xx_eth"; | 633 | static char mv643xx_driver_name[] = "mv643xx_eth"; |
615 | static char mv643xx_driver_version[] = "1.0"; | 634 | static char mv643xx_driver_version[] = "1.0"; |
616 | 635 | ||
617 | static void __iomem *mv643xx_eth_base; | ||
618 | |||
619 | /* used to protect SMI_REG, which is shared across ports */ | ||
620 | static DEFINE_SPINLOCK(mv643xx_eth_phy_lock); | ||
621 | |||
622 | static inline u32 rdl(struct mv643xx_private *mp, int offset) | 636 | static inline u32 rdl(struct mv643xx_private *mp, int offset) |
623 | { | 637 | { |
624 | return readl(mv643xx_eth_base + offset); | 638 | return readl(mp->shared->eth_base + offset); |
625 | } | 639 | } |
626 | 640 | ||
627 | static inline void wrl(struct mv643xx_private *mp, int offset, u32 data) | 641 | static inline void wrl(struct mv643xx_private *mp, int offset, u32 data) |
628 | { | 642 | { |
629 | writel(data, mv643xx_eth_base + offset); | 643 | writel(data, mp->shared->eth_base + offset); |
630 | } | 644 | } |
631 | 645 | ||
632 | /* | 646 | /* |
@@ -1119,7 +1133,6 @@ static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id) | |||
1119 | * | 1133 | * |
1120 | * INPUT: | 1134 | * INPUT: |
1121 | * struct mv643xx_private *mp Ethernet port | 1135 | * struct mv643xx_private *mp Ethernet port |
1122 | * unsigned int t_clk t_clk of the MV-643xx chip in HZ units | ||
1123 | * unsigned int delay Delay in usec | 1136 | * unsigned int delay Delay in usec |
1124 | * | 1137 | * |
1125 | * OUTPUT: | 1138 | * OUTPUT: |
@@ -1130,10 +1143,10 @@ static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id) | |||
1130 | * | 1143 | * |
1131 | */ | 1144 | */ |
1132 | static unsigned int eth_port_set_rx_coal(struct mv643xx_private *mp, | 1145 | static unsigned int eth_port_set_rx_coal(struct mv643xx_private *mp, |
1133 | unsigned int t_clk, unsigned int delay) | 1146 | unsigned int delay) |
1134 | { | 1147 | { |
1135 | unsigned int port_num = mp->port_num; | 1148 | unsigned int port_num = mp->port_num; |
1136 | unsigned int coal = ((t_clk / 1000000) * delay) / 64; | 1149 | unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64; |
1137 | 1150 | ||
1138 | /* Set RX Coalescing mechanism */ | 1151 | /* Set RX Coalescing mechanism */ |
1139 | wrl(mp, SDMA_CONFIG_REG(port_num), | 1152 | wrl(mp, SDMA_CONFIG_REG(port_num), |
@@ -1158,7 +1171,6 @@ static unsigned int eth_port_set_rx_coal(struct mv643xx_private *mp, | |||
1158 | * | 1171 | * |
1159 | * INPUT: | 1172 | * INPUT: |
1160 | * struct mv643xx_private *mp Ethernet port | 1173 | * struct mv643xx_private *mp Ethernet port |
1161 | * unsigned int t_clk t_clk of the MV-643xx chip in HZ units | ||
1162 | * unsigned int delay Delay in uSeconds | 1174 | * unsigned int delay Delay in uSeconds |
1163 | * | 1175 | * |
1164 | * OUTPUT: | 1176 | * OUTPUT: |
@@ -1169,9 +1181,9 @@ static unsigned int eth_port_set_rx_coal(struct mv643xx_private *mp, | |||
1169 | * | 1181 | * |
1170 | */ | 1182 | */ |
1171 | static unsigned int eth_port_set_tx_coal(struct mv643xx_private *mp, | 1183 | static unsigned int eth_port_set_tx_coal(struct mv643xx_private *mp, |
1172 | unsigned int t_clk, unsigned int delay) | 1184 | unsigned int delay) |
1173 | { | 1185 | { |
1174 | unsigned int coal = ((t_clk / 1000000) * delay) / 64; | 1186 | unsigned int coal = ((mp->shared->t_clk / 1000000) * delay) / 64; |
1175 | 1187 | ||
1176 | /* Set TX Coalescing mechanism */ | 1188 | /* Set TX Coalescing mechanism */ |
1177 | wrl(mp, TX_FIFO_URGENT_THRESHOLD_REG(mp->port_num), coal << 4); | 1189 | wrl(mp, TX_FIFO_URGENT_THRESHOLD_REG(mp->port_num), coal << 4); |
@@ -1413,11 +1425,11 @@ static int mv643xx_eth_open(struct net_device *dev) | |||
1413 | 1425 | ||
1414 | #ifdef MV643XX_COAL | 1426 | #ifdef MV643XX_COAL |
1415 | mp->rx_int_coal = | 1427 | mp->rx_int_coal = |
1416 | eth_port_set_rx_coal(mp, 133000000, MV643XX_RX_COAL); | 1428 | eth_port_set_rx_coal(mp, MV643XX_RX_COAL); |
1417 | #endif | 1429 | #endif |
1418 | 1430 | ||
1419 | mp->tx_int_coal = | 1431 | mp->tx_int_coal = |
1420 | eth_port_set_tx_coal(mp, 133000000, MV643XX_TX_COAL); | 1432 | eth_port_set_tx_coal(mp, MV643XX_TX_COAL); |
1421 | 1433 | ||
1422 | /* Unmask phy and link status changes interrupts */ | 1434 | /* Unmask phy and link status changes interrupts */ |
1423 | wrl(mp, INTERRUPT_EXTEND_MASK_REG(port_num), ETH_INT_UNMASK_ALL_EXT); | 1435 | wrl(mp, INTERRUPT_EXTEND_MASK_REG(port_num), ETH_INT_UNMASK_ALL_EXT); |
@@ -1827,6 +1839,11 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | |||
1827 | return -ENODEV; | 1839 | return -ENODEV; |
1828 | } | 1840 | } |
1829 | 1841 | ||
1842 | if (pd->shared == NULL) { | ||
1843 | printk(KERN_ERR "No mv643xx_eth_platform_data->shared\n"); | ||
1844 | return -ENODEV; | ||
1845 | } | ||
1846 | |||
1830 | dev = alloc_etherdev(sizeof(struct mv643xx_private)); | 1847 | dev = alloc_etherdev(sizeof(struct mv643xx_private)); |
1831 | if (!dev) | 1848 | if (!dev) |
1832 | return -ENOMEM; | 1849 | return -ENOMEM; |
@@ -1877,8 +1894,16 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | |||
1877 | 1894 | ||
1878 | spin_lock_init(&mp->lock); | 1895 | spin_lock_init(&mp->lock); |
1879 | 1896 | ||
1897 | mp->shared = platform_get_drvdata(pd->shared); | ||
1880 | port_num = mp->port_num = pd->port_number; | 1898 | port_num = mp->port_num = pd->port_number; |
1881 | 1899 | ||
1900 | if (mp->shared->win_protect) | ||
1901 | wrl(mp, WINDOW_PROTECT(port_num), mp->shared->win_protect); | ||
1902 | |||
1903 | mp->shared_smi = mp->shared; | ||
1904 | if (pd->shared_smi != NULL) | ||
1905 | mp->shared_smi = platform_get_drvdata(pd->shared_smi); | ||
1906 | |||
1882 | /* set default config values */ | 1907 | /* set default config values */ |
1883 | eth_port_uc_addr_get(mp, dev->dev_addr); | 1908 | eth_port_uc_addr_get(mp, dev->dev_addr); |
1884 | mp->rx_ring_size = PORT_DEFAULT_RECEIVE_QUEUE_SIZE; | 1909 | mp->rx_ring_size = PORT_DEFAULT_RECEIVE_QUEUE_SIZE; |
@@ -1983,30 +2008,91 @@ static int mv643xx_eth_remove(struct platform_device *pdev) | |||
1983 | return 0; | 2008 | return 0; |
1984 | } | 2009 | } |
1985 | 2010 | ||
2011 | static void mv643xx_eth_conf_mbus_windows(struct mv643xx_shared_private *msp, | ||
2012 | struct mbus_dram_target_info *dram) | ||
2013 | { | ||
2014 | void __iomem *base = msp->eth_base; | ||
2015 | u32 win_enable; | ||
2016 | u32 win_protect; | ||
2017 | int i; | ||
2018 | |||
2019 | for (i = 0; i < 6; i++) { | ||
2020 | writel(0, base + WINDOW_BASE(i)); | ||
2021 | writel(0, base + WINDOW_SIZE(i)); | ||
2022 | if (i < 4) | ||
2023 | writel(0, base + WINDOW_REMAP_HIGH(i)); | ||
2024 | } | ||
2025 | |||
2026 | win_enable = 0x3f; | ||
2027 | win_protect = 0; | ||
2028 | |||
2029 | for (i = 0; i < dram->num_cs; i++) { | ||
2030 | struct mbus_dram_window *cs = dram->cs + i; | ||
2031 | |||
2032 | writel((cs->base & 0xffff0000) | | ||
2033 | (cs->mbus_attr << 8) | | ||
2034 | dram->mbus_dram_target_id, base + WINDOW_BASE(i)); | ||
2035 | writel((cs->size - 1) & 0xffff0000, base + WINDOW_SIZE(i)); | ||
2036 | |||
2037 | win_enable &= ~(1 << i); | ||
2038 | win_protect |= 3 << (2 * i); | ||
2039 | } | ||
2040 | |||
2041 | writel(win_enable, base + WINDOW_BAR_ENABLE); | ||
2042 | msp->win_protect = win_protect; | ||
2043 | } | ||
2044 | |||
1986 | static int mv643xx_eth_shared_probe(struct platform_device *pdev) | 2045 | static int mv643xx_eth_shared_probe(struct platform_device *pdev) |
1987 | { | 2046 | { |
1988 | static int mv643xx_version_printed = 0; | 2047 | static int mv643xx_version_printed = 0; |
2048 | struct mv643xx_eth_shared_platform_data *pd = pdev->dev.platform_data; | ||
2049 | struct mv643xx_shared_private *msp; | ||
1989 | struct resource *res; | 2050 | struct resource *res; |
2051 | int ret; | ||
1990 | 2052 | ||
1991 | if (!mv643xx_version_printed++) | 2053 | if (!mv643xx_version_printed++) |
1992 | printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n"); | 2054 | printk(KERN_NOTICE "MV-643xx 10/100/1000 Ethernet Driver\n"); |
1993 | 2055 | ||
2056 | ret = -EINVAL; | ||
1994 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2057 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1995 | if (res == NULL) | 2058 | if (res == NULL) |
1996 | return -ENODEV; | 2059 | goto out; |
1997 | 2060 | ||
1998 | mv643xx_eth_base = ioremap(res->start, res->end - res->start + 1); | 2061 | ret = -ENOMEM; |
1999 | if (mv643xx_eth_base == NULL) | 2062 | msp = kmalloc(sizeof(*msp), GFP_KERNEL); |
2000 | return -ENOMEM; | 2063 | if (msp == NULL) |
2064 | goto out; | ||
2065 | memset(msp, 0, sizeof(*msp)); | ||
2066 | |||
2067 | msp->eth_base = ioremap(res->start, res->end - res->start + 1); | ||
2068 | if (msp->eth_base == NULL) | ||
2069 | goto out_free; | ||
2070 | |||
2071 | spin_lock_init(&msp->phy_lock); | ||
2072 | msp->t_clk = (pd != NULL && pd->t_clk != 0) ? pd->t_clk : 133000000; | ||
2073 | |||
2074 | platform_set_drvdata(pdev, msp); | ||
2075 | |||
2076 | /* | ||
2077 | * (Re-)program MBUS remapping windows if we are asked to. | ||
2078 | */ | ||
2079 | if (pd != NULL && pd->dram != NULL) | ||
2080 | mv643xx_eth_conf_mbus_windows(msp, pd->dram); | ||
2001 | 2081 | ||
2002 | return 0; | 2082 | return 0; |
2003 | 2083 | ||
2084 | out_free: | ||
2085 | kfree(msp); | ||
2086 | out: | ||
2087 | return ret; | ||
2004 | } | 2088 | } |
2005 | 2089 | ||
2006 | static int mv643xx_eth_shared_remove(struct platform_device *pdev) | 2090 | static int mv643xx_eth_shared_remove(struct platform_device *pdev) |
2007 | { | 2091 | { |
2008 | iounmap(mv643xx_eth_base); | 2092 | struct mv643xx_shared_private *msp = platform_get_drvdata(pdev); |
2009 | mv643xx_eth_base = NULL; | 2093 | |
2094 | iounmap(msp->eth_base); | ||
2095 | kfree(msp); | ||
2010 | 2096 | ||
2011 | return 0; | 2097 | return 0; |
2012 | } | 2098 | } |
@@ -2906,15 +2992,16 @@ static void eth_port_reset(struct mv643xx_private *mp) | |||
2906 | static void eth_port_read_smi_reg(struct mv643xx_private *mp, | 2992 | static void eth_port_read_smi_reg(struct mv643xx_private *mp, |
2907 | unsigned int phy_reg, unsigned int *value) | 2993 | unsigned int phy_reg, unsigned int *value) |
2908 | { | 2994 | { |
2995 | void __iomem *smi_reg = mp->shared_smi->eth_base + SMI_REG; | ||
2909 | int phy_addr = ethernet_phy_get(mp); | 2996 | int phy_addr = ethernet_phy_get(mp); |
2910 | unsigned long flags; | 2997 | unsigned long flags; |
2911 | int i; | 2998 | int i; |
2912 | 2999 | ||
2913 | /* the SMI register is a shared resource */ | 3000 | /* the SMI register is a shared resource */ |
2914 | spin_lock_irqsave(&mv643xx_eth_phy_lock, flags); | 3001 | spin_lock_irqsave(&mp->shared_smi->phy_lock, flags); |
2915 | 3002 | ||
2916 | /* wait for the SMI register to become available */ | 3003 | /* wait for the SMI register to become available */ |
2917 | for (i = 0; rdl(mp, SMI_REG) & ETH_SMI_BUSY; i++) { | 3004 | for (i = 0; readl(smi_reg) & ETH_SMI_BUSY; i++) { |
2918 | if (i == PHY_WAIT_ITERATIONS) { | 3005 | if (i == PHY_WAIT_ITERATIONS) { |
2919 | printk("%s: PHY busy timeout\n", mp->dev->name); | 3006 | printk("%s: PHY busy timeout\n", mp->dev->name); |
2920 | goto out; | 3007 | goto out; |
@@ -2922,11 +3009,11 @@ static void eth_port_read_smi_reg(struct mv643xx_private *mp, | |||
2922 | udelay(PHY_WAIT_MICRO_SECONDS); | 3009 | udelay(PHY_WAIT_MICRO_SECONDS); |
2923 | } | 3010 | } |
2924 | 3011 | ||
2925 | wrl(mp, SMI_REG, | 3012 | writel((phy_addr << 16) | (phy_reg << 21) | ETH_SMI_OPCODE_READ, |
2926 | (phy_addr << 16) | (phy_reg << 21) | ETH_SMI_OPCODE_READ); | 3013 | smi_reg); |
2927 | 3014 | ||
2928 | /* now wait for the data to be valid */ | 3015 | /* now wait for the data to be valid */ |
2929 | for (i = 0; !(rdl(mp, SMI_REG) & ETH_SMI_READ_VALID); i++) { | 3016 | for (i = 0; !(readl(smi_reg) & ETH_SMI_READ_VALID); i++) { |
2930 | if (i == PHY_WAIT_ITERATIONS) { | 3017 | if (i == PHY_WAIT_ITERATIONS) { |
2931 | printk("%s: PHY read timeout\n", mp->dev->name); | 3018 | printk("%s: PHY read timeout\n", mp->dev->name); |
2932 | goto out; | 3019 | goto out; |
@@ -2934,9 +3021,9 @@ static void eth_port_read_smi_reg(struct mv643xx_private *mp, | |||
2934 | udelay(PHY_WAIT_MICRO_SECONDS); | 3021 | udelay(PHY_WAIT_MICRO_SECONDS); |
2935 | } | 3022 | } |
2936 | 3023 | ||
2937 | *value = rdl(mp, SMI_REG) & 0xffff; | 3024 | *value = readl(smi_reg) & 0xffff; |
2938 | out: | 3025 | out: |
2939 | spin_unlock_irqrestore(&mv643xx_eth_phy_lock, flags); | 3026 | spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags); |
2940 | } | 3027 | } |
2941 | 3028 | ||
2942 | /* | 3029 | /* |
@@ -2962,17 +3049,16 @@ out: | |||
2962 | static void eth_port_write_smi_reg(struct mv643xx_private *mp, | 3049 | static void eth_port_write_smi_reg(struct mv643xx_private *mp, |
2963 | unsigned int phy_reg, unsigned int value) | 3050 | unsigned int phy_reg, unsigned int value) |
2964 | { | 3051 | { |
2965 | int phy_addr; | 3052 | void __iomem *smi_reg = mp->shared_smi->eth_base + SMI_REG; |
2966 | int i; | 3053 | int phy_addr = ethernet_phy_get(mp); |
2967 | unsigned long flags; | 3054 | unsigned long flags; |
2968 | 3055 | int i; | |
2969 | phy_addr = ethernet_phy_get(mp); | ||
2970 | 3056 | ||
2971 | /* the SMI register is a shared resource */ | 3057 | /* the SMI register is a shared resource */ |
2972 | spin_lock_irqsave(&mv643xx_eth_phy_lock, flags); | 3058 | spin_lock_irqsave(&mp->shared_smi->phy_lock, flags); |
2973 | 3059 | ||
2974 | /* wait for the SMI register to become available */ | 3060 | /* wait for the SMI register to become available */ |
2975 | for (i = 0; rdl(mp, SMI_REG) & ETH_SMI_BUSY; i++) { | 3061 | for (i = 0; readl(smi_reg) & ETH_SMI_BUSY; i++) { |
2976 | if (i == PHY_WAIT_ITERATIONS) { | 3062 | if (i == PHY_WAIT_ITERATIONS) { |
2977 | printk("%s: PHY busy timeout\n", mp->dev->name); | 3063 | printk("%s: PHY busy timeout\n", mp->dev->name); |
2978 | goto out; | 3064 | goto out; |
@@ -2980,10 +3066,10 @@ static void eth_port_write_smi_reg(struct mv643xx_private *mp, | |||
2980 | udelay(PHY_WAIT_MICRO_SECONDS); | 3066 | udelay(PHY_WAIT_MICRO_SECONDS); |
2981 | } | 3067 | } |
2982 | 3068 | ||
2983 | wrl(mp, SMI_REG, (phy_addr << 16) | (phy_reg << 21) | | 3069 | writel((phy_addr << 16) | (phy_reg << 21) | |
2984 | ETH_SMI_OPCODE_WRITE | (value & 0xffff)); | 3070 | ETH_SMI_OPCODE_WRITE | (value & 0xffff), smi_reg); |
2985 | out: | 3071 | out: |
2986 | spin_unlock_irqrestore(&mv643xx_eth_phy_lock, flags); | 3072 | spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags); |
2987 | } | 3073 | } |
2988 | 3074 | ||
2989 | /* | 3075 | /* |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index ef63c8d2bd7e..c91b12ea26ad 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -144,11 +144,13 @@ struct myri10ge_tx_buf { | |||
144 | char *req_bytes; | 144 | char *req_bytes; |
145 | struct myri10ge_tx_buffer_state *info; | 145 | struct myri10ge_tx_buffer_state *info; |
146 | int mask; /* number of transmit slots -1 */ | 146 | int mask; /* number of transmit slots -1 */ |
147 | int boundary; /* boundary transmits cannot cross */ | ||
148 | int req ____cacheline_aligned; /* transmit slots submitted */ | 147 | int req ____cacheline_aligned; /* transmit slots submitted */ |
149 | int pkt_start; /* packets started */ | 148 | int pkt_start; /* packets started */ |
149 | int stop_queue; | ||
150 | int linearized; | ||
150 | int done ____cacheline_aligned; /* transmit slots completed */ | 151 | int done ____cacheline_aligned; /* transmit slots completed */ |
151 | int pkt_done; /* packets completed */ | 152 | int pkt_done; /* packets completed */ |
153 | int wake_queue; | ||
152 | }; | 154 | }; |
153 | 155 | ||
154 | struct myri10ge_rx_done { | 156 | struct myri10ge_rx_done { |
@@ -160,29 +162,50 @@ struct myri10ge_rx_done { | |||
160 | struct net_lro_desc lro_desc[MYRI10GE_MAX_LRO_DESCRIPTORS]; | 162 | struct net_lro_desc lro_desc[MYRI10GE_MAX_LRO_DESCRIPTORS]; |
161 | }; | 163 | }; |
162 | 164 | ||
163 | struct myri10ge_priv { | 165 | struct myri10ge_slice_netstats { |
164 | int running; /* running? */ | 166 | unsigned long rx_packets; |
165 | int csum_flag; /* rx_csums? */ | 167 | unsigned long tx_packets; |
168 | unsigned long rx_bytes; | ||
169 | unsigned long tx_bytes; | ||
170 | unsigned long rx_dropped; | ||
171 | unsigned long tx_dropped; | ||
172 | }; | ||
173 | |||
174 | struct myri10ge_slice_state { | ||
166 | struct myri10ge_tx_buf tx; /* transmit ring */ | 175 | struct myri10ge_tx_buf tx; /* transmit ring */ |
167 | struct myri10ge_rx_buf rx_small; | 176 | struct myri10ge_rx_buf rx_small; |
168 | struct myri10ge_rx_buf rx_big; | 177 | struct myri10ge_rx_buf rx_big; |
169 | struct myri10ge_rx_done rx_done; | 178 | struct myri10ge_rx_done rx_done; |
179 | struct net_device *dev; | ||
180 | struct napi_struct napi; | ||
181 | struct myri10ge_priv *mgp; | ||
182 | struct myri10ge_slice_netstats stats; | ||
183 | __be32 __iomem *irq_claim; | ||
184 | struct mcp_irq_data *fw_stats; | ||
185 | dma_addr_t fw_stats_bus; | ||
186 | int watchdog_tx_done; | ||
187 | int watchdog_tx_req; | ||
188 | }; | ||
189 | |||
190 | struct myri10ge_priv { | ||
191 | struct myri10ge_slice_state ss; | ||
192 | int tx_boundary; /* boundary transmits cannot cross */ | ||
193 | int running; /* running? */ | ||
194 | int csum_flag; /* rx_csums? */ | ||
170 | int small_bytes; | 195 | int small_bytes; |
171 | int big_bytes; | 196 | int big_bytes; |
197 | int max_intr_slots; | ||
172 | struct net_device *dev; | 198 | struct net_device *dev; |
173 | struct napi_struct napi; | ||
174 | struct net_device_stats stats; | 199 | struct net_device_stats stats; |
200 | spinlock_t stats_lock; | ||
175 | u8 __iomem *sram; | 201 | u8 __iomem *sram; |
176 | int sram_size; | 202 | int sram_size; |
177 | unsigned long board_span; | 203 | unsigned long board_span; |
178 | unsigned long iomem_base; | 204 | unsigned long iomem_base; |
179 | __be32 __iomem *irq_claim; | ||
180 | __be32 __iomem *irq_deassert; | 205 | __be32 __iomem *irq_deassert; |
181 | char *mac_addr_string; | 206 | char *mac_addr_string; |
182 | struct mcp_cmd_response *cmd; | 207 | struct mcp_cmd_response *cmd; |
183 | dma_addr_t cmd_bus; | 208 | dma_addr_t cmd_bus; |
184 | struct mcp_irq_data *fw_stats; | ||
185 | dma_addr_t fw_stats_bus; | ||
186 | struct pci_dev *pdev; | 209 | struct pci_dev *pdev; |
187 | int msi_enabled; | 210 | int msi_enabled; |
188 | u32 link_state; | 211 | u32 link_state; |
@@ -191,20 +214,16 @@ struct myri10ge_priv { | |||
191 | __be32 __iomem *intr_coal_delay_ptr; | 214 | __be32 __iomem *intr_coal_delay_ptr; |
192 | int mtrr; | 215 | int mtrr; |
193 | int wc_enabled; | 216 | int wc_enabled; |
194 | int wake_queue; | ||
195 | int stop_queue; | ||
196 | int down_cnt; | 217 | int down_cnt; |
197 | wait_queue_head_t down_wq; | 218 | wait_queue_head_t down_wq; |
198 | struct work_struct watchdog_work; | 219 | struct work_struct watchdog_work; |
199 | struct timer_list watchdog_timer; | 220 | struct timer_list watchdog_timer; |
200 | int watchdog_tx_done; | ||
201 | int watchdog_tx_req; | ||
202 | int watchdog_pause; | ||
203 | int watchdog_resets; | 221 | int watchdog_resets; |
204 | int tx_linearized; | 222 | int watchdog_pause; |
205 | int pause; | 223 | int pause; |
206 | char *fw_name; | 224 | char *fw_name; |
207 | char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; | 225 | char eeprom_strings[MYRI10GE_EEPROM_STRINGS_SIZE]; |
226 | char *product_code_string; | ||
208 | char fw_version[128]; | 227 | char fw_version[128]; |
209 | int fw_ver_major; | 228 | int fw_ver_major; |
210 | int fw_ver_minor; | 229 | int fw_ver_minor; |
@@ -228,58 +247,54 @@ static char *myri10ge_fw_aligned = "myri10ge_eth_z8e.dat"; | |||
228 | 247 | ||
229 | static char *myri10ge_fw_name = NULL; | 248 | static char *myri10ge_fw_name = NULL; |
230 | module_param(myri10ge_fw_name, charp, S_IRUGO | S_IWUSR); | 249 | module_param(myri10ge_fw_name, charp, S_IRUGO | S_IWUSR); |
231 | MODULE_PARM_DESC(myri10ge_fw_name, "Firmware image name\n"); | 250 | MODULE_PARM_DESC(myri10ge_fw_name, "Firmware image name"); |
232 | 251 | ||
233 | static int myri10ge_ecrc_enable = 1; | 252 | static int myri10ge_ecrc_enable = 1; |
234 | module_param(myri10ge_ecrc_enable, int, S_IRUGO); | 253 | module_param(myri10ge_ecrc_enable, int, S_IRUGO); |
235 | MODULE_PARM_DESC(myri10ge_ecrc_enable, "Enable Extended CRC on PCI-E\n"); | 254 | MODULE_PARM_DESC(myri10ge_ecrc_enable, "Enable Extended CRC on PCI-E"); |
236 | |||
237 | static int myri10ge_max_intr_slots = 1024; | ||
238 | module_param(myri10ge_max_intr_slots, int, S_IRUGO); | ||
239 | MODULE_PARM_DESC(myri10ge_max_intr_slots, "Interrupt queue slots\n"); | ||
240 | 255 | ||
241 | static int myri10ge_small_bytes = -1; /* -1 == auto */ | 256 | static int myri10ge_small_bytes = -1; /* -1 == auto */ |
242 | module_param(myri10ge_small_bytes, int, S_IRUGO | S_IWUSR); | 257 | module_param(myri10ge_small_bytes, int, S_IRUGO | S_IWUSR); |
243 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets\n"); | 258 | MODULE_PARM_DESC(myri10ge_small_bytes, "Threshold of small packets"); |
244 | 259 | ||
245 | static int myri10ge_msi = 1; /* enable msi by default */ | 260 | static int myri10ge_msi = 1; /* enable msi by default */ |
246 | module_param(myri10ge_msi, int, S_IRUGO | S_IWUSR); | 261 | module_param(myri10ge_msi, int, S_IRUGO | S_IWUSR); |
247 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts\n"); | 262 | MODULE_PARM_DESC(myri10ge_msi, "Enable Message Signalled Interrupts"); |
248 | 263 | ||
249 | static int myri10ge_intr_coal_delay = 75; | 264 | static int myri10ge_intr_coal_delay = 75; |
250 | module_param(myri10ge_intr_coal_delay, int, S_IRUGO); | 265 | module_param(myri10ge_intr_coal_delay, int, S_IRUGO); |
251 | MODULE_PARM_DESC(myri10ge_intr_coal_delay, "Interrupt coalescing delay\n"); | 266 | MODULE_PARM_DESC(myri10ge_intr_coal_delay, "Interrupt coalescing delay"); |
252 | 267 | ||
253 | static int myri10ge_flow_control = 1; | 268 | static int myri10ge_flow_control = 1; |
254 | module_param(myri10ge_flow_control, int, S_IRUGO); | 269 | module_param(myri10ge_flow_control, int, S_IRUGO); |
255 | MODULE_PARM_DESC(myri10ge_flow_control, "Pause parameter\n"); | 270 | MODULE_PARM_DESC(myri10ge_flow_control, "Pause parameter"); |
256 | 271 | ||
257 | static int myri10ge_deassert_wait = 1; | 272 | static int myri10ge_deassert_wait = 1; |
258 | module_param(myri10ge_deassert_wait, int, S_IRUGO | S_IWUSR); | 273 | module_param(myri10ge_deassert_wait, int, S_IRUGO | S_IWUSR); |
259 | MODULE_PARM_DESC(myri10ge_deassert_wait, | 274 | MODULE_PARM_DESC(myri10ge_deassert_wait, |
260 | "Wait when deasserting legacy interrupts\n"); | 275 | "Wait when deasserting legacy interrupts"); |
261 | 276 | ||
262 | static int myri10ge_force_firmware = 0; | 277 | static int myri10ge_force_firmware = 0; |
263 | module_param(myri10ge_force_firmware, int, S_IRUGO); | 278 | module_param(myri10ge_force_firmware, int, S_IRUGO); |
264 | MODULE_PARM_DESC(myri10ge_force_firmware, | 279 | MODULE_PARM_DESC(myri10ge_force_firmware, |
265 | "Force firmware to assume aligned completions\n"); | 280 | "Force firmware to assume aligned completions"); |
266 | 281 | ||
267 | static int myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; | 282 | static int myri10ge_initial_mtu = MYRI10GE_MAX_ETHER_MTU - ETH_HLEN; |
268 | module_param(myri10ge_initial_mtu, int, S_IRUGO); | 283 | module_param(myri10ge_initial_mtu, int, S_IRUGO); |
269 | MODULE_PARM_DESC(myri10ge_initial_mtu, "Initial MTU\n"); | 284 | MODULE_PARM_DESC(myri10ge_initial_mtu, "Initial MTU"); |
270 | 285 | ||
271 | static int myri10ge_napi_weight = 64; | 286 | static int myri10ge_napi_weight = 64; |
272 | module_param(myri10ge_napi_weight, int, S_IRUGO); | 287 | module_param(myri10ge_napi_weight, int, S_IRUGO); |
273 | MODULE_PARM_DESC(myri10ge_napi_weight, "Set NAPI weight\n"); | 288 | MODULE_PARM_DESC(myri10ge_napi_weight, "Set NAPI weight"); |
274 | 289 | ||
275 | static int myri10ge_watchdog_timeout = 1; | 290 | static int myri10ge_watchdog_timeout = 1; |
276 | module_param(myri10ge_watchdog_timeout, int, S_IRUGO); | 291 | module_param(myri10ge_watchdog_timeout, int, S_IRUGO); |
277 | MODULE_PARM_DESC(myri10ge_watchdog_timeout, "Set watchdog timeout\n"); | 292 | MODULE_PARM_DESC(myri10ge_watchdog_timeout, "Set watchdog timeout"); |
278 | 293 | ||
279 | static int myri10ge_max_irq_loops = 1048576; | 294 | static int myri10ge_max_irq_loops = 1048576; |
280 | module_param(myri10ge_max_irq_loops, int, S_IRUGO); | 295 | module_param(myri10ge_max_irq_loops, int, S_IRUGO); |
281 | MODULE_PARM_DESC(myri10ge_max_irq_loops, | 296 | MODULE_PARM_DESC(myri10ge_max_irq_loops, |
282 | "Set stuck legacy IRQ detection threshold\n"); | 297 | "Set stuck legacy IRQ detection threshold"); |
283 | 298 | ||
284 | #define MYRI10GE_MSG_DEFAULT NETIF_MSG_LINK | 299 | #define MYRI10GE_MSG_DEFAULT NETIF_MSG_LINK |
285 | 300 | ||
@@ -289,21 +304,22 @@ MODULE_PARM_DESC(myri10ge_debug, "Debug level (0=none,...,16=all)"); | |||
289 | 304 | ||
290 | static int myri10ge_lro = 1; | 305 | static int myri10ge_lro = 1; |
291 | module_param(myri10ge_lro, int, S_IRUGO); | 306 | module_param(myri10ge_lro, int, S_IRUGO); |
292 | MODULE_PARM_DESC(myri10ge_lro, "Enable large receive offload\n"); | 307 | MODULE_PARM_DESC(myri10ge_lro, "Enable large receive offload"); |
293 | 308 | ||
294 | static int myri10ge_lro_max_pkts = MYRI10GE_LRO_MAX_PKTS; | 309 | static int myri10ge_lro_max_pkts = MYRI10GE_LRO_MAX_PKTS; |
295 | module_param(myri10ge_lro_max_pkts, int, S_IRUGO); | 310 | module_param(myri10ge_lro_max_pkts, int, S_IRUGO); |
296 | MODULE_PARM_DESC(myri10ge_lro, "Number of LRO packets to be aggregated\n"); | 311 | MODULE_PARM_DESC(myri10ge_lro_max_pkts, |
312 | "Number of LRO packets to be aggregated"); | ||
297 | 313 | ||
298 | static int myri10ge_fill_thresh = 256; | 314 | static int myri10ge_fill_thresh = 256; |
299 | module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR); | 315 | module_param(myri10ge_fill_thresh, int, S_IRUGO | S_IWUSR); |
300 | MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed\n"); | 316 | MODULE_PARM_DESC(myri10ge_fill_thresh, "Number of empty rx slots allowed"); |
301 | 317 | ||
302 | static int myri10ge_reset_recover = 1; | 318 | static int myri10ge_reset_recover = 1; |
303 | 319 | ||
304 | static int myri10ge_wcfifo = 0; | 320 | static int myri10ge_wcfifo = 0; |
305 | module_param(myri10ge_wcfifo, int, S_IRUGO); | 321 | module_param(myri10ge_wcfifo, int, S_IRUGO); |
306 | MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled\n"); | 322 | MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled"); |
307 | 323 | ||
308 | #define MYRI10GE_FW_OFFSET 1024*1024 | 324 | #define MYRI10GE_FW_OFFSET 1024*1024 |
309 | #define MYRI10GE_HIGHPART_TO_U32(X) \ | 325 | #define MYRI10GE_HIGHPART_TO_U32(X) \ |
@@ -359,8 +375,10 @@ myri10ge_send_cmd(struct myri10ge_priv *mgp, u32 cmd, | |||
359 | for (sleep_total = 0; | 375 | for (sleep_total = 0; |
360 | sleep_total < 1000 | 376 | sleep_total < 1000 |
361 | && response->result == htonl(MYRI10GE_NO_RESPONSE_RESULT); | 377 | && response->result == htonl(MYRI10GE_NO_RESPONSE_RESULT); |
362 | sleep_total += 10) | 378 | sleep_total += 10) { |
363 | udelay(10); | 379 | udelay(10); |
380 | mb(); | ||
381 | } | ||
364 | } else { | 382 | } else { |
365 | /* use msleep for most command */ | 383 | /* use msleep for most command */ |
366 | for (sleep_total = 0; | 384 | for (sleep_total = 0; |
@@ -420,6 +438,10 @@ static int myri10ge_read_mac_addr(struct myri10ge_priv *mgp) | |||
420 | ptr += 1; | 438 | ptr += 1; |
421 | } | 439 | } |
422 | } | 440 | } |
441 | if (memcmp(ptr, "PC=", 3) == 0) { | ||
442 | ptr += 3; | ||
443 | mgp->product_code_string = ptr; | ||
444 | } | ||
423 | if (memcmp((const void *)ptr, "SN=", 3) == 0) { | 445 | if (memcmp((const void *)ptr, "SN=", 3) == 0) { |
424 | ptr += 3; | 446 | ptr += 3; |
425 | mgp->serial_number = simple_strtoul(ptr, &ptr, 10); | 447 | mgp->serial_number = simple_strtoul(ptr, &ptr, 10); |
@@ -442,7 +464,7 @@ abort: | |||
442 | static void myri10ge_dummy_rdma(struct myri10ge_priv *mgp, int enable) | 464 | static void myri10ge_dummy_rdma(struct myri10ge_priv *mgp, int enable) |
443 | { | 465 | { |
444 | char __iomem *submit; | 466 | char __iomem *submit; |
445 | __be32 buf[16]; | 467 | __be32 buf[16] __attribute__ ((__aligned__(8))); |
446 | u32 dma_low, dma_high; | 468 | u32 dma_low, dma_high; |
447 | int i; | 469 | int i; |
448 | 470 | ||
@@ -609,13 +631,38 @@ static int myri10ge_adopt_running_firmware(struct myri10ge_priv *mgp) | |||
609 | return status; | 631 | return status; |
610 | } | 632 | } |
611 | 633 | ||
634 | int myri10ge_get_firmware_capabilities(struct myri10ge_priv *mgp) | ||
635 | { | ||
636 | struct myri10ge_cmd cmd; | ||
637 | int status; | ||
638 | |||
639 | /* probe for IPv6 TSO support */ | ||
640 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
641 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
642 | &cmd, 0); | ||
643 | if (status == 0) { | ||
644 | mgp->max_tso6 = cmd.data0; | ||
645 | mgp->features |= NETIF_F_TSO6; | ||
646 | } | ||
647 | |||
648 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | ||
649 | if (status != 0) { | ||
650 | dev_err(&mgp->pdev->dev, | ||
651 | "failed MXGEFW_CMD_GET_RX_RING_SIZE\n"); | ||
652 | return -ENXIO; | ||
653 | } | ||
654 | |||
655 | mgp->max_intr_slots = 2 * (cmd.data0 / sizeof(struct mcp_dma_addr)); | ||
656 | |||
657 | return 0; | ||
658 | } | ||
659 | |||
612 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | 660 | static int myri10ge_load_firmware(struct myri10ge_priv *mgp) |
613 | { | 661 | { |
614 | char __iomem *submit; | 662 | char __iomem *submit; |
615 | __be32 buf[16]; | 663 | __be32 buf[16] __attribute__ ((__aligned__(8))); |
616 | u32 dma_low, dma_high, size; | 664 | u32 dma_low, dma_high, size; |
617 | int status, i; | 665 | int status, i; |
618 | struct myri10ge_cmd cmd; | ||
619 | 666 | ||
620 | size = 0; | 667 | size = 0; |
621 | status = myri10ge_load_hotplug_firmware(mgp, &size); | 668 | status = myri10ge_load_hotplug_firmware(mgp, &size); |
@@ -635,7 +682,7 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
635 | } | 682 | } |
636 | dev_info(&mgp->pdev->dev, | 683 | dev_info(&mgp->pdev->dev, |
637 | "Successfully adopted running firmware\n"); | 684 | "Successfully adopted running firmware\n"); |
638 | if (mgp->tx.boundary == 4096) { | 685 | if (mgp->tx_boundary == 4096) { |
639 | dev_warn(&mgp->pdev->dev, | 686 | dev_warn(&mgp->pdev->dev, |
640 | "Using firmware currently running on NIC" | 687 | "Using firmware currently running on NIC" |
641 | ". For optimal\n"); | 688 | ". For optimal\n"); |
@@ -646,7 +693,9 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
646 | } | 693 | } |
647 | 694 | ||
648 | mgp->fw_name = "adopted"; | 695 | mgp->fw_name = "adopted"; |
649 | mgp->tx.boundary = 2048; | 696 | mgp->tx_boundary = 2048; |
697 | myri10ge_dummy_rdma(mgp, 1); | ||
698 | status = myri10ge_get_firmware_capabilities(mgp); | ||
650 | return status; | 699 | return status; |
651 | } | 700 | } |
652 | 701 | ||
@@ -681,26 +730,18 @@ static int myri10ge_load_firmware(struct myri10ge_priv *mgp) | |||
681 | msleep(1); | 730 | msleep(1); |
682 | mb(); | 731 | mb(); |
683 | i = 0; | 732 | i = 0; |
684 | while (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 20) { | 733 | while (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA && i < 9) { |
685 | msleep(1); | 734 | msleep(1 << i); |
686 | i++; | 735 | i++; |
687 | } | 736 | } |
688 | if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) { | 737 | if (mgp->cmd->data != MYRI10GE_NO_CONFIRM_DATA) { |
689 | dev_err(&mgp->pdev->dev, "handoff failed\n"); | 738 | dev_err(&mgp->pdev->dev, "handoff failed\n"); |
690 | return -ENXIO; | 739 | return -ENXIO; |
691 | } | 740 | } |
692 | dev_info(&mgp->pdev->dev, "handoff confirmed\n"); | ||
693 | myri10ge_dummy_rdma(mgp, 1); | 741 | myri10ge_dummy_rdma(mgp, 1); |
742 | status = myri10ge_get_firmware_capabilities(mgp); | ||
694 | 743 | ||
695 | /* probe for IPv6 TSO support */ | 744 | return status; |
696 | mgp->features = NETIF_F_SG | NETIF_F_HW_CSUM | NETIF_F_TSO; | ||
697 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | ||
698 | &cmd, 0); | ||
699 | if (status == 0) { | ||
700 | mgp->max_tso6 = cmd.data0; | ||
701 | mgp->features |= NETIF_F_TSO6; | ||
702 | } | ||
703 | return 0; | ||
704 | } | 745 | } |
705 | 746 | ||
706 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) | 747 | static int myri10ge_update_mac_address(struct myri10ge_priv *mgp, u8 * addr) |
@@ -772,7 +813,7 @@ static int myri10ge_dma_test(struct myri10ge_priv *mgp, int test_type) | |||
772 | * transfers took to complete. | 813 | * transfers took to complete. |
773 | */ | 814 | */ |
774 | 815 | ||
775 | len = mgp->tx.boundary; | 816 | len = mgp->tx_boundary; |
776 | 817 | ||
777 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); | 818 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(dmatest_bus); |
778 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); | 819 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(dmatest_bus); |
@@ -834,17 +875,17 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
834 | 875 | ||
835 | /* Now exchange information about interrupts */ | 876 | /* Now exchange information about interrupts */ |
836 | 877 | ||
837 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 878 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
838 | memset(mgp->rx_done.entry, 0, bytes); | 879 | memset(mgp->ss.rx_done.entry, 0, bytes); |
839 | cmd.data0 = (u32) bytes; | 880 | cmd.data0 = (u32) bytes; |
840 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); | 881 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd, 0); |
841 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->rx_done.bus); | 882 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->ss.rx_done.bus); |
842 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->rx_done.bus); | 883 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->ss.rx_done.bus); |
843 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_DMA, &cmd, 0); | 884 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_INTRQ_DMA, &cmd, 0); |
844 | 885 | ||
845 | status |= | 886 | status |= |
846 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); | 887 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd, 0); |
847 | mgp->irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); | 888 | mgp->ss.irq_claim = (__iomem __be32 *) (mgp->sram + cmd.data0); |
848 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, | 889 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, |
849 | &cmd, 0); | 890 | &cmd, 0); |
850 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); | 891 | mgp->irq_deassert = (__iomem __be32 *) (mgp->sram + cmd.data0); |
@@ -858,17 +899,17 @@ static int myri10ge_reset(struct myri10ge_priv *mgp) | |||
858 | } | 899 | } |
859 | put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); | 900 | put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr); |
860 | 901 | ||
861 | memset(mgp->rx_done.entry, 0, bytes); | 902 | memset(mgp->ss.rx_done.entry, 0, bytes); |
862 | 903 | ||
863 | /* reset mcp/driver shared state back to 0 */ | 904 | /* reset mcp/driver shared state back to 0 */ |
864 | mgp->tx.req = 0; | 905 | mgp->ss.tx.req = 0; |
865 | mgp->tx.done = 0; | 906 | mgp->ss.tx.done = 0; |
866 | mgp->tx.pkt_start = 0; | 907 | mgp->ss.tx.pkt_start = 0; |
867 | mgp->tx.pkt_done = 0; | 908 | mgp->ss.tx.pkt_done = 0; |
868 | mgp->rx_big.cnt = 0; | 909 | mgp->ss.rx_big.cnt = 0; |
869 | mgp->rx_small.cnt = 0; | 910 | mgp->ss.rx_small.cnt = 0; |
870 | mgp->rx_done.idx = 0; | 911 | mgp->ss.rx_done.idx = 0; |
871 | mgp->rx_done.cnt = 0; | 912 | mgp->ss.rx_done.cnt = 0; |
872 | mgp->link_changes = 0; | 913 | mgp->link_changes = 0; |
873 | status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr); | 914 | status = myri10ge_update_mac_address(mgp, mgp->dev->dev_addr); |
874 | myri10ge_change_pause(mgp, mgp->pause); | 915 | myri10ge_change_pause(mgp, mgp->pause); |
@@ -1020,9 +1061,10 @@ myri10ge_unmap_rx_page(struct pci_dev *pdev, | |||
1020 | * page into an skb */ | 1061 | * page into an skb */ |
1021 | 1062 | ||
1022 | static inline int | 1063 | static inline int |
1023 | myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | 1064 | myri10ge_rx_done(struct myri10ge_slice_state *ss, struct myri10ge_rx_buf *rx, |
1024 | int bytes, int len, __wsum csum) | 1065 | int bytes, int len, __wsum csum) |
1025 | { | 1066 | { |
1067 | struct myri10ge_priv *mgp = ss->mgp; | ||
1026 | struct sk_buff *skb; | 1068 | struct sk_buff *skb; |
1027 | struct skb_frag_struct rx_frags[MYRI10GE_MAX_FRAGS_PER_FRAME]; | 1069 | struct skb_frag_struct rx_frags[MYRI10GE_MAX_FRAGS_PER_FRAME]; |
1028 | int i, idx, hlen, remainder; | 1070 | int i, idx, hlen, remainder; |
@@ -1052,11 +1094,10 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | |||
1052 | rx_frags[0].page_offset += MXGEFW_PAD; | 1094 | rx_frags[0].page_offset += MXGEFW_PAD; |
1053 | rx_frags[0].size -= MXGEFW_PAD; | 1095 | rx_frags[0].size -= MXGEFW_PAD; |
1054 | len -= MXGEFW_PAD; | 1096 | len -= MXGEFW_PAD; |
1055 | lro_receive_frags(&mgp->rx_done.lro_mgr, rx_frags, | 1097 | lro_receive_frags(&ss->rx_done.lro_mgr, rx_frags, |
1056 | len, len, | 1098 | len, len, |
1057 | /* opaque, will come back in get_frag_header */ | 1099 | /* opaque, will come back in get_frag_header */ |
1058 | (void *)(__force unsigned long)csum, | 1100 | (void *)(__force unsigned long)csum, csum); |
1059 | csum); | ||
1060 | return 1; | 1101 | return 1; |
1061 | } | 1102 | } |
1062 | 1103 | ||
@@ -1096,10 +1137,11 @@ myri10ge_rx_done(struct myri10ge_priv *mgp, struct myri10ge_rx_buf *rx, | |||
1096 | return 1; | 1137 | return 1; |
1097 | } | 1138 | } |
1098 | 1139 | ||
1099 | static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | 1140 | static inline void |
1141 | myri10ge_tx_done(struct myri10ge_slice_state *ss, int mcp_index) | ||
1100 | { | 1142 | { |
1101 | struct pci_dev *pdev = mgp->pdev; | 1143 | struct pci_dev *pdev = ss->mgp->pdev; |
1102 | struct myri10ge_tx_buf *tx = &mgp->tx; | 1144 | struct myri10ge_tx_buf *tx = &ss->tx; |
1103 | struct sk_buff *skb; | 1145 | struct sk_buff *skb; |
1104 | int idx, len; | 1146 | int idx, len; |
1105 | 1147 | ||
@@ -1117,8 +1159,8 @@ static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | |||
1117 | len = pci_unmap_len(&tx->info[idx], len); | 1159 | len = pci_unmap_len(&tx->info[idx], len); |
1118 | pci_unmap_len_set(&tx->info[idx], len, 0); | 1160 | pci_unmap_len_set(&tx->info[idx], len, 0); |
1119 | if (skb) { | 1161 | if (skb) { |
1120 | mgp->stats.tx_bytes += skb->len; | 1162 | ss->stats.tx_bytes += skb->len; |
1121 | mgp->stats.tx_packets++; | 1163 | ss->stats.tx_packets++; |
1122 | dev_kfree_skb_irq(skb); | 1164 | dev_kfree_skb_irq(skb); |
1123 | if (len) | 1165 | if (len) |
1124 | pci_unmap_single(pdev, | 1166 | pci_unmap_single(pdev, |
@@ -1134,16 +1176,18 @@ static inline void myri10ge_tx_done(struct myri10ge_priv *mgp, int mcp_index) | |||
1134 | } | 1176 | } |
1135 | } | 1177 | } |
1136 | /* start the queue if we've stopped it */ | 1178 | /* start the queue if we've stopped it */ |
1137 | if (netif_queue_stopped(mgp->dev) | 1179 | if (netif_queue_stopped(ss->dev) |
1138 | && tx->req - tx->done < (tx->mask >> 1)) { | 1180 | && tx->req - tx->done < (tx->mask >> 1)) { |
1139 | mgp->wake_queue++; | 1181 | tx->wake_queue++; |
1140 | netif_wake_queue(mgp->dev); | 1182 | netif_wake_queue(ss->dev); |
1141 | } | 1183 | } |
1142 | } | 1184 | } |
1143 | 1185 | ||
1144 | static inline int myri10ge_clean_rx_done(struct myri10ge_priv *mgp, int budget) | 1186 | static inline int |
1187 | myri10ge_clean_rx_done(struct myri10ge_slice_state *ss, int budget) | ||
1145 | { | 1188 | { |
1146 | struct myri10ge_rx_done *rx_done = &mgp->rx_done; | 1189 | struct myri10ge_rx_done *rx_done = &ss->rx_done; |
1190 | struct myri10ge_priv *mgp = ss->mgp; | ||
1147 | unsigned long rx_bytes = 0; | 1191 | unsigned long rx_bytes = 0; |
1148 | unsigned long rx_packets = 0; | 1192 | unsigned long rx_packets = 0; |
1149 | unsigned long rx_ok; | 1193 | unsigned long rx_ok; |
@@ -1159,40 +1203,40 @@ static inline int myri10ge_clean_rx_done(struct myri10ge_priv *mgp, int budget) | |||
1159 | rx_done->entry[idx].length = 0; | 1203 | rx_done->entry[idx].length = 0; |
1160 | checksum = csum_unfold(rx_done->entry[idx].checksum); | 1204 | checksum = csum_unfold(rx_done->entry[idx].checksum); |
1161 | if (length <= mgp->small_bytes) | 1205 | if (length <= mgp->small_bytes) |
1162 | rx_ok = myri10ge_rx_done(mgp, &mgp->rx_small, | 1206 | rx_ok = myri10ge_rx_done(ss, &ss->rx_small, |
1163 | mgp->small_bytes, | 1207 | mgp->small_bytes, |
1164 | length, checksum); | 1208 | length, checksum); |
1165 | else | 1209 | else |
1166 | rx_ok = myri10ge_rx_done(mgp, &mgp->rx_big, | 1210 | rx_ok = myri10ge_rx_done(ss, &ss->rx_big, |
1167 | mgp->big_bytes, | 1211 | mgp->big_bytes, |
1168 | length, checksum); | 1212 | length, checksum); |
1169 | rx_packets += rx_ok; | 1213 | rx_packets += rx_ok; |
1170 | rx_bytes += rx_ok * (unsigned long)length; | 1214 | rx_bytes += rx_ok * (unsigned long)length; |
1171 | cnt++; | 1215 | cnt++; |
1172 | idx = cnt & (myri10ge_max_intr_slots - 1); | 1216 | idx = cnt & (mgp->max_intr_slots - 1); |
1173 | work_done++; | 1217 | work_done++; |
1174 | } | 1218 | } |
1175 | rx_done->idx = idx; | 1219 | rx_done->idx = idx; |
1176 | rx_done->cnt = cnt; | 1220 | rx_done->cnt = cnt; |
1177 | mgp->stats.rx_packets += rx_packets; | 1221 | ss->stats.rx_packets += rx_packets; |
1178 | mgp->stats.rx_bytes += rx_bytes; | 1222 | ss->stats.rx_bytes += rx_bytes; |
1179 | 1223 | ||
1180 | if (myri10ge_lro) | 1224 | if (myri10ge_lro) |
1181 | lro_flush_all(&rx_done->lro_mgr); | 1225 | lro_flush_all(&rx_done->lro_mgr); |
1182 | 1226 | ||
1183 | /* restock receive rings if needed */ | 1227 | /* restock receive rings if needed */ |
1184 | if (mgp->rx_small.fill_cnt - mgp->rx_small.cnt < myri10ge_fill_thresh) | 1228 | if (ss->rx_small.fill_cnt - ss->rx_small.cnt < myri10ge_fill_thresh) |
1185 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 1229 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, |
1186 | mgp->small_bytes + MXGEFW_PAD, 0); | 1230 | mgp->small_bytes + MXGEFW_PAD, 0); |
1187 | if (mgp->rx_big.fill_cnt - mgp->rx_big.cnt < myri10ge_fill_thresh) | 1231 | if (ss->rx_big.fill_cnt - ss->rx_big.cnt < myri10ge_fill_thresh) |
1188 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 0); | 1232 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); |
1189 | 1233 | ||
1190 | return work_done; | 1234 | return work_done; |
1191 | } | 1235 | } |
1192 | 1236 | ||
1193 | static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | 1237 | static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) |
1194 | { | 1238 | { |
1195 | struct mcp_irq_data *stats = mgp->fw_stats; | 1239 | struct mcp_irq_data *stats = mgp->ss.fw_stats; |
1196 | 1240 | ||
1197 | if (unlikely(stats->stats_updated)) { | 1241 | if (unlikely(stats->stats_updated)) { |
1198 | unsigned link_up = ntohl(stats->link_up); | 1242 | unsigned link_up = ntohl(stats->link_up); |
@@ -1219,9 +1263,9 @@ static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | |||
1219 | } | 1263 | } |
1220 | } | 1264 | } |
1221 | if (mgp->rdma_tags_available != | 1265 | if (mgp->rdma_tags_available != |
1222 | ntohl(mgp->fw_stats->rdma_tags_available)) { | 1266 | ntohl(stats->rdma_tags_available)) { |
1223 | mgp->rdma_tags_available = | 1267 | mgp->rdma_tags_available = |
1224 | ntohl(mgp->fw_stats->rdma_tags_available); | 1268 | ntohl(stats->rdma_tags_available); |
1225 | printk(KERN_WARNING "myri10ge: %s: RDMA timed out! " | 1269 | printk(KERN_WARNING "myri10ge: %s: RDMA timed out! " |
1226 | "%d tags left\n", mgp->dev->name, | 1270 | "%d tags left\n", mgp->dev->name, |
1227 | mgp->rdma_tags_available); | 1271 | mgp->rdma_tags_available); |
@@ -1234,26 +1278,27 @@ static inline void myri10ge_check_statblock(struct myri10ge_priv *mgp) | |||
1234 | 1278 | ||
1235 | static int myri10ge_poll(struct napi_struct *napi, int budget) | 1279 | static int myri10ge_poll(struct napi_struct *napi, int budget) |
1236 | { | 1280 | { |
1237 | struct myri10ge_priv *mgp = | 1281 | struct myri10ge_slice_state *ss = |
1238 | container_of(napi, struct myri10ge_priv, napi); | 1282 | container_of(napi, struct myri10ge_slice_state, napi); |
1239 | struct net_device *netdev = mgp->dev; | 1283 | struct net_device *netdev = ss->mgp->dev; |
1240 | int work_done; | 1284 | int work_done; |
1241 | 1285 | ||
1242 | /* process as many rx events as NAPI will allow */ | 1286 | /* process as many rx events as NAPI will allow */ |
1243 | work_done = myri10ge_clean_rx_done(mgp, budget); | 1287 | work_done = myri10ge_clean_rx_done(ss, budget); |
1244 | 1288 | ||
1245 | if (work_done < budget) { | 1289 | if (work_done < budget) { |
1246 | netif_rx_complete(netdev, napi); | 1290 | netif_rx_complete(netdev, napi); |
1247 | put_be32(htonl(3), mgp->irq_claim); | 1291 | put_be32(htonl(3), ss->irq_claim); |
1248 | } | 1292 | } |
1249 | return work_done; | 1293 | return work_done; |
1250 | } | 1294 | } |
1251 | 1295 | ||
1252 | static irqreturn_t myri10ge_intr(int irq, void *arg) | 1296 | static irqreturn_t myri10ge_intr(int irq, void *arg) |
1253 | { | 1297 | { |
1254 | struct myri10ge_priv *mgp = arg; | 1298 | struct myri10ge_slice_state *ss = arg; |
1255 | struct mcp_irq_data *stats = mgp->fw_stats; | 1299 | struct myri10ge_priv *mgp = ss->mgp; |
1256 | struct myri10ge_tx_buf *tx = &mgp->tx; | 1300 | struct mcp_irq_data *stats = ss->fw_stats; |
1301 | struct myri10ge_tx_buf *tx = &ss->tx; | ||
1257 | u32 send_done_count; | 1302 | u32 send_done_count; |
1258 | int i; | 1303 | int i; |
1259 | 1304 | ||
@@ -1264,7 +1309,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1264 | /* low bit indicates receives are present, so schedule | 1309 | /* low bit indicates receives are present, so schedule |
1265 | * napi poll handler */ | 1310 | * napi poll handler */ |
1266 | if (stats->valid & 1) | 1311 | if (stats->valid & 1) |
1267 | netif_rx_schedule(mgp->dev, &mgp->napi); | 1312 | netif_rx_schedule(ss->dev, &ss->napi); |
1268 | 1313 | ||
1269 | if (!mgp->msi_enabled) { | 1314 | if (!mgp->msi_enabled) { |
1270 | put_be32(0, mgp->irq_deassert); | 1315 | put_be32(0, mgp->irq_deassert); |
@@ -1281,7 +1326,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1281 | /* check for transmit completes and receives */ | 1326 | /* check for transmit completes and receives */ |
1282 | send_done_count = ntohl(stats->send_done_count); | 1327 | send_done_count = ntohl(stats->send_done_count); |
1283 | if (send_done_count != tx->pkt_done) | 1328 | if (send_done_count != tx->pkt_done) |
1284 | myri10ge_tx_done(mgp, (int)send_done_count); | 1329 | myri10ge_tx_done(ss, (int)send_done_count); |
1285 | if (unlikely(i > myri10ge_max_irq_loops)) { | 1330 | if (unlikely(i > myri10ge_max_irq_loops)) { |
1286 | printk(KERN_WARNING "myri10ge: %s: irq stuck?\n", | 1331 | printk(KERN_WARNING "myri10ge: %s: irq stuck?\n", |
1287 | mgp->dev->name); | 1332 | mgp->dev->name); |
@@ -1296,16 +1341,46 @@ static irqreturn_t myri10ge_intr(int irq, void *arg) | |||
1296 | 1341 | ||
1297 | myri10ge_check_statblock(mgp); | 1342 | myri10ge_check_statblock(mgp); |
1298 | 1343 | ||
1299 | put_be32(htonl(3), mgp->irq_claim + 1); | 1344 | put_be32(htonl(3), ss->irq_claim + 1); |
1300 | return (IRQ_HANDLED); | 1345 | return (IRQ_HANDLED); |
1301 | } | 1346 | } |
1302 | 1347 | ||
1303 | static int | 1348 | static int |
1304 | myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) | 1349 | myri10ge_get_settings(struct net_device *netdev, struct ethtool_cmd *cmd) |
1305 | { | 1350 | { |
1351 | struct myri10ge_priv *mgp = netdev_priv(netdev); | ||
1352 | char *ptr; | ||
1353 | int i; | ||
1354 | |||
1306 | cmd->autoneg = AUTONEG_DISABLE; | 1355 | cmd->autoneg = AUTONEG_DISABLE; |
1307 | cmd->speed = SPEED_10000; | 1356 | cmd->speed = SPEED_10000; |
1308 | cmd->duplex = DUPLEX_FULL; | 1357 | cmd->duplex = DUPLEX_FULL; |
1358 | |||
1359 | /* | ||
1360 | * parse the product code to deterimine the interface type | ||
1361 | * (CX4, XFP, Quad Ribbon Fiber) by looking at the character | ||
1362 | * after the 3rd dash in the driver's cached copy of the | ||
1363 | * EEPROM's product code string. | ||
1364 | */ | ||
1365 | ptr = mgp->product_code_string; | ||
1366 | if (ptr == NULL) { | ||
1367 | printk(KERN_ERR "myri10ge: %s: Missing product code\n", | ||
1368 | netdev->name); | ||
1369 | return 0; | ||
1370 | } | ||
1371 | for (i = 0; i < 3; i++, ptr++) { | ||
1372 | ptr = strchr(ptr, '-'); | ||
1373 | if (ptr == NULL) { | ||
1374 | printk(KERN_ERR "myri10ge: %s: Invalid product " | ||
1375 | "code %s\n", netdev->name, | ||
1376 | mgp->product_code_string); | ||
1377 | return 0; | ||
1378 | } | ||
1379 | } | ||
1380 | if (*ptr == 'R' || *ptr == 'Q') { | ||
1381 | /* We've found either an XFP or quad ribbon fiber */ | ||
1382 | cmd->port = PORT_FIBRE; | ||
1383 | } | ||
1309 | return 0; | 1384 | return 0; |
1310 | } | 1385 | } |
1311 | 1386 | ||
@@ -1324,6 +1399,7 @@ static int | |||
1324 | myri10ge_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal) | 1399 | myri10ge_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal) |
1325 | { | 1400 | { |
1326 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1401 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1402 | |||
1327 | coal->rx_coalesce_usecs = mgp->intr_coal_delay; | 1403 | coal->rx_coalesce_usecs = mgp->intr_coal_delay; |
1328 | return 0; | 1404 | return 0; |
1329 | } | 1405 | } |
@@ -1370,10 +1446,10 @@ myri10ge_get_ringparam(struct net_device *netdev, | |||
1370 | { | 1446 | { |
1371 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1447 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1372 | 1448 | ||
1373 | ring->rx_mini_max_pending = mgp->rx_small.mask + 1; | 1449 | ring->rx_mini_max_pending = mgp->ss.rx_small.mask + 1; |
1374 | ring->rx_max_pending = mgp->rx_big.mask + 1; | 1450 | ring->rx_max_pending = mgp->ss.rx_big.mask + 1; |
1375 | ring->rx_jumbo_max_pending = 0; | 1451 | ring->rx_jumbo_max_pending = 0; |
1376 | ring->tx_max_pending = mgp->rx_small.mask + 1; | 1452 | ring->tx_max_pending = mgp->ss.rx_small.mask + 1; |
1377 | ring->rx_mini_pending = ring->rx_mini_max_pending; | 1453 | ring->rx_mini_pending = ring->rx_mini_max_pending; |
1378 | ring->rx_pending = ring->rx_max_pending; | 1454 | ring->rx_pending = ring->rx_max_pending; |
1379 | ring->rx_jumbo_pending = ring->rx_jumbo_max_pending; | 1455 | ring->rx_jumbo_pending = ring->rx_jumbo_max_pending; |
@@ -1383,6 +1459,7 @@ myri10ge_get_ringparam(struct net_device *netdev, | |||
1383 | static u32 myri10ge_get_rx_csum(struct net_device *netdev) | 1459 | static u32 myri10ge_get_rx_csum(struct net_device *netdev) |
1384 | { | 1460 | { |
1385 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1461 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1462 | |||
1386 | if (mgp->csum_flag) | 1463 | if (mgp->csum_flag) |
1387 | return 1; | 1464 | return 1; |
1388 | else | 1465 | else |
@@ -1392,6 +1469,7 @@ static u32 myri10ge_get_rx_csum(struct net_device *netdev) | |||
1392 | static int myri10ge_set_rx_csum(struct net_device *netdev, u32 csum_enabled) | 1469 | static int myri10ge_set_rx_csum(struct net_device *netdev, u32 csum_enabled) |
1393 | { | 1470 | { |
1394 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1471 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1472 | |||
1395 | if (csum_enabled) | 1473 | if (csum_enabled) |
1396 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; | 1474 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; |
1397 | else | 1475 | else |
@@ -1411,7 +1489,7 @@ static int myri10ge_set_tso(struct net_device *netdev, u32 tso_enabled) | |||
1411 | return 0; | 1489 | return 0; |
1412 | } | 1490 | } |
1413 | 1491 | ||
1414 | static const char myri10ge_gstrings_stats[][ETH_GSTRING_LEN] = { | 1492 | static const char myri10ge_gstrings_main_stats[][ETH_GSTRING_LEN] = { |
1415 | "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", | 1493 | "rx_packets", "tx_packets", "rx_bytes", "tx_bytes", "rx_errors", |
1416 | "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", | 1494 | "tx_errors", "rx_dropped", "tx_dropped", "multicast", "collisions", |
1417 | "rx_length_errors", "rx_over_errors", "rx_crc_errors", | 1495 | "rx_length_errors", "rx_over_errors", "rx_crc_errors", |
@@ -1421,28 +1499,39 @@ static const char myri10ge_gstrings_stats[][ETH_GSTRING_LEN] = { | |||
1421 | /* device-specific stats */ | 1499 | /* device-specific stats */ |
1422 | "tx_boundary", "WC", "irq", "MSI", | 1500 | "tx_boundary", "WC", "irq", "MSI", |
1423 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", | 1501 | "read_dma_bw_MBs", "write_dma_bw_MBs", "read_write_dma_bw_MBs", |
1424 | "serial_number", "tx_pkt_start", "tx_pkt_done", | 1502 | "serial_number", "watchdog_resets", |
1425 | "tx_req", "tx_done", "rx_small_cnt", "rx_big_cnt", | ||
1426 | "wake_queue", "stop_queue", "watchdog_resets", "tx_linearized", | ||
1427 | "link_changes", "link_up", "dropped_link_overflow", | 1503 | "link_changes", "link_up", "dropped_link_overflow", |
1428 | "dropped_link_error_or_filtered", | 1504 | "dropped_link_error_or_filtered", |
1429 | "dropped_pause", "dropped_bad_phy", "dropped_bad_crc32", | 1505 | "dropped_pause", "dropped_bad_phy", "dropped_bad_crc32", |
1430 | "dropped_unicast_filtered", "dropped_multicast_filtered", | 1506 | "dropped_unicast_filtered", "dropped_multicast_filtered", |
1431 | "dropped_runt", "dropped_overrun", "dropped_no_small_buffer", | 1507 | "dropped_runt", "dropped_overrun", "dropped_no_small_buffer", |
1432 | "dropped_no_big_buffer", "LRO aggregated", "LRO flushed", | 1508 | "dropped_no_big_buffer" |
1509 | }; | ||
1510 | |||
1511 | static const char myri10ge_gstrings_slice_stats[][ETH_GSTRING_LEN] = { | ||
1512 | "----------- slice ---------", | ||
1513 | "tx_pkt_start", "tx_pkt_done", "tx_req", "tx_done", | ||
1514 | "rx_small_cnt", "rx_big_cnt", | ||
1515 | "wake_queue", "stop_queue", "tx_linearized", "LRO aggregated", | ||
1516 | "LRO flushed", | ||
1433 | "LRO avg aggr", "LRO no_desc" | 1517 | "LRO avg aggr", "LRO no_desc" |
1434 | }; | 1518 | }; |
1435 | 1519 | ||
1436 | #define MYRI10GE_NET_STATS_LEN 21 | 1520 | #define MYRI10GE_NET_STATS_LEN 21 |
1437 | #define MYRI10GE_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_stats) | 1521 | #define MYRI10GE_MAIN_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_main_stats) |
1522 | #define MYRI10GE_SLICE_STATS_LEN ARRAY_SIZE(myri10ge_gstrings_slice_stats) | ||
1438 | 1523 | ||
1439 | static void | 1524 | static void |
1440 | myri10ge_get_strings(struct net_device *netdev, u32 stringset, u8 * data) | 1525 | myri10ge_get_strings(struct net_device *netdev, u32 stringset, u8 * data) |
1441 | { | 1526 | { |
1442 | switch (stringset) { | 1527 | switch (stringset) { |
1443 | case ETH_SS_STATS: | 1528 | case ETH_SS_STATS: |
1444 | memcpy(data, *myri10ge_gstrings_stats, | 1529 | memcpy(data, *myri10ge_gstrings_main_stats, |
1445 | sizeof(myri10ge_gstrings_stats)); | 1530 | sizeof(myri10ge_gstrings_main_stats)); |
1531 | data += sizeof(myri10ge_gstrings_main_stats); | ||
1532 | memcpy(data, *myri10ge_gstrings_slice_stats, | ||
1533 | sizeof(myri10ge_gstrings_slice_stats)); | ||
1534 | data += sizeof(myri10ge_gstrings_slice_stats); | ||
1446 | break; | 1535 | break; |
1447 | } | 1536 | } |
1448 | } | 1537 | } |
@@ -1451,7 +1540,7 @@ static int myri10ge_get_sset_count(struct net_device *netdev, int sset) | |||
1451 | { | 1540 | { |
1452 | switch (sset) { | 1541 | switch (sset) { |
1453 | case ETH_SS_STATS: | 1542 | case ETH_SS_STATS: |
1454 | return MYRI10GE_STATS_LEN; | 1543 | return MYRI10GE_MAIN_STATS_LEN + MYRI10GE_SLICE_STATS_LEN; |
1455 | default: | 1544 | default: |
1456 | return -EOPNOTSUPP; | 1545 | return -EOPNOTSUPP; |
1457 | } | 1546 | } |
@@ -1462,12 +1551,13 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
1462 | struct ethtool_stats *stats, u64 * data) | 1551 | struct ethtool_stats *stats, u64 * data) |
1463 | { | 1552 | { |
1464 | struct myri10ge_priv *mgp = netdev_priv(netdev); | 1553 | struct myri10ge_priv *mgp = netdev_priv(netdev); |
1554 | struct myri10ge_slice_state *ss; | ||
1465 | int i; | 1555 | int i; |
1466 | 1556 | ||
1467 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) | 1557 | for (i = 0; i < MYRI10GE_NET_STATS_LEN; i++) |
1468 | data[i] = ((unsigned long *)&mgp->stats)[i]; | 1558 | data[i] = ((unsigned long *)&mgp->stats)[i]; |
1469 | 1559 | ||
1470 | data[i++] = (unsigned int)mgp->tx.boundary; | 1560 | data[i++] = (unsigned int)mgp->tx_boundary; |
1471 | data[i++] = (unsigned int)mgp->wc_enabled; | 1561 | data[i++] = (unsigned int)mgp->wc_enabled; |
1472 | data[i++] = (unsigned int)mgp->pdev->irq; | 1562 | data[i++] = (unsigned int)mgp->pdev->irq; |
1473 | data[i++] = (unsigned int)mgp->msi_enabled; | 1563 | data[i++] = (unsigned int)mgp->msi_enabled; |
@@ -1475,40 +1565,44 @@ myri10ge_get_ethtool_stats(struct net_device *netdev, | |||
1475 | data[i++] = (unsigned int)mgp->write_dma; | 1565 | data[i++] = (unsigned int)mgp->write_dma; |
1476 | data[i++] = (unsigned int)mgp->read_write_dma; | 1566 | data[i++] = (unsigned int)mgp->read_write_dma; |
1477 | data[i++] = (unsigned int)mgp->serial_number; | 1567 | data[i++] = (unsigned int)mgp->serial_number; |
1478 | data[i++] = (unsigned int)mgp->tx.pkt_start; | ||
1479 | data[i++] = (unsigned int)mgp->tx.pkt_done; | ||
1480 | data[i++] = (unsigned int)mgp->tx.req; | ||
1481 | data[i++] = (unsigned int)mgp->tx.done; | ||
1482 | data[i++] = (unsigned int)mgp->rx_small.cnt; | ||
1483 | data[i++] = (unsigned int)mgp->rx_big.cnt; | ||
1484 | data[i++] = (unsigned int)mgp->wake_queue; | ||
1485 | data[i++] = (unsigned int)mgp->stop_queue; | ||
1486 | data[i++] = (unsigned int)mgp->watchdog_resets; | 1568 | data[i++] = (unsigned int)mgp->watchdog_resets; |
1487 | data[i++] = (unsigned int)mgp->tx_linearized; | ||
1488 | data[i++] = (unsigned int)mgp->link_changes; | 1569 | data[i++] = (unsigned int)mgp->link_changes; |
1489 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->link_up); | 1570 | |
1490 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_link_overflow); | 1571 | /* firmware stats are useful only in the first slice */ |
1491 | data[i++] = | 1572 | ss = &mgp->ss; |
1492 | (unsigned int)ntohl(mgp->fw_stats->dropped_link_error_or_filtered); | 1573 | data[i++] = (unsigned int)ntohl(ss->fw_stats->link_up); |
1493 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_pause); | 1574 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_link_overflow); |
1494 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_phy); | ||
1495 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_bad_crc32); | ||
1496 | data[i++] = | 1575 | data[i++] = |
1497 | (unsigned int)ntohl(mgp->fw_stats->dropped_unicast_filtered); | 1576 | (unsigned int)ntohl(ss->fw_stats->dropped_link_error_or_filtered); |
1577 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_pause); | ||
1578 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_bad_phy); | ||
1579 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_bad_crc32); | ||
1580 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_unicast_filtered); | ||
1498 | data[i++] = | 1581 | data[i++] = |
1499 | (unsigned int)ntohl(mgp->fw_stats->dropped_multicast_filtered); | 1582 | (unsigned int)ntohl(ss->fw_stats->dropped_multicast_filtered); |
1500 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_runt); | 1583 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_runt); |
1501 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_overrun); | 1584 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_overrun); |
1502 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_no_small_buffer); | 1585 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_no_small_buffer); |
1503 | data[i++] = (unsigned int)ntohl(mgp->fw_stats->dropped_no_big_buffer); | 1586 | data[i++] = (unsigned int)ntohl(ss->fw_stats->dropped_no_big_buffer); |
1504 | data[i++] = mgp->rx_done.lro_mgr.stats.aggregated; | 1587 | |
1505 | data[i++] = mgp->rx_done.lro_mgr.stats.flushed; | 1588 | data[i++] = 0; |
1506 | if (mgp->rx_done.lro_mgr.stats.flushed) | 1589 | data[i++] = (unsigned int)ss->tx.pkt_start; |
1507 | data[i++] = mgp->rx_done.lro_mgr.stats.aggregated / | 1590 | data[i++] = (unsigned int)ss->tx.pkt_done; |
1508 | mgp->rx_done.lro_mgr.stats.flushed; | 1591 | data[i++] = (unsigned int)ss->tx.req; |
1592 | data[i++] = (unsigned int)ss->tx.done; | ||
1593 | data[i++] = (unsigned int)ss->rx_small.cnt; | ||
1594 | data[i++] = (unsigned int)ss->rx_big.cnt; | ||
1595 | data[i++] = (unsigned int)ss->tx.wake_queue; | ||
1596 | data[i++] = (unsigned int)ss->tx.stop_queue; | ||
1597 | data[i++] = (unsigned int)ss->tx.linearized; | ||
1598 | data[i++] = ss->rx_done.lro_mgr.stats.aggregated; | ||
1599 | data[i++] = ss->rx_done.lro_mgr.stats.flushed; | ||
1600 | if (ss->rx_done.lro_mgr.stats.flushed) | ||
1601 | data[i++] = ss->rx_done.lro_mgr.stats.aggregated / | ||
1602 | ss->rx_done.lro_mgr.stats.flushed; | ||
1509 | else | 1603 | else |
1510 | data[i++] = 0; | 1604 | data[i++] = 0; |
1511 | data[i++] = mgp->rx_done.lro_mgr.stats.no_desc; | 1605 | data[i++] = ss->rx_done.lro_mgr.stats.no_desc; |
1512 | } | 1606 | } |
1513 | 1607 | ||
1514 | static void myri10ge_set_msglevel(struct net_device *netdev, u32 value) | 1608 | static void myri10ge_set_msglevel(struct net_device *netdev, u32 value) |
@@ -1544,19 +1638,17 @@ static const struct ethtool_ops myri10ge_ethtool_ops = { | |||
1544 | .get_msglevel = myri10ge_get_msglevel | 1638 | .get_msglevel = myri10ge_get_msglevel |
1545 | }; | 1639 | }; |
1546 | 1640 | ||
1547 | static int myri10ge_allocate_rings(struct net_device *dev) | 1641 | static int myri10ge_allocate_rings(struct myri10ge_slice_state *ss) |
1548 | { | 1642 | { |
1549 | struct myri10ge_priv *mgp; | 1643 | struct myri10ge_priv *mgp = ss->mgp; |
1550 | struct myri10ge_cmd cmd; | 1644 | struct myri10ge_cmd cmd; |
1645 | struct net_device *dev = mgp->dev; | ||
1551 | int tx_ring_size, rx_ring_size; | 1646 | int tx_ring_size, rx_ring_size; |
1552 | int tx_ring_entries, rx_ring_entries; | 1647 | int tx_ring_entries, rx_ring_entries; |
1553 | int i, status; | 1648 | int i, status; |
1554 | size_t bytes; | 1649 | size_t bytes; |
1555 | 1650 | ||
1556 | mgp = netdev_priv(dev); | ||
1557 | |||
1558 | /* get ring sizes */ | 1651 | /* get ring sizes */ |
1559 | |||
1560 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); | 1652 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd, 0); |
1561 | tx_ring_size = cmd.data0; | 1653 | tx_ring_size = cmd.data0; |
1562 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); | 1654 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd, 0); |
@@ -1566,144 +1658,142 @@ static int myri10ge_allocate_rings(struct net_device *dev) | |||
1566 | 1658 | ||
1567 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); | 1659 | tx_ring_entries = tx_ring_size / sizeof(struct mcp_kreq_ether_send); |
1568 | rx_ring_entries = rx_ring_size / sizeof(struct mcp_dma_addr); | 1660 | rx_ring_entries = rx_ring_size / sizeof(struct mcp_dma_addr); |
1569 | mgp->tx.mask = tx_ring_entries - 1; | 1661 | ss->tx.mask = tx_ring_entries - 1; |
1570 | mgp->rx_small.mask = mgp->rx_big.mask = rx_ring_entries - 1; | 1662 | ss->rx_small.mask = ss->rx_big.mask = rx_ring_entries - 1; |
1571 | 1663 | ||
1572 | status = -ENOMEM; | 1664 | status = -ENOMEM; |
1573 | 1665 | ||
1574 | /* allocate the host shadow rings */ | 1666 | /* allocate the host shadow rings */ |
1575 | 1667 | ||
1576 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) | 1668 | bytes = 8 + (MYRI10GE_MAX_SEND_DESC_TSO + 4) |
1577 | * sizeof(*mgp->tx.req_list); | 1669 | * sizeof(*ss->tx.req_list); |
1578 | mgp->tx.req_bytes = kzalloc(bytes, GFP_KERNEL); | 1670 | ss->tx.req_bytes = kzalloc(bytes, GFP_KERNEL); |
1579 | if (mgp->tx.req_bytes == NULL) | 1671 | if (ss->tx.req_bytes == NULL) |
1580 | goto abort_with_nothing; | 1672 | goto abort_with_nothing; |
1581 | 1673 | ||
1582 | /* ensure req_list entries are aligned to 8 bytes */ | 1674 | /* ensure req_list entries are aligned to 8 bytes */ |
1583 | mgp->tx.req_list = (struct mcp_kreq_ether_send *) | 1675 | ss->tx.req_list = (struct mcp_kreq_ether_send *) |
1584 | ALIGN((unsigned long)mgp->tx.req_bytes, 8); | 1676 | ALIGN((unsigned long)ss->tx.req_bytes, 8); |
1585 | 1677 | ||
1586 | bytes = rx_ring_entries * sizeof(*mgp->rx_small.shadow); | 1678 | bytes = rx_ring_entries * sizeof(*ss->rx_small.shadow); |
1587 | mgp->rx_small.shadow = kzalloc(bytes, GFP_KERNEL); | 1679 | ss->rx_small.shadow = kzalloc(bytes, GFP_KERNEL); |
1588 | if (mgp->rx_small.shadow == NULL) | 1680 | if (ss->rx_small.shadow == NULL) |
1589 | goto abort_with_tx_req_bytes; | 1681 | goto abort_with_tx_req_bytes; |
1590 | 1682 | ||
1591 | bytes = rx_ring_entries * sizeof(*mgp->rx_big.shadow); | 1683 | bytes = rx_ring_entries * sizeof(*ss->rx_big.shadow); |
1592 | mgp->rx_big.shadow = kzalloc(bytes, GFP_KERNEL); | 1684 | ss->rx_big.shadow = kzalloc(bytes, GFP_KERNEL); |
1593 | if (mgp->rx_big.shadow == NULL) | 1685 | if (ss->rx_big.shadow == NULL) |
1594 | goto abort_with_rx_small_shadow; | 1686 | goto abort_with_rx_small_shadow; |
1595 | 1687 | ||
1596 | /* allocate the host info rings */ | 1688 | /* allocate the host info rings */ |
1597 | 1689 | ||
1598 | bytes = tx_ring_entries * sizeof(*mgp->tx.info); | 1690 | bytes = tx_ring_entries * sizeof(*ss->tx.info); |
1599 | mgp->tx.info = kzalloc(bytes, GFP_KERNEL); | 1691 | ss->tx.info = kzalloc(bytes, GFP_KERNEL); |
1600 | if (mgp->tx.info == NULL) | 1692 | if (ss->tx.info == NULL) |
1601 | goto abort_with_rx_big_shadow; | 1693 | goto abort_with_rx_big_shadow; |
1602 | 1694 | ||
1603 | bytes = rx_ring_entries * sizeof(*mgp->rx_small.info); | 1695 | bytes = rx_ring_entries * sizeof(*ss->rx_small.info); |
1604 | mgp->rx_small.info = kzalloc(bytes, GFP_KERNEL); | 1696 | ss->rx_small.info = kzalloc(bytes, GFP_KERNEL); |
1605 | if (mgp->rx_small.info == NULL) | 1697 | if (ss->rx_small.info == NULL) |
1606 | goto abort_with_tx_info; | 1698 | goto abort_with_tx_info; |
1607 | 1699 | ||
1608 | bytes = rx_ring_entries * sizeof(*mgp->rx_big.info); | 1700 | bytes = rx_ring_entries * sizeof(*ss->rx_big.info); |
1609 | mgp->rx_big.info = kzalloc(bytes, GFP_KERNEL); | 1701 | ss->rx_big.info = kzalloc(bytes, GFP_KERNEL); |
1610 | if (mgp->rx_big.info == NULL) | 1702 | if (ss->rx_big.info == NULL) |
1611 | goto abort_with_rx_small_info; | 1703 | goto abort_with_rx_small_info; |
1612 | 1704 | ||
1613 | /* Fill the receive rings */ | 1705 | /* Fill the receive rings */ |
1614 | mgp->rx_big.cnt = 0; | 1706 | ss->rx_big.cnt = 0; |
1615 | mgp->rx_small.cnt = 0; | 1707 | ss->rx_small.cnt = 0; |
1616 | mgp->rx_big.fill_cnt = 0; | 1708 | ss->rx_big.fill_cnt = 0; |
1617 | mgp->rx_small.fill_cnt = 0; | 1709 | ss->rx_small.fill_cnt = 0; |
1618 | mgp->rx_small.page_offset = MYRI10GE_ALLOC_SIZE; | 1710 | ss->rx_small.page_offset = MYRI10GE_ALLOC_SIZE; |
1619 | mgp->rx_big.page_offset = MYRI10GE_ALLOC_SIZE; | 1711 | ss->rx_big.page_offset = MYRI10GE_ALLOC_SIZE; |
1620 | mgp->rx_small.watchdog_needed = 0; | 1712 | ss->rx_small.watchdog_needed = 0; |
1621 | mgp->rx_big.watchdog_needed = 0; | 1713 | ss->rx_big.watchdog_needed = 0; |
1622 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 1714 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, |
1623 | mgp->small_bytes + MXGEFW_PAD, 0); | 1715 | mgp->small_bytes + MXGEFW_PAD, 0); |
1624 | 1716 | ||
1625 | if (mgp->rx_small.fill_cnt < mgp->rx_small.mask + 1) { | 1717 | if (ss->rx_small.fill_cnt < ss->rx_small.mask + 1) { |
1626 | printk(KERN_ERR "myri10ge: %s: alloced only %d small bufs\n", | 1718 | printk(KERN_ERR "myri10ge: %s: alloced only %d small bufs\n", |
1627 | dev->name, mgp->rx_small.fill_cnt); | 1719 | dev->name, ss->rx_small.fill_cnt); |
1628 | goto abort_with_rx_small_ring; | 1720 | goto abort_with_rx_small_ring; |
1629 | } | 1721 | } |
1630 | 1722 | ||
1631 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 0); | 1723 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 0); |
1632 | if (mgp->rx_big.fill_cnt < mgp->rx_big.mask + 1) { | 1724 | if (ss->rx_big.fill_cnt < ss->rx_big.mask + 1) { |
1633 | printk(KERN_ERR "myri10ge: %s: alloced only %d big bufs\n", | 1725 | printk(KERN_ERR "myri10ge: %s: alloced only %d big bufs\n", |
1634 | dev->name, mgp->rx_big.fill_cnt); | 1726 | dev->name, ss->rx_big.fill_cnt); |
1635 | goto abort_with_rx_big_ring; | 1727 | goto abort_with_rx_big_ring; |
1636 | } | 1728 | } |
1637 | 1729 | ||
1638 | return 0; | 1730 | return 0; |
1639 | 1731 | ||
1640 | abort_with_rx_big_ring: | 1732 | abort_with_rx_big_ring: |
1641 | for (i = mgp->rx_big.cnt; i < mgp->rx_big.fill_cnt; i++) { | 1733 | for (i = ss->rx_big.cnt; i < ss->rx_big.fill_cnt; i++) { |
1642 | int idx = i & mgp->rx_big.mask; | 1734 | int idx = i & ss->rx_big.mask; |
1643 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_big.info[idx], | 1735 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], |
1644 | mgp->big_bytes); | 1736 | mgp->big_bytes); |
1645 | put_page(mgp->rx_big.info[idx].page); | 1737 | put_page(ss->rx_big.info[idx].page); |
1646 | } | 1738 | } |
1647 | 1739 | ||
1648 | abort_with_rx_small_ring: | 1740 | abort_with_rx_small_ring: |
1649 | for (i = mgp->rx_small.cnt; i < mgp->rx_small.fill_cnt; i++) { | 1741 | for (i = ss->rx_small.cnt; i < ss->rx_small.fill_cnt; i++) { |
1650 | int idx = i & mgp->rx_small.mask; | 1742 | int idx = i & ss->rx_small.mask; |
1651 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_small.info[idx], | 1743 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], |
1652 | mgp->small_bytes + MXGEFW_PAD); | 1744 | mgp->small_bytes + MXGEFW_PAD); |
1653 | put_page(mgp->rx_small.info[idx].page); | 1745 | put_page(ss->rx_small.info[idx].page); |
1654 | } | 1746 | } |
1655 | 1747 | ||
1656 | kfree(mgp->rx_big.info); | 1748 | kfree(ss->rx_big.info); |
1657 | 1749 | ||
1658 | abort_with_rx_small_info: | 1750 | abort_with_rx_small_info: |
1659 | kfree(mgp->rx_small.info); | 1751 | kfree(ss->rx_small.info); |
1660 | 1752 | ||
1661 | abort_with_tx_info: | 1753 | abort_with_tx_info: |
1662 | kfree(mgp->tx.info); | 1754 | kfree(ss->tx.info); |
1663 | 1755 | ||
1664 | abort_with_rx_big_shadow: | 1756 | abort_with_rx_big_shadow: |
1665 | kfree(mgp->rx_big.shadow); | 1757 | kfree(ss->rx_big.shadow); |
1666 | 1758 | ||
1667 | abort_with_rx_small_shadow: | 1759 | abort_with_rx_small_shadow: |
1668 | kfree(mgp->rx_small.shadow); | 1760 | kfree(ss->rx_small.shadow); |
1669 | 1761 | ||
1670 | abort_with_tx_req_bytes: | 1762 | abort_with_tx_req_bytes: |
1671 | kfree(mgp->tx.req_bytes); | 1763 | kfree(ss->tx.req_bytes); |
1672 | mgp->tx.req_bytes = NULL; | 1764 | ss->tx.req_bytes = NULL; |
1673 | mgp->tx.req_list = NULL; | 1765 | ss->tx.req_list = NULL; |
1674 | 1766 | ||
1675 | abort_with_nothing: | 1767 | abort_with_nothing: |
1676 | return status; | 1768 | return status; |
1677 | } | 1769 | } |
1678 | 1770 | ||
1679 | static void myri10ge_free_rings(struct net_device *dev) | 1771 | static void myri10ge_free_rings(struct myri10ge_slice_state *ss) |
1680 | { | 1772 | { |
1681 | struct myri10ge_priv *mgp; | 1773 | struct myri10ge_priv *mgp = ss->mgp; |
1682 | struct sk_buff *skb; | 1774 | struct sk_buff *skb; |
1683 | struct myri10ge_tx_buf *tx; | 1775 | struct myri10ge_tx_buf *tx; |
1684 | int i, len, idx; | 1776 | int i, len, idx; |
1685 | 1777 | ||
1686 | mgp = netdev_priv(dev); | 1778 | for (i = ss->rx_big.cnt; i < ss->rx_big.fill_cnt; i++) { |
1687 | 1779 | idx = i & ss->rx_big.mask; | |
1688 | for (i = mgp->rx_big.cnt; i < mgp->rx_big.fill_cnt; i++) { | 1780 | if (i == ss->rx_big.fill_cnt - 1) |
1689 | idx = i & mgp->rx_big.mask; | 1781 | ss->rx_big.info[idx].page_offset = MYRI10GE_ALLOC_SIZE; |
1690 | if (i == mgp->rx_big.fill_cnt - 1) | 1782 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_big.info[idx], |
1691 | mgp->rx_big.info[idx].page_offset = MYRI10GE_ALLOC_SIZE; | ||
1692 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_big.info[idx], | ||
1693 | mgp->big_bytes); | 1783 | mgp->big_bytes); |
1694 | put_page(mgp->rx_big.info[idx].page); | 1784 | put_page(ss->rx_big.info[idx].page); |
1695 | } | 1785 | } |
1696 | 1786 | ||
1697 | for (i = mgp->rx_small.cnt; i < mgp->rx_small.fill_cnt; i++) { | 1787 | for (i = ss->rx_small.cnt; i < ss->rx_small.fill_cnt; i++) { |
1698 | idx = i & mgp->rx_small.mask; | 1788 | idx = i & ss->rx_small.mask; |
1699 | if (i == mgp->rx_small.fill_cnt - 1) | 1789 | if (i == ss->rx_small.fill_cnt - 1) |
1700 | mgp->rx_small.info[idx].page_offset = | 1790 | ss->rx_small.info[idx].page_offset = |
1701 | MYRI10GE_ALLOC_SIZE; | 1791 | MYRI10GE_ALLOC_SIZE; |
1702 | myri10ge_unmap_rx_page(mgp->pdev, &mgp->rx_small.info[idx], | 1792 | myri10ge_unmap_rx_page(mgp->pdev, &ss->rx_small.info[idx], |
1703 | mgp->small_bytes + MXGEFW_PAD); | 1793 | mgp->small_bytes + MXGEFW_PAD); |
1704 | put_page(mgp->rx_small.info[idx].page); | 1794 | put_page(ss->rx_small.info[idx].page); |
1705 | } | 1795 | } |
1706 | tx = &mgp->tx; | 1796 | tx = &ss->tx; |
1707 | while (tx->done != tx->req) { | 1797 | while (tx->done != tx->req) { |
1708 | idx = tx->done & tx->mask; | 1798 | idx = tx->done & tx->mask; |
1709 | skb = tx->info[idx].skb; | 1799 | skb = tx->info[idx].skb; |
@@ -1714,7 +1804,7 @@ static void myri10ge_free_rings(struct net_device *dev) | |||
1714 | len = pci_unmap_len(&tx->info[idx], len); | 1804 | len = pci_unmap_len(&tx->info[idx], len); |
1715 | pci_unmap_len_set(&tx->info[idx], len, 0); | 1805 | pci_unmap_len_set(&tx->info[idx], len, 0); |
1716 | if (skb) { | 1806 | if (skb) { |
1717 | mgp->stats.tx_dropped++; | 1807 | ss->stats.tx_dropped++; |
1718 | dev_kfree_skb_any(skb); | 1808 | dev_kfree_skb_any(skb); |
1719 | if (len) | 1809 | if (len) |
1720 | pci_unmap_single(mgp->pdev, | 1810 | pci_unmap_single(mgp->pdev, |
@@ -1729,19 +1819,19 @@ static void myri10ge_free_rings(struct net_device *dev) | |||
1729 | PCI_DMA_TODEVICE); | 1819 | PCI_DMA_TODEVICE); |
1730 | } | 1820 | } |
1731 | } | 1821 | } |
1732 | kfree(mgp->rx_big.info); | 1822 | kfree(ss->rx_big.info); |
1733 | 1823 | ||
1734 | kfree(mgp->rx_small.info); | 1824 | kfree(ss->rx_small.info); |
1735 | 1825 | ||
1736 | kfree(mgp->tx.info); | 1826 | kfree(ss->tx.info); |
1737 | 1827 | ||
1738 | kfree(mgp->rx_big.shadow); | 1828 | kfree(ss->rx_big.shadow); |
1739 | 1829 | ||
1740 | kfree(mgp->rx_small.shadow); | 1830 | kfree(ss->rx_small.shadow); |
1741 | 1831 | ||
1742 | kfree(mgp->tx.req_bytes); | 1832 | kfree(ss->tx.req_bytes); |
1743 | mgp->tx.req_bytes = NULL; | 1833 | ss->tx.req_bytes = NULL; |
1744 | mgp->tx.req_list = NULL; | 1834 | ss->tx.req_list = NULL; |
1745 | } | 1835 | } |
1746 | 1836 | ||
1747 | static int myri10ge_request_irq(struct myri10ge_priv *mgp) | 1837 | static int myri10ge_request_irq(struct myri10ge_priv *mgp) |
@@ -1840,13 +1930,11 @@ myri10ge_get_frag_header(struct skb_frag_struct *frag, void **mac_hdr, | |||
1840 | 1930 | ||
1841 | static int myri10ge_open(struct net_device *dev) | 1931 | static int myri10ge_open(struct net_device *dev) |
1842 | { | 1932 | { |
1843 | struct myri10ge_priv *mgp; | 1933 | struct myri10ge_priv *mgp = netdev_priv(dev); |
1844 | struct myri10ge_cmd cmd; | 1934 | struct myri10ge_cmd cmd; |
1845 | struct net_lro_mgr *lro_mgr; | 1935 | struct net_lro_mgr *lro_mgr; |
1846 | int status, big_pow2; | 1936 | int status, big_pow2; |
1847 | 1937 | ||
1848 | mgp = netdev_priv(dev); | ||
1849 | |||
1850 | if (mgp->running != MYRI10GE_ETH_STOPPED) | 1938 | if (mgp->running != MYRI10GE_ETH_STOPPED) |
1851 | return -EBUSY; | 1939 | return -EBUSY; |
1852 | 1940 | ||
@@ -1883,16 +1971,16 @@ static int myri10ge_open(struct net_device *dev) | |||
1883 | /* get the lanai pointers to the send and receive rings */ | 1971 | /* get the lanai pointers to the send and receive rings */ |
1884 | 1972 | ||
1885 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, &cmd, 0); | 1973 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SEND_OFFSET, &cmd, 0); |
1886 | mgp->tx.lanai = | 1974 | mgp->ss.tx.lanai = |
1887 | (struct mcp_kreq_ether_send __iomem *)(mgp->sram + cmd.data0); | 1975 | (struct mcp_kreq_ether_send __iomem *)(mgp->sram + cmd.data0); |
1888 | 1976 | ||
1889 | status |= | 1977 | status |= |
1890 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, &cmd, 0); | 1978 | myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_SMALL_RX_OFFSET, &cmd, 0); |
1891 | mgp->rx_small.lanai = | 1979 | mgp->ss.rx_small.lanai = |
1892 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); | 1980 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); |
1893 | 1981 | ||
1894 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd, 0); | 1982 | status |= myri10ge_send_cmd(mgp, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd, 0); |
1895 | mgp->rx_big.lanai = | 1983 | mgp->ss.rx_big.lanai = |
1896 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); | 1984 | (struct mcp_kreq_ether_recv __iomem *)(mgp->sram + cmd.data0); |
1897 | 1985 | ||
1898 | if (status != 0) { | 1986 | if (status != 0) { |
@@ -1904,15 +1992,15 @@ static int myri10ge_open(struct net_device *dev) | |||
1904 | } | 1992 | } |
1905 | 1993 | ||
1906 | if (myri10ge_wcfifo && mgp->wc_enabled) { | 1994 | if (myri10ge_wcfifo && mgp->wc_enabled) { |
1907 | mgp->tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; | 1995 | mgp->ss.tx.wc_fifo = (u8 __iomem *) mgp->sram + MXGEFW_ETH_SEND_4; |
1908 | mgp->rx_small.wc_fifo = | 1996 | mgp->ss.rx_small.wc_fifo = |
1909 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; | 1997 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_SMALL; |
1910 | mgp->rx_big.wc_fifo = | 1998 | mgp->ss.rx_big.wc_fifo = |
1911 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_BIG; | 1999 | (u8 __iomem *) mgp->sram + MXGEFW_ETH_RECV_BIG; |
1912 | } else { | 2000 | } else { |
1913 | mgp->tx.wc_fifo = NULL; | 2001 | mgp->ss.tx.wc_fifo = NULL; |
1914 | mgp->rx_small.wc_fifo = NULL; | 2002 | mgp->ss.rx_small.wc_fifo = NULL; |
1915 | mgp->rx_big.wc_fifo = NULL; | 2003 | mgp->ss.rx_big.wc_fifo = NULL; |
1916 | } | 2004 | } |
1917 | 2005 | ||
1918 | /* Firmware needs the big buff size as a power of 2. Lie and | 2006 | /* Firmware needs the big buff size as a power of 2. Lie and |
@@ -1929,7 +2017,7 @@ static int myri10ge_open(struct net_device *dev) | |||
1929 | mgp->big_bytes = big_pow2; | 2017 | mgp->big_bytes = big_pow2; |
1930 | } | 2018 | } |
1931 | 2019 | ||
1932 | status = myri10ge_allocate_rings(dev); | 2020 | status = myri10ge_allocate_rings(&mgp->ss); |
1933 | if (status != 0) | 2021 | if (status != 0) |
1934 | goto abort_with_irq; | 2022 | goto abort_with_irq; |
1935 | 2023 | ||
@@ -1948,12 +2036,12 @@ static int myri10ge_open(struct net_device *dev) | |||
1948 | goto abort_with_rings; | 2036 | goto abort_with_rings; |
1949 | } | 2037 | } |
1950 | 2038 | ||
1951 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->fw_stats_bus); | 2039 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(mgp->ss.fw_stats_bus); |
1952 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->fw_stats_bus); | 2040 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(mgp->ss.fw_stats_bus); |
1953 | cmd.data2 = sizeof(struct mcp_irq_data); | 2041 | cmd.data2 = sizeof(struct mcp_irq_data); |
1954 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd, 0); | 2042 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd, 0); |
1955 | if (status == -ENOSYS) { | 2043 | if (status == -ENOSYS) { |
1956 | dma_addr_t bus = mgp->fw_stats_bus; | 2044 | dma_addr_t bus = mgp->ss.fw_stats_bus; |
1957 | bus += offsetof(struct mcp_irq_data, send_done_count); | 2045 | bus += offsetof(struct mcp_irq_data, send_done_count); |
1958 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(bus); | 2046 | cmd.data0 = MYRI10GE_LOWPART_TO_U32(bus); |
1959 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(bus); | 2047 | cmd.data1 = MYRI10GE_HIGHPART_TO_U32(bus); |
@@ -1974,20 +2062,20 @@ static int myri10ge_open(struct net_device *dev) | |||
1974 | mgp->link_state = ~0U; | 2062 | mgp->link_state = ~0U; |
1975 | mgp->rdma_tags_available = 15; | 2063 | mgp->rdma_tags_available = 15; |
1976 | 2064 | ||
1977 | lro_mgr = &mgp->rx_done.lro_mgr; | 2065 | lro_mgr = &mgp->ss.rx_done.lro_mgr; |
1978 | lro_mgr->dev = dev; | 2066 | lro_mgr->dev = dev; |
1979 | lro_mgr->features = LRO_F_NAPI; | 2067 | lro_mgr->features = LRO_F_NAPI; |
1980 | lro_mgr->ip_summed = CHECKSUM_COMPLETE; | 2068 | lro_mgr->ip_summed = CHECKSUM_COMPLETE; |
1981 | lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; | 2069 | lro_mgr->ip_summed_aggr = CHECKSUM_UNNECESSARY; |
1982 | lro_mgr->max_desc = MYRI10GE_MAX_LRO_DESCRIPTORS; | 2070 | lro_mgr->max_desc = MYRI10GE_MAX_LRO_DESCRIPTORS; |
1983 | lro_mgr->lro_arr = mgp->rx_done.lro_desc; | 2071 | lro_mgr->lro_arr = mgp->ss.rx_done.lro_desc; |
1984 | lro_mgr->get_frag_header = myri10ge_get_frag_header; | 2072 | lro_mgr->get_frag_header = myri10ge_get_frag_header; |
1985 | lro_mgr->max_aggr = myri10ge_lro_max_pkts; | 2073 | lro_mgr->max_aggr = myri10ge_lro_max_pkts; |
1986 | lro_mgr->frag_align_pad = 2; | 2074 | lro_mgr->frag_align_pad = 2; |
1987 | if (lro_mgr->max_aggr > MAX_SKB_FRAGS) | 2075 | if (lro_mgr->max_aggr > MAX_SKB_FRAGS) |
1988 | lro_mgr->max_aggr = MAX_SKB_FRAGS; | 2076 | lro_mgr->max_aggr = MAX_SKB_FRAGS; |
1989 | 2077 | ||
1990 | napi_enable(&mgp->napi); /* must happen prior to any irq */ | 2078 | napi_enable(&mgp->ss.napi); /* must happen prior to any irq */ |
1991 | 2079 | ||
1992 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_UP, &cmd, 0); | 2080 | status = myri10ge_send_cmd(mgp, MXGEFW_CMD_ETHERNET_UP, &cmd, 0); |
1993 | if (status) { | 2081 | if (status) { |
@@ -1996,8 +2084,8 @@ static int myri10ge_open(struct net_device *dev) | |||
1996 | goto abort_with_rings; | 2084 | goto abort_with_rings; |
1997 | } | 2085 | } |
1998 | 2086 | ||
1999 | mgp->wake_queue = 0; | 2087 | mgp->ss.tx.wake_queue = 0; |
2000 | mgp->stop_queue = 0; | 2088 | mgp->ss.tx.stop_queue = 0; |
2001 | mgp->running = MYRI10GE_ETH_RUNNING; | 2089 | mgp->running = MYRI10GE_ETH_RUNNING; |
2002 | mgp->watchdog_timer.expires = jiffies + myri10ge_watchdog_timeout * HZ; | 2090 | mgp->watchdog_timer.expires = jiffies + myri10ge_watchdog_timeout * HZ; |
2003 | add_timer(&mgp->watchdog_timer); | 2091 | add_timer(&mgp->watchdog_timer); |
@@ -2005,7 +2093,7 @@ static int myri10ge_open(struct net_device *dev) | |||
2005 | return 0; | 2093 | return 0; |
2006 | 2094 | ||
2007 | abort_with_rings: | 2095 | abort_with_rings: |
2008 | myri10ge_free_rings(dev); | 2096 | myri10ge_free_rings(&mgp->ss); |
2009 | 2097 | ||
2010 | abort_with_irq: | 2098 | abort_with_irq: |
2011 | myri10ge_free_irq(mgp); | 2099 | myri10ge_free_irq(mgp); |
@@ -2017,21 +2105,19 @@ abort_with_nothing: | |||
2017 | 2105 | ||
2018 | static int myri10ge_close(struct net_device *dev) | 2106 | static int myri10ge_close(struct net_device *dev) |
2019 | { | 2107 | { |
2020 | struct myri10ge_priv *mgp; | 2108 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2021 | struct myri10ge_cmd cmd; | 2109 | struct myri10ge_cmd cmd; |
2022 | int status, old_down_cnt; | 2110 | int status, old_down_cnt; |
2023 | 2111 | ||
2024 | mgp = netdev_priv(dev); | ||
2025 | |||
2026 | if (mgp->running != MYRI10GE_ETH_RUNNING) | 2112 | if (mgp->running != MYRI10GE_ETH_RUNNING) |
2027 | return 0; | 2113 | return 0; |
2028 | 2114 | ||
2029 | if (mgp->tx.req_bytes == NULL) | 2115 | if (mgp->ss.tx.req_bytes == NULL) |
2030 | return 0; | 2116 | return 0; |
2031 | 2117 | ||
2032 | del_timer_sync(&mgp->watchdog_timer); | 2118 | del_timer_sync(&mgp->watchdog_timer); |
2033 | mgp->running = MYRI10GE_ETH_STOPPING; | 2119 | mgp->running = MYRI10GE_ETH_STOPPING; |
2034 | napi_disable(&mgp->napi); | 2120 | napi_disable(&mgp->ss.napi); |
2035 | netif_carrier_off(dev); | 2121 | netif_carrier_off(dev); |
2036 | netif_stop_queue(dev); | 2122 | netif_stop_queue(dev); |
2037 | old_down_cnt = mgp->down_cnt; | 2123 | old_down_cnt = mgp->down_cnt; |
@@ -2047,7 +2133,7 @@ static int myri10ge_close(struct net_device *dev) | |||
2047 | 2133 | ||
2048 | netif_tx_disable(dev); | 2134 | netif_tx_disable(dev); |
2049 | myri10ge_free_irq(mgp); | 2135 | myri10ge_free_irq(mgp); |
2050 | myri10ge_free_rings(dev); | 2136 | myri10ge_free_rings(&mgp->ss); |
2051 | 2137 | ||
2052 | mgp->running = MYRI10GE_ETH_STOPPED; | 2138 | mgp->running = MYRI10GE_ETH_STOPPED; |
2053 | return 0; | 2139 | return 0; |
@@ -2143,7 +2229,7 @@ myri10ge_submit_req_wc(struct myri10ge_tx_buf *tx, | |||
2143 | 2229 | ||
2144 | /* | 2230 | /* |
2145 | * Transmit a packet. We need to split the packet so that a single | 2231 | * Transmit a packet. We need to split the packet so that a single |
2146 | * segment does not cross myri10ge->tx.boundary, so this makes segment | 2232 | * segment does not cross myri10ge->tx_boundary, so this makes segment |
2147 | * counting tricky. So rather than try to count segments up front, we | 2233 | * counting tricky. So rather than try to count segments up front, we |
2148 | * just give up if there are too few segments to hold a reasonably | 2234 | * just give up if there are too few segments to hold a reasonably |
2149 | * fragmented packet currently available. If we run | 2235 | * fragmented packet currently available. If we run |
@@ -2154,8 +2240,9 @@ myri10ge_submit_req_wc(struct myri10ge_tx_buf *tx, | |||
2154 | static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) | 2240 | static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) |
2155 | { | 2241 | { |
2156 | struct myri10ge_priv *mgp = netdev_priv(dev); | 2242 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2243 | struct myri10ge_slice_state *ss; | ||
2157 | struct mcp_kreq_ether_send *req; | 2244 | struct mcp_kreq_ether_send *req; |
2158 | struct myri10ge_tx_buf *tx = &mgp->tx; | 2245 | struct myri10ge_tx_buf *tx; |
2159 | struct skb_frag_struct *frag; | 2246 | struct skb_frag_struct *frag; |
2160 | dma_addr_t bus; | 2247 | dma_addr_t bus; |
2161 | u32 low; | 2248 | u32 low; |
@@ -2166,6 +2253,9 @@ static int myri10ge_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2166 | int cum_len, seglen, boundary, rdma_count; | 2253 | int cum_len, seglen, boundary, rdma_count; |
2167 | u8 flags, odd_flag; | 2254 | u8 flags, odd_flag; |
2168 | 2255 | ||
2256 | /* always transmit through slot 0 */ | ||
2257 | ss = &mgp->ss; | ||
2258 | tx = &ss->tx; | ||
2169 | again: | 2259 | again: |
2170 | req = tx->req_list; | 2260 | req = tx->req_list; |
2171 | avail = tx->mask - 1 - (tx->req - tx->done); | 2261 | avail = tx->mask - 1 - (tx->req - tx->done); |
@@ -2180,7 +2270,7 @@ again: | |||
2180 | 2270 | ||
2181 | if ((unlikely(avail < max_segments))) { | 2271 | if ((unlikely(avail < max_segments))) { |
2182 | /* we are out of transmit resources */ | 2272 | /* we are out of transmit resources */ |
2183 | mgp->stop_queue++; | 2273 | tx->stop_queue++; |
2184 | netif_stop_queue(dev); | 2274 | netif_stop_queue(dev); |
2185 | return 1; | 2275 | return 1; |
2186 | } | 2276 | } |
@@ -2242,7 +2332,7 @@ again: | |||
2242 | if (skb_padto(skb, ETH_ZLEN)) { | 2332 | if (skb_padto(skb, ETH_ZLEN)) { |
2243 | /* The packet is gone, so we must | 2333 | /* The packet is gone, so we must |
2244 | * return 0 */ | 2334 | * return 0 */ |
2245 | mgp->stats.tx_dropped += 1; | 2335 | ss->stats.tx_dropped += 1; |
2246 | return 0; | 2336 | return 0; |
2247 | } | 2337 | } |
2248 | /* adjust the len to account for the zero pad | 2338 | /* adjust the len to account for the zero pad |
@@ -2284,7 +2374,7 @@ again: | |||
2284 | 2374 | ||
2285 | while (1) { | 2375 | while (1) { |
2286 | /* Break the SKB or Fragment up into pieces which | 2376 | /* Break the SKB or Fragment up into pieces which |
2287 | * do not cross mgp->tx.boundary */ | 2377 | * do not cross mgp->tx_boundary */ |
2288 | low = MYRI10GE_LOWPART_TO_U32(bus); | 2378 | low = MYRI10GE_LOWPART_TO_U32(bus); |
2289 | high_swapped = htonl(MYRI10GE_HIGHPART_TO_U32(bus)); | 2379 | high_swapped = htonl(MYRI10GE_HIGHPART_TO_U32(bus)); |
2290 | while (len) { | 2380 | while (len) { |
@@ -2294,7 +2384,8 @@ again: | |||
2294 | if (unlikely(count == max_segments)) | 2384 | if (unlikely(count == max_segments)) |
2295 | goto abort_linearize; | 2385 | goto abort_linearize; |
2296 | 2386 | ||
2297 | boundary = (low + tx->boundary) & ~(tx->boundary - 1); | 2387 | boundary = |
2388 | (low + mgp->tx_boundary) & ~(mgp->tx_boundary - 1); | ||
2298 | seglen = boundary - low; | 2389 | seglen = boundary - low; |
2299 | if (seglen > len) | 2390 | if (seglen > len) |
2300 | seglen = len; | 2391 | seglen = len; |
@@ -2378,7 +2469,7 @@ again: | |||
2378 | myri10ge_submit_req_wc(tx, tx->req_list, count); | 2469 | myri10ge_submit_req_wc(tx, tx->req_list, count); |
2379 | tx->pkt_start++; | 2470 | tx->pkt_start++; |
2380 | if ((avail - count) < MXGEFW_MAX_SEND_DESC) { | 2471 | if ((avail - count) < MXGEFW_MAX_SEND_DESC) { |
2381 | mgp->stop_queue++; | 2472 | tx->stop_queue++; |
2382 | netif_stop_queue(dev); | 2473 | netif_stop_queue(dev); |
2383 | } | 2474 | } |
2384 | dev->trans_start = jiffies; | 2475 | dev->trans_start = jiffies; |
@@ -2420,12 +2511,12 @@ abort_linearize: | |||
2420 | if (skb_linearize(skb)) | 2511 | if (skb_linearize(skb)) |
2421 | goto drop; | 2512 | goto drop; |
2422 | 2513 | ||
2423 | mgp->tx_linearized++; | 2514 | tx->linearized++; |
2424 | goto again; | 2515 | goto again; |
2425 | 2516 | ||
2426 | drop: | 2517 | drop: |
2427 | dev_kfree_skb_any(skb); | 2518 | dev_kfree_skb_any(skb); |
2428 | mgp->stats.tx_dropped += 1; | 2519 | ss->stats.tx_dropped += 1; |
2429 | return 0; | 2520 | return 0; |
2430 | 2521 | ||
2431 | } | 2522 | } |
@@ -2433,7 +2524,7 @@ drop: | |||
2433 | static int myri10ge_sw_tso(struct sk_buff *skb, struct net_device *dev) | 2524 | static int myri10ge_sw_tso(struct sk_buff *skb, struct net_device *dev) |
2434 | { | 2525 | { |
2435 | struct sk_buff *segs, *curr; | 2526 | struct sk_buff *segs, *curr; |
2436 | struct myri10ge_priv *mgp = dev->priv; | 2527 | struct myri10ge_priv *mgp = netdev_priv(dev); |
2437 | int status; | 2528 | int status; |
2438 | 2529 | ||
2439 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO6); | 2530 | segs = skb_gso_segment(skb, dev->features & ~NETIF_F_TSO6); |
@@ -2473,14 +2564,13 @@ static struct net_device_stats *myri10ge_get_stats(struct net_device *dev) | |||
2473 | 2564 | ||
2474 | static void myri10ge_set_multicast_list(struct net_device *dev) | 2565 | static void myri10ge_set_multicast_list(struct net_device *dev) |
2475 | { | 2566 | { |
2567 | struct myri10ge_priv *mgp = netdev_priv(dev); | ||
2476 | struct myri10ge_cmd cmd; | 2568 | struct myri10ge_cmd cmd; |
2477 | struct myri10ge_priv *mgp; | ||
2478 | struct dev_mc_list *mc_list; | 2569 | struct dev_mc_list *mc_list; |
2479 | __be32 data[2] = { 0, 0 }; | 2570 | __be32 data[2] = { 0, 0 }; |
2480 | int err; | 2571 | int err; |
2481 | DECLARE_MAC_BUF(mac); | 2572 | DECLARE_MAC_BUF(mac); |
2482 | 2573 | ||
2483 | mgp = netdev_priv(dev); | ||
2484 | /* can be called from atomic contexts, | 2574 | /* can be called from atomic contexts, |
2485 | * pass 1 to force atomicity in myri10ge_send_cmd() */ | 2575 | * pass 1 to force atomicity in myri10ge_send_cmd() */ |
2486 | myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1); | 2576 | myri10ge_change_promisc(mgp, dev->flags & IFF_PROMISC, 1); |
@@ -2616,13 +2706,14 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
2616 | ext_type = (val & PCI_EXP_FLAGS_TYPE) >> 4; | 2706 | ext_type = (val & PCI_EXP_FLAGS_TYPE) >> 4; |
2617 | if (ext_type != PCI_EXP_TYPE_ROOT_PORT) { | 2707 | if (ext_type != PCI_EXP_TYPE_ROOT_PORT) { |
2618 | if (myri10ge_ecrc_enable > 1) { | 2708 | if (myri10ge_ecrc_enable > 1) { |
2619 | struct pci_dev *old_bridge = bridge; | 2709 | struct pci_dev *prev_bridge, *old_bridge = bridge; |
2620 | 2710 | ||
2621 | /* Walk the hierarchy up to the root port | 2711 | /* Walk the hierarchy up to the root port |
2622 | * where ECRC has to be enabled */ | 2712 | * where ECRC has to be enabled */ |
2623 | do { | 2713 | do { |
2714 | prev_bridge = bridge; | ||
2624 | bridge = bridge->bus->self; | 2715 | bridge = bridge->bus->self; |
2625 | if (!bridge) { | 2716 | if (!bridge || prev_bridge == bridge) { |
2626 | dev_err(dev, | 2717 | dev_err(dev, |
2627 | "Failed to find root port" | 2718 | "Failed to find root port" |
2628 | " to force ECRC\n"); | 2719 | " to force ECRC\n"); |
@@ -2681,9 +2772,9 @@ static void myri10ge_enable_ecrc(struct myri10ge_priv *mgp) | |||
2681 | * already been enabled, then it must use a firmware image which works | 2772 | * already been enabled, then it must use a firmware image which works |
2682 | * around unaligned completion packets (myri10ge_ethp_z8e.dat), and it | 2773 | * around unaligned completion packets (myri10ge_ethp_z8e.dat), and it |
2683 | * should also ensure that it never gives the device a Read-DMA which is | 2774 | * should also ensure that it never gives the device a Read-DMA which is |
2684 | * larger than 2KB by setting the tx.boundary to 2KB. If ECRC is | 2775 | * larger than 2KB by setting the tx_boundary to 2KB. If ECRC is |
2685 | * enabled, then the driver should use the aligned (myri10ge_eth_z8e.dat) | 2776 | * enabled, then the driver should use the aligned (myri10ge_eth_z8e.dat) |
2686 | * firmware image, and set tx.boundary to 4KB. | 2777 | * firmware image, and set tx_boundary to 4KB. |
2687 | */ | 2778 | */ |
2688 | 2779 | ||
2689 | static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | 2780 | static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) |
@@ -2692,7 +2783,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2692 | struct device *dev = &pdev->dev; | 2783 | struct device *dev = &pdev->dev; |
2693 | int status; | 2784 | int status; |
2694 | 2785 | ||
2695 | mgp->tx.boundary = 4096; | 2786 | mgp->tx_boundary = 4096; |
2696 | /* | 2787 | /* |
2697 | * Verify the max read request size was set to 4KB | 2788 | * Verify the max read request size was set to 4KB |
2698 | * before trying the test with 4KB. | 2789 | * before trying the test with 4KB. |
@@ -2704,7 +2795,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2704 | } | 2795 | } |
2705 | if (status != 4096) { | 2796 | if (status != 4096) { |
2706 | dev_warn(dev, "Max Read Request size != 4096 (%d)\n", status); | 2797 | dev_warn(dev, "Max Read Request size != 4096 (%d)\n", status); |
2707 | mgp->tx.boundary = 2048; | 2798 | mgp->tx_boundary = 2048; |
2708 | } | 2799 | } |
2709 | /* | 2800 | /* |
2710 | * load the optimized firmware (which assumes aligned PCIe | 2801 | * load the optimized firmware (which assumes aligned PCIe |
@@ -2737,7 +2828,7 @@ static void myri10ge_firmware_probe(struct myri10ge_priv *mgp) | |||
2737 | "Please install up to date fw\n"); | 2828 | "Please install up to date fw\n"); |
2738 | abort: | 2829 | abort: |
2739 | /* fall back to using the unaligned firmware */ | 2830 | /* fall back to using the unaligned firmware */ |
2740 | mgp->tx.boundary = 2048; | 2831 | mgp->tx_boundary = 2048; |
2741 | mgp->fw_name = myri10ge_fw_unaligned; | 2832 | mgp->fw_name = myri10ge_fw_unaligned; |
2742 | 2833 | ||
2743 | } | 2834 | } |
@@ -2758,7 +2849,7 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
2758 | if (link_width < 8) { | 2849 | if (link_width < 8) { |
2759 | dev_info(&mgp->pdev->dev, "PCIE x%d Link\n", | 2850 | dev_info(&mgp->pdev->dev, "PCIE x%d Link\n", |
2760 | link_width); | 2851 | link_width); |
2761 | mgp->tx.boundary = 4096; | 2852 | mgp->tx_boundary = 4096; |
2762 | mgp->fw_name = myri10ge_fw_aligned; | 2853 | mgp->fw_name = myri10ge_fw_aligned; |
2763 | } else { | 2854 | } else { |
2764 | myri10ge_firmware_probe(mgp); | 2855 | myri10ge_firmware_probe(mgp); |
@@ -2767,12 +2858,12 @@ static void myri10ge_select_firmware(struct myri10ge_priv *mgp) | |||
2767 | if (myri10ge_force_firmware == 1) { | 2858 | if (myri10ge_force_firmware == 1) { |
2768 | dev_info(&mgp->pdev->dev, | 2859 | dev_info(&mgp->pdev->dev, |
2769 | "Assuming aligned completions (forced)\n"); | 2860 | "Assuming aligned completions (forced)\n"); |
2770 | mgp->tx.boundary = 4096; | 2861 | mgp->tx_boundary = 4096; |
2771 | mgp->fw_name = myri10ge_fw_aligned; | 2862 | mgp->fw_name = myri10ge_fw_aligned; |
2772 | } else { | 2863 | } else { |
2773 | dev_info(&mgp->pdev->dev, | 2864 | dev_info(&mgp->pdev->dev, |
2774 | "Assuming unaligned completions (forced)\n"); | 2865 | "Assuming unaligned completions (forced)\n"); |
2775 | mgp->tx.boundary = 2048; | 2866 | mgp->tx_boundary = 2048; |
2776 | mgp->fw_name = myri10ge_fw_unaligned; | 2867 | mgp->fw_name = myri10ge_fw_unaligned; |
2777 | } | 2868 | } |
2778 | } | 2869 | } |
@@ -2889,6 +2980,7 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2889 | { | 2980 | { |
2890 | struct myri10ge_priv *mgp = | 2981 | struct myri10ge_priv *mgp = |
2891 | container_of(work, struct myri10ge_priv, watchdog_work); | 2982 | container_of(work, struct myri10ge_priv, watchdog_work); |
2983 | struct myri10ge_tx_buf *tx; | ||
2892 | u32 reboot; | 2984 | u32 reboot; |
2893 | int status; | 2985 | int status; |
2894 | u16 cmd, vendor; | 2986 | u16 cmd, vendor; |
@@ -2938,15 +3030,16 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2938 | 3030 | ||
2939 | printk(KERN_ERR "myri10ge: %s: device timeout, resetting\n", | 3031 | printk(KERN_ERR "myri10ge: %s: device timeout, resetting\n", |
2940 | mgp->dev->name); | 3032 | mgp->dev->name); |
3033 | tx = &mgp->ss.tx; | ||
2941 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", | 3034 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", |
2942 | mgp->dev->name, mgp->tx.req, mgp->tx.done, | 3035 | mgp->dev->name, tx->req, tx->done, |
2943 | mgp->tx.pkt_start, mgp->tx.pkt_done, | 3036 | tx->pkt_start, tx->pkt_done, |
2944 | (int)ntohl(mgp->fw_stats->send_done_count)); | 3037 | (int)ntohl(mgp->ss.fw_stats->send_done_count)); |
2945 | msleep(2000); | 3038 | msleep(2000); |
2946 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", | 3039 | printk(KERN_INFO "myri10ge: %s: %d %d %d %d %d\n", |
2947 | mgp->dev->name, mgp->tx.req, mgp->tx.done, | 3040 | mgp->dev->name, tx->req, tx->done, |
2948 | mgp->tx.pkt_start, mgp->tx.pkt_done, | 3041 | tx->pkt_start, tx->pkt_done, |
2949 | (int)ntohl(mgp->fw_stats->send_done_count)); | 3042 | (int)ntohl(mgp->ss.fw_stats->send_done_count)); |
2950 | } | 3043 | } |
2951 | rtnl_lock(); | 3044 | rtnl_lock(); |
2952 | myri10ge_close(mgp->dev); | 3045 | myri10ge_close(mgp->dev); |
@@ -2969,28 +3062,31 @@ static void myri10ge_watchdog(struct work_struct *work) | |||
2969 | static void myri10ge_watchdog_timer(unsigned long arg) | 3062 | static void myri10ge_watchdog_timer(unsigned long arg) |
2970 | { | 3063 | { |
2971 | struct myri10ge_priv *mgp; | 3064 | struct myri10ge_priv *mgp; |
3065 | struct myri10ge_slice_state *ss; | ||
2972 | u32 rx_pause_cnt; | 3066 | u32 rx_pause_cnt; |
2973 | 3067 | ||
2974 | mgp = (struct myri10ge_priv *)arg; | 3068 | mgp = (struct myri10ge_priv *)arg; |
2975 | 3069 | ||
2976 | if (mgp->rx_small.watchdog_needed) { | 3070 | rx_pause_cnt = ntohl(mgp->ss.fw_stats->dropped_pause); |
2977 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_small, | 3071 | |
3072 | ss = &mgp->ss; | ||
3073 | if (ss->rx_small.watchdog_needed) { | ||
3074 | myri10ge_alloc_rx_pages(mgp, &ss->rx_small, | ||
2978 | mgp->small_bytes + MXGEFW_PAD, 1); | 3075 | mgp->small_bytes + MXGEFW_PAD, 1); |
2979 | if (mgp->rx_small.fill_cnt - mgp->rx_small.cnt >= | 3076 | if (ss->rx_small.fill_cnt - ss->rx_small.cnt >= |
2980 | myri10ge_fill_thresh) | 3077 | myri10ge_fill_thresh) |
2981 | mgp->rx_small.watchdog_needed = 0; | 3078 | ss->rx_small.watchdog_needed = 0; |
2982 | } | 3079 | } |
2983 | if (mgp->rx_big.watchdog_needed) { | 3080 | if (ss->rx_big.watchdog_needed) { |
2984 | myri10ge_alloc_rx_pages(mgp, &mgp->rx_big, mgp->big_bytes, 1); | 3081 | myri10ge_alloc_rx_pages(mgp, &ss->rx_big, mgp->big_bytes, 1); |
2985 | if (mgp->rx_big.fill_cnt - mgp->rx_big.cnt >= | 3082 | if (ss->rx_big.fill_cnt - ss->rx_big.cnt >= |
2986 | myri10ge_fill_thresh) | 3083 | myri10ge_fill_thresh) |
2987 | mgp->rx_big.watchdog_needed = 0; | 3084 | ss->rx_big.watchdog_needed = 0; |
2988 | } | 3085 | } |
2989 | rx_pause_cnt = ntohl(mgp->fw_stats->dropped_pause); | ||
2990 | 3086 | ||
2991 | if (mgp->tx.req != mgp->tx.done && | 3087 | if (ss->tx.req != ss->tx.done && |
2992 | mgp->tx.done == mgp->watchdog_tx_done && | 3088 | ss->tx.done == ss->watchdog_tx_done && |
2993 | mgp->watchdog_tx_req != mgp->watchdog_tx_done) { | 3089 | ss->watchdog_tx_req != ss->watchdog_tx_done) { |
2994 | /* nic seems like it might be stuck.. */ | 3090 | /* nic seems like it might be stuck.. */ |
2995 | if (rx_pause_cnt != mgp->watchdog_pause) { | 3091 | if (rx_pause_cnt != mgp->watchdog_pause) { |
2996 | if (net_ratelimit()) | 3092 | if (net_ratelimit()) |
@@ -3005,8 +3101,8 @@ static void myri10ge_watchdog_timer(unsigned long arg) | |||
3005 | /* rearm timer */ | 3101 | /* rearm timer */ |
3006 | mod_timer(&mgp->watchdog_timer, | 3102 | mod_timer(&mgp->watchdog_timer, |
3007 | jiffies + myri10ge_watchdog_timeout * HZ); | 3103 | jiffies + myri10ge_watchdog_timeout * HZ); |
3008 | mgp->watchdog_tx_done = mgp->tx.done; | 3104 | ss->watchdog_tx_done = ss->tx.done; |
3009 | mgp->watchdog_tx_req = mgp->tx.req; | 3105 | ss->watchdog_tx_req = ss->tx.req; |
3010 | mgp->watchdog_pause = rx_pause_cnt; | 3106 | mgp->watchdog_pause = rx_pause_cnt; |
3011 | } | 3107 | } |
3012 | 3108 | ||
@@ -3030,7 +3126,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3030 | 3126 | ||
3031 | mgp = netdev_priv(netdev); | 3127 | mgp = netdev_priv(netdev); |
3032 | mgp->dev = netdev; | 3128 | mgp->dev = netdev; |
3033 | netif_napi_add(netdev, &mgp->napi, myri10ge_poll, myri10ge_napi_weight); | 3129 | netif_napi_add(netdev, &mgp->ss.napi, myri10ge_poll, myri10ge_napi_weight); |
3034 | mgp->pdev = pdev; | 3130 | mgp->pdev = pdev; |
3035 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; | 3131 | mgp->csum_flag = MXGEFW_FLAGS_CKSUM; |
3036 | mgp->pause = myri10ge_flow_control; | 3132 | mgp->pause = myri10ge_flow_control; |
@@ -3076,9 +3172,9 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3076 | if (mgp->cmd == NULL) | 3172 | if (mgp->cmd == NULL) |
3077 | goto abort_with_netdev; | 3173 | goto abort_with_netdev; |
3078 | 3174 | ||
3079 | mgp->fw_stats = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3175 | mgp->ss.fw_stats = dma_alloc_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3080 | &mgp->fw_stats_bus, GFP_KERNEL); | 3176 | &mgp->ss.fw_stats_bus, GFP_KERNEL); |
3081 | if (mgp->fw_stats == NULL) | 3177 | if (mgp->ss.fw_stats == NULL) |
3082 | goto abort_with_cmd; | 3178 | goto abort_with_cmd; |
3083 | 3179 | ||
3084 | mgp->board_span = pci_resource_len(pdev, 0); | 3180 | mgp->board_span = pci_resource_len(pdev, 0); |
@@ -3118,12 +3214,12 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3118 | netdev->dev_addr[i] = mgp->mac_addr[i]; | 3214 | netdev->dev_addr[i] = mgp->mac_addr[i]; |
3119 | 3215 | ||
3120 | /* allocate rx done ring */ | 3216 | /* allocate rx done ring */ |
3121 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3217 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3122 | mgp->rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes, | 3218 | mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes, |
3123 | &mgp->rx_done.bus, GFP_KERNEL); | 3219 | &mgp->ss.rx_done.bus, GFP_KERNEL); |
3124 | if (mgp->rx_done.entry == NULL) | 3220 | if (mgp->ss.rx_done.entry == NULL) |
3125 | goto abort_with_ioremap; | 3221 | goto abort_with_ioremap; |
3126 | memset(mgp->rx_done.entry, 0, bytes); | 3222 | memset(mgp->ss.rx_done.entry, 0, bytes); |
3127 | 3223 | ||
3128 | myri10ge_select_firmware(mgp); | 3224 | myri10ge_select_firmware(mgp); |
3129 | 3225 | ||
@@ -3183,7 +3279,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3183 | } | 3279 | } |
3184 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", | 3280 | dev_info(dev, "%s IRQ %d, tx bndry %d, fw %s, WC %s\n", |
3185 | (mgp->msi_enabled ? "MSI" : "xPIC"), | 3281 | (mgp->msi_enabled ? "MSI" : "xPIC"), |
3186 | netdev->irq, mgp->tx.boundary, mgp->fw_name, | 3282 | netdev->irq, mgp->tx_boundary, mgp->fw_name, |
3187 | (mgp->wc_enabled ? "Enabled" : "Disabled")); | 3283 | (mgp->wc_enabled ? "Enabled" : "Disabled")); |
3188 | 3284 | ||
3189 | return 0; | 3285 | return 0; |
@@ -3195,9 +3291,9 @@ abort_with_firmware: | |||
3195 | myri10ge_dummy_rdma(mgp, 0); | 3291 | myri10ge_dummy_rdma(mgp, 0); |
3196 | 3292 | ||
3197 | abort_with_rx_done: | 3293 | abort_with_rx_done: |
3198 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3294 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3199 | dma_free_coherent(&pdev->dev, bytes, | 3295 | dma_free_coherent(&pdev->dev, bytes, |
3200 | mgp->rx_done.entry, mgp->rx_done.bus); | 3296 | mgp->ss.rx_done.entry, mgp->ss.rx_done.bus); |
3201 | 3297 | ||
3202 | abort_with_ioremap: | 3298 | abort_with_ioremap: |
3203 | iounmap(mgp->sram); | 3299 | iounmap(mgp->sram); |
@@ -3207,8 +3303,8 @@ abort_with_wc: | |||
3207 | if (mgp->mtrr >= 0) | 3303 | if (mgp->mtrr >= 0) |
3208 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); | 3304 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); |
3209 | #endif | 3305 | #endif |
3210 | dma_free_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3306 | dma_free_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3211 | mgp->fw_stats, mgp->fw_stats_bus); | 3307 | mgp->ss.fw_stats, mgp->ss.fw_stats_bus); |
3212 | 3308 | ||
3213 | abort_with_cmd: | 3309 | abort_with_cmd: |
3214 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), | 3310 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), |
@@ -3246,9 +3342,9 @@ static void myri10ge_remove(struct pci_dev *pdev) | |||
3246 | /* avoid a memory leak */ | 3342 | /* avoid a memory leak */ |
3247 | pci_restore_state(pdev); | 3343 | pci_restore_state(pdev); |
3248 | 3344 | ||
3249 | bytes = myri10ge_max_intr_slots * sizeof(*mgp->rx_done.entry); | 3345 | bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry); |
3250 | dma_free_coherent(&pdev->dev, bytes, | 3346 | dma_free_coherent(&pdev->dev, bytes, |
3251 | mgp->rx_done.entry, mgp->rx_done.bus); | 3347 | mgp->ss.rx_done.entry, mgp->ss.rx_done.bus); |
3252 | 3348 | ||
3253 | iounmap(mgp->sram); | 3349 | iounmap(mgp->sram); |
3254 | 3350 | ||
@@ -3256,8 +3352,8 @@ static void myri10ge_remove(struct pci_dev *pdev) | |||
3256 | if (mgp->mtrr >= 0) | 3352 | if (mgp->mtrr >= 0) |
3257 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); | 3353 | mtrr_del(mgp->mtrr, mgp->iomem_base, mgp->board_span); |
3258 | #endif | 3354 | #endif |
3259 | dma_free_coherent(&pdev->dev, sizeof(*mgp->fw_stats), | 3355 | dma_free_coherent(&pdev->dev, sizeof(*mgp->ss.fw_stats), |
3260 | mgp->fw_stats, mgp->fw_stats_bus); | 3356 | mgp->ss.fw_stats, mgp->ss.fw_stats_bus); |
3261 | 3357 | ||
3262 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), | 3358 | dma_free_coherent(&pdev->dev, sizeof(*mgp->cmd), |
3263 | mgp->cmd, mgp->cmd_bus); | 3359 | mgp->cmd, mgp->cmd_bus); |
diff --git a/drivers/net/myri10ge/myri10ge_mcp.h b/drivers/net/myri10ge/myri10ge_mcp.h index 58e57178c563..fdbeeee07372 100644 --- a/drivers/net/myri10ge/myri10ge_mcp.h +++ b/drivers/net/myri10ge/myri10ge_mcp.h | |||
@@ -10,7 +10,7 @@ struct mcp_dma_addr { | |||
10 | __be32 low; | 10 | __be32 low; |
11 | }; | 11 | }; |
12 | 12 | ||
13 | /* 4 Bytes. 8 Bytes for NDIS drivers. */ | 13 | /* 4 Bytes */ |
14 | struct mcp_slot { | 14 | struct mcp_slot { |
15 | __sum16 checksum; | 15 | __sum16 checksum; |
16 | __be16 length; | 16 | __be16 length; |
@@ -144,6 +144,7 @@ enum myri10ge_mcp_cmd_type { | |||
144 | * a power of 2 number of entries. */ | 144 | * a power of 2 number of entries. */ |
145 | 145 | ||
146 | MXGEFW_CMD_SET_INTRQ_SIZE, /* in bytes */ | 146 | MXGEFW_CMD_SET_INTRQ_SIZE, /* in bytes */ |
147 | #define MXGEFW_CMD_SET_INTRQ_SIZE_FLAG_NO_STRICT_SIZE_CHECK (1 << 31) | ||
147 | 148 | ||
148 | /* command to bring ethernet interface up. Above parameters | 149 | /* command to bring ethernet interface up. Above parameters |
149 | * (plus mtu & mac address) must have been exchanged prior | 150 | * (plus mtu & mac address) must have been exchanged prior |
@@ -221,10 +222,14 @@ enum myri10ge_mcp_cmd_type { | |||
221 | MXGEFW_CMD_GET_MAX_RSS_QUEUES, | 222 | MXGEFW_CMD_GET_MAX_RSS_QUEUES, |
222 | MXGEFW_CMD_ENABLE_RSS_QUEUES, | 223 | MXGEFW_CMD_ENABLE_RSS_QUEUES, |
223 | /* data0 = number of slices n (0, 1, ..., n-1) to enable | 224 | /* data0 = number of slices n (0, 1, ..., n-1) to enable |
224 | * data1 = interrupt mode. 0=share one INTx/MSI, 1=use one MSI-X per queue. | 225 | * data1 = interrupt mode. |
226 | * 0=share one INTx/MSI, 1=use one MSI-X per queue. | ||
225 | * If all queues share one interrupt, the driver must have set | 227 | * If all queues share one interrupt, the driver must have set |
226 | * RSS_SHARED_INTERRUPT_DMA before enabling queues. | 228 | * RSS_SHARED_INTERRUPT_DMA before enabling queues. |
227 | */ | 229 | */ |
230 | #define MXGEFW_SLICE_INTR_MODE_SHARED 0 | ||
231 | #define MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE 1 | ||
232 | |||
228 | MXGEFW_CMD_GET_RSS_SHARED_INTERRUPT_MASK_OFFSET, | 233 | MXGEFW_CMD_GET_RSS_SHARED_INTERRUPT_MASK_OFFSET, |
229 | MXGEFW_CMD_SET_RSS_SHARED_INTERRUPT_DMA, | 234 | MXGEFW_CMD_SET_RSS_SHARED_INTERRUPT_DMA, |
230 | /* data0, data1 = bus address lsw, msw */ | 235 | /* data0, data1 = bus address lsw, msw */ |
@@ -241,10 +246,14 @@ enum myri10ge_mcp_cmd_type { | |||
241 | * 0: disable rss. nic does not distribute receive packets. | 246 | * 0: disable rss. nic does not distribute receive packets. |
242 | * 1: enable rss. nic distributes receive packets among queues. | 247 | * 1: enable rss. nic distributes receive packets among queues. |
243 | * data1 = hash type | 248 | * data1 = hash type |
244 | * 1: IPV4 | 249 | * 1: IPV4 (required by RSS) |
245 | * 2: TCP_IPV4 | 250 | * 2: TCP_IPV4 (required by RSS) |
246 | * 3: IPV4 | TCP_IPV4 | 251 | * 3: IPV4 | TCP_IPV4 (required by RSS) |
252 | * 4: source port | ||
247 | */ | 253 | */ |
254 | #define MXGEFW_RSS_HASH_TYPE_IPV4 0x1 | ||
255 | #define MXGEFW_RSS_HASH_TYPE_TCP_IPV4 0x2 | ||
256 | #define MXGEFW_RSS_HASH_TYPE_SRC_PORT 0x4 | ||
248 | 257 | ||
249 | MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, | 258 | MXGEFW_CMD_GET_MAX_TSO6_HDR_SIZE, |
250 | /* Return data = the max. size of the entire headers of a IPv6 TSO packet. | 259 | /* Return data = the max. size of the entire headers of a IPv6 TSO packet. |
@@ -260,6 +269,8 @@ enum myri10ge_mcp_cmd_type { | |||
260 | * 0: Linux/FreeBSD style (NIC default) | 269 | * 0: Linux/FreeBSD style (NIC default) |
261 | * 1: NDIS/NetBSD style | 270 | * 1: NDIS/NetBSD style |
262 | */ | 271 | */ |
272 | #define MXGEFW_TSO_MODE_LINUX 0 | ||
273 | #define MXGEFW_TSO_MODE_NDIS 1 | ||
263 | 274 | ||
264 | MXGEFW_CMD_MDIO_READ, | 275 | MXGEFW_CMD_MDIO_READ, |
265 | /* data0 = dev_addr (PMA/PMD or PCS ...), data1 = register/addr */ | 276 | /* data0 = dev_addr (PMA/PMD or PCS ...), data1 = register/addr */ |
@@ -286,6 +297,38 @@ enum myri10ge_mcp_cmd_type { | |||
286 | /* Return data = NIC memory offset of mcp_vpump_public_global */ | 297 | /* Return data = NIC memory offset of mcp_vpump_public_global */ |
287 | MXGEFW_CMD_RESET_VPUMP, | 298 | MXGEFW_CMD_RESET_VPUMP, |
288 | /* Resets the VPUMP state */ | 299 | /* Resets the VPUMP state */ |
300 | |||
301 | MXGEFW_CMD_SET_RSS_MCP_SLOT_TYPE, | ||
302 | /* data0 = mcp_slot type to use. | ||
303 | * 0 = the default 4B mcp_slot | ||
304 | * 1 = 8B mcp_slot_8 | ||
305 | */ | ||
306 | #define MXGEFW_RSS_MCP_SLOT_TYPE_MIN 0 | ||
307 | #define MXGEFW_RSS_MCP_SLOT_TYPE_WITH_HASH 1 | ||
308 | |||
309 | MXGEFW_CMD_SET_THROTTLE_FACTOR, | ||
310 | /* set the throttle factor for ethp_z8e | ||
311 | * data0 = throttle_factor | ||
312 | * throttle_factor = 256 * pcie-raw-speed / tx_speed | ||
313 | * tx_speed = 256 * pcie-raw-speed / throttle_factor | ||
314 | * | ||
315 | * For PCI-E x8: pcie-raw-speed == 16Gb/s | ||
316 | * For PCI-E x4: pcie-raw-speed == 8Gb/s | ||
317 | * | ||
318 | * ex1: throttle_factor == 0x1a0 (416), tx_speed == 1.23GB/s == 9.846 Gb/s | ||
319 | * ex2: throttle_factor == 0x200 (512), tx_speed == 1.0GB/s == 8 Gb/s | ||
320 | * | ||
321 | * with tx_boundary == 2048, max-throttle-factor == 8191 => min-speed == 500Mb/s | ||
322 | * with tx_boundary == 4096, max-throttle-factor == 4095 => min-speed == 1Gb/s | ||
323 | */ | ||
324 | |||
325 | MXGEFW_CMD_VPUMP_UP, | ||
326 | /* Allocates VPump Connection, Send Request and Zero copy buffer address tables */ | ||
327 | MXGEFW_CMD_GET_VPUMP_CLK, | ||
328 | /* Get the lanai clock */ | ||
329 | |||
330 | MXGEFW_CMD_GET_DCA_OFFSET, | ||
331 | /* offset of dca control for WDMAs */ | ||
289 | }; | 332 | }; |
290 | 333 | ||
291 | enum myri10ge_mcp_cmd_status { | 334 | enum myri10ge_mcp_cmd_status { |
@@ -302,7 +345,8 @@ enum myri10ge_mcp_cmd_status { | |||
302 | MXGEFW_CMD_ERROR_UNALIGNED, | 345 | MXGEFW_CMD_ERROR_UNALIGNED, |
303 | MXGEFW_CMD_ERROR_NO_MDIO, | 346 | MXGEFW_CMD_ERROR_NO_MDIO, |
304 | MXGEFW_CMD_ERROR_XFP_FAILURE, | 347 | MXGEFW_CMD_ERROR_XFP_FAILURE, |
305 | MXGEFW_CMD_ERROR_XFP_ABSENT | 348 | MXGEFW_CMD_ERROR_XFP_ABSENT, |
349 | MXGEFW_CMD_ERROR_BAD_PCIE_LINK | ||
306 | }; | 350 | }; |
307 | 351 | ||
308 | #define MXGEFW_OLD_IRQ_DATA_LEN 40 | 352 | #define MXGEFW_OLD_IRQ_DATA_LEN 40 |
diff --git a/drivers/net/myri10ge/myri10ge_mcp_gen_header.h b/drivers/net/myri10ge/myri10ge_mcp_gen_header.h index 16a810dd6d51..07d65c2cbb24 100644 --- a/drivers/net/myri10ge/myri10ge_mcp_gen_header.h +++ b/drivers/net/myri10ge/myri10ge_mcp_gen_header.h | |||
@@ -1,30 +1,6 @@ | |||
1 | #ifndef __MYRI10GE_MCP_GEN_HEADER_H__ | 1 | #ifndef __MYRI10GE_MCP_GEN_HEADER_H__ |
2 | #define __MYRI10GE_MCP_GEN_HEADER_H__ | 2 | #define __MYRI10GE_MCP_GEN_HEADER_H__ |
3 | 3 | ||
4 | /* this file define a standard header used as a first entry point to | ||
5 | * exchange information between firmware/driver and driver. The | ||
6 | * header structure can be anywhere in the mcp. It will usually be in | ||
7 | * the .data section, because some fields needs to be initialized at | ||
8 | * compile time. | ||
9 | * The 32bit word at offset MX_HEADER_PTR_OFFSET in the mcp must | ||
10 | * contains the location of the header. | ||
11 | * | ||
12 | * Typically a MCP will start with the following: | ||
13 | * .text | ||
14 | * .space 52 ! to help catch MEMORY_INT errors | ||
15 | * bt start ! jump to real code | ||
16 | * nop | ||
17 | * .long _gen_mcp_header | ||
18 | * | ||
19 | * The source will have a definition like: | ||
20 | * | ||
21 | * mcp_gen_header_t gen_mcp_header = { | ||
22 | * .header_length = sizeof(mcp_gen_header_t), | ||
23 | * .mcp_type = MCP_TYPE_XXX, | ||
24 | * .version = "something $Id: mcp_gen_header.h,v 1.2 2006/05/13 10:04:35 bgoglin Exp $", | ||
25 | * .mcp_globals = (unsigned)&Globals | ||
26 | * }; | ||
27 | */ | ||
28 | 4 | ||
29 | #define MCP_HEADER_PTR_OFFSET 0x3c | 5 | #define MCP_HEADER_PTR_OFFSET 0x3c |
30 | 6 | ||
@@ -32,13 +8,14 @@ | |||
32 | #define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */ | 8 | #define MCP_TYPE_PCIE 0x70636965 /* "PCIE" pcie-only MCP */ |
33 | #define MCP_TYPE_ETH 0x45544820 /* "ETH " */ | 9 | #define MCP_TYPE_ETH 0x45544820 /* "ETH " */ |
34 | #define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */ | 10 | #define MCP_TYPE_MCP0 0x4d435030 /* "MCP0" */ |
11 | #define MCP_TYPE_DFLT 0x20202020 /* " " */ | ||
35 | 12 | ||
36 | struct mcp_gen_header { | 13 | struct mcp_gen_header { |
37 | /* the first 4 fields are filled at compile time */ | 14 | /* the first 4 fields are filled at compile time */ |
38 | unsigned header_length; | 15 | unsigned header_length; |
39 | __be32 mcp_type; | 16 | __be32 mcp_type; |
40 | char version[128]; | 17 | char version[128]; |
41 | unsigned mcp_globals; /* pointer to mcp-type specific structure */ | 18 | unsigned mcp_private; /* pointer to mcp-type specific structure */ |
42 | 19 | ||
43 | /* filled by the MCP at run-time */ | 20 | /* filled by the MCP at run-time */ |
44 | unsigned sram_size; | 21 | unsigned sram_size; |
@@ -53,6 +30,18 @@ struct mcp_gen_header { | |||
53 | * | 30 | * |
54 | * Never remove any field. Keep everything naturally align. | 31 | * Never remove any field. Keep everything naturally align. |
55 | */ | 32 | */ |
33 | |||
34 | /* Specifies if the running mcp is mcp0, 1, or 2. */ | ||
35 | unsigned char mcp_index; | ||
36 | unsigned char disable_rabbit; | ||
37 | unsigned char unaligned_tlp; | ||
38 | unsigned char pad1; | ||
39 | unsigned counters_addr; | ||
40 | unsigned copy_block_info; /* for small mcps loaded with "lload -d" */ | ||
41 | unsigned short handoff_id_major; /* must be equal */ | ||
42 | unsigned short handoff_id_caps; /* bitfield: new mcp must have superset */ | ||
43 | unsigned msix_table_addr; /* start address of msix table in firmware */ | ||
44 | /* 8 */ | ||
56 | }; | 45 | }; |
57 | 46 | ||
58 | #endif /* __MYRI10GE_MCP_GEN_HEADER_H__ */ | 47 | #endif /* __MYRI10GE_MCP_GEN_HEADER_H__ */ |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index 4009c4ce96b4..918f802fe089 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* niu.c: Neptune ethernet driver. | 1 | /* niu.c: Neptune ethernet driver. |
2 | * | 2 | * |
3 | * Copyright (C) 2007 David S. Miller (davem@davemloft.net) | 3 | * Copyright (C) 2007, 2008 David S. Miller (davem@davemloft.net) |
4 | */ | 4 | */ |
5 | 5 | ||
6 | #include <linux/module.h> | 6 | #include <linux/module.h> |
@@ -33,8 +33,8 @@ | |||
33 | 33 | ||
34 | #define DRV_MODULE_NAME "niu" | 34 | #define DRV_MODULE_NAME "niu" |
35 | #define PFX DRV_MODULE_NAME ": " | 35 | #define PFX DRV_MODULE_NAME ": " |
36 | #define DRV_MODULE_VERSION "0.8" | 36 | #define DRV_MODULE_VERSION "0.9" |
37 | #define DRV_MODULE_RELDATE "April 24, 2008" | 37 | #define DRV_MODULE_RELDATE "May 4, 2008" |
38 | 38 | ||
39 | static char version[] __devinitdata = | 39 | static char version[] __devinitdata = |
40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; | 40 | DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n"; |
@@ -865,7 +865,6 @@ static int link_status_1g_serdes(struct niu *np, int *link_up_p) | |||
865 | return 0; | 865 | return 0; |
866 | } | 866 | } |
867 | 867 | ||
868 | |||
869 | static int link_status_10g_serdes(struct niu *np, int *link_up_p) | 868 | static int link_status_10g_serdes(struct niu *np, int *link_up_p) |
870 | { | 869 | { |
871 | unsigned long flags; | 870 | unsigned long flags; |
@@ -900,7 +899,6 @@ static int link_status_10g_serdes(struct niu *np, int *link_up_p) | |||
900 | return 0; | 899 | return 0; |
901 | } | 900 | } |
902 | 901 | ||
903 | |||
904 | static int link_status_1g_rgmii(struct niu *np, int *link_up_p) | 902 | static int link_status_1g_rgmii(struct niu *np, int *link_up_p) |
905 | { | 903 | { |
906 | struct niu_link_config *lp = &np->link_config; | 904 | struct niu_link_config *lp = &np->link_config; |
@@ -957,7 +955,6 @@ out: | |||
957 | return err; | 955 | return err; |
958 | } | 956 | } |
959 | 957 | ||
960 | |||
961 | static int bcm8704_reset(struct niu *np) | 958 | static int bcm8704_reset(struct niu *np) |
962 | { | 959 | { |
963 | int err, limit; | 960 | int err, limit; |
@@ -1357,8 +1354,6 @@ static int mii_reset(struct niu *np) | |||
1357 | return 0; | 1354 | return 0; |
1358 | } | 1355 | } |
1359 | 1356 | ||
1360 | |||
1361 | |||
1362 | static int xcvr_init_1g_rgmii(struct niu *np) | 1357 | static int xcvr_init_1g_rgmii(struct niu *np) |
1363 | { | 1358 | { |
1364 | int err; | 1359 | int err; |
@@ -1419,7 +1414,6 @@ static int xcvr_init_1g_rgmii(struct niu *np) | |||
1419 | return 0; | 1414 | return 0; |
1420 | } | 1415 | } |
1421 | 1416 | ||
1422 | |||
1423 | static int mii_init_common(struct niu *np) | 1417 | static int mii_init_common(struct niu *np) |
1424 | { | 1418 | { |
1425 | struct niu_link_config *lp = &np->link_config; | 1419 | struct niu_link_config *lp = &np->link_config; |
@@ -7008,31 +7002,20 @@ static int __devinit niu_phy_type_prop_decode(struct niu *np, | |||
7008 | return 0; | 7002 | return 0; |
7009 | } | 7003 | } |
7010 | 7004 | ||
7011 | /* niu board models have a trailing dash version incremented | ||
7012 | * with HW rev change. Need to ingnore the dash version while | ||
7013 | * checking for match | ||
7014 | * | ||
7015 | * for example, for the 10G card the current vpd.board_model | ||
7016 | * is 501-5283-04, of which -04 is the dash version and have | ||
7017 | * to be ignored | ||
7018 | */ | ||
7019 | static int niu_board_model_match(struct niu *np, const char *model) | ||
7020 | { | ||
7021 | return !strncmp(np->vpd.board_model, model, strlen(model)); | ||
7022 | } | ||
7023 | |||
7024 | static int niu_pci_vpd_get_nports(struct niu *np) | 7005 | static int niu_pci_vpd_get_nports(struct niu *np) |
7025 | { | 7006 | { |
7026 | int ports = 0; | 7007 | int ports = 0; |
7027 | 7008 | ||
7028 | if ((niu_board_model_match(np, NIU_QGC_LP_BM_STR)) || | 7009 | if ((!strcmp(np->vpd.model, NIU_QGC_LP_MDL_STR)) || |
7029 | (niu_board_model_match(np, NIU_QGC_PEM_BM_STR)) || | 7010 | (!strcmp(np->vpd.model, NIU_QGC_PEM_MDL_STR)) || |
7030 | (niu_board_model_match(np, NIU_ALONSO_BM_STR))) { | 7011 | (!strcmp(np->vpd.model, NIU_MARAMBA_MDL_STR)) || |
7012 | (!strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) || | ||
7013 | (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR))) { | ||
7031 | ports = 4; | 7014 | ports = 4; |
7032 | } else if ((niu_board_model_match(np, NIU_2XGF_LP_BM_STR)) || | 7015 | } else if ((!strcmp(np->vpd.model, NIU_2XGF_LP_MDL_STR)) || |
7033 | (niu_board_model_match(np, NIU_2XGF_PEM_BM_STR)) || | 7016 | (!strcmp(np->vpd.model, NIU_2XGF_PEM_MDL_STR)) || |
7034 | (niu_board_model_match(np, NIU_FOXXY_BM_STR)) || | 7017 | (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) || |
7035 | (niu_board_model_match(np, NIU_2XGF_MRVL_BM_STR))) { | 7018 | (!strcmp(np->vpd.model, NIU_2XGF_MRVL_MDL_STR))) { |
7036 | ports = 2; | 7019 | ports = 2; |
7037 | } | 7020 | } |
7038 | 7021 | ||
@@ -7053,8 +7036,8 @@ static void __devinit niu_pci_vpd_validate(struct niu *np) | |||
7053 | return; | 7036 | return; |
7054 | } | 7037 | } |
7055 | 7038 | ||
7056 | if (!strcmp(np->vpd.model, "SUNW,CP3220") || | 7039 | if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || |
7057 | !strcmp(np->vpd.model, "SUNW,CP3260")) { | 7040 | !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { |
7058 | np->flags |= NIU_FLAGS_10G; | 7041 | np->flags |= NIU_FLAGS_10G; |
7059 | np->flags &= ~NIU_FLAGS_FIBER; | 7042 | np->flags &= ~NIU_FLAGS_FIBER; |
7060 | np->flags |= NIU_FLAGS_XCVR_SERDES; | 7043 | np->flags |= NIU_FLAGS_XCVR_SERDES; |
@@ -7065,7 +7048,7 @@ static void __devinit niu_pci_vpd_validate(struct niu *np) | |||
7065 | } | 7048 | } |
7066 | if (np->flags & NIU_FLAGS_10G) | 7049 | if (np->flags & NIU_FLAGS_10G) |
7067 | np->mac_xcvr = MAC_XCVR_XPCS; | 7050 | np->mac_xcvr = MAC_XCVR_XPCS; |
7068 | } else if (niu_board_model_match(np, NIU_FOXXY_BM_STR)) { | 7051 | } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { |
7069 | np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | | 7052 | np->flags |= (NIU_FLAGS_10G | NIU_FLAGS_FIBER | |
7070 | NIU_FLAGS_HOTPLUG_PHY); | 7053 | NIU_FLAGS_HOTPLUG_PHY); |
7071 | } else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { | 7054 | } else if (niu_phy_type_prop_decode(np, np->vpd.phy_type)) { |
@@ -7264,8 +7247,11 @@ static int __devinit niu_get_and_validate_port(struct niu *np) | |||
7264 | parent->num_ports = nr64(ESPC_NUM_PORTS_MACS) & | 7247 | parent->num_ports = nr64(ESPC_NUM_PORTS_MACS) & |
7265 | ESPC_NUM_PORTS_MACS_VAL; | 7248 | ESPC_NUM_PORTS_MACS_VAL; |
7266 | 7249 | ||
7250 | /* All of the current probing methods fail on | ||
7251 | * Maramba on-board parts. | ||
7252 | */ | ||
7267 | if (!parent->num_ports) | 7253 | if (!parent->num_ports) |
7268 | return -ENODEV; | 7254 | parent->num_ports = 4; |
7269 | } | 7255 | } |
7270 | } | 7256 | } |
7271 | } | 7257 | } |
@@ -7538,8 +7524,8 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent) | |||
7538 | u32 val; | 7524 | u32 val; |
7539 | int err; | 7525 | int err; |
7540 | 7526 | ||
7541 | if (!strcmp(np->vpd.model, "SUNW,CP3220") || | 7527 | if (!strcmp(np->vpd.model, NIU_ALONSO_MDL_STR) || |
7542 | !strcmp(np->vpd.model, "SUNW,CP3260")) { | 7528 | !strcmp(np->vpd.model, NIU_KIMI_MDL_STR)) { |
7543 | num_10g = 0; | 7529 | num_10g = 0; |
7544 | num_1g = 2; | 7530 | num_1g = 2; |
7545 | parent->plat_type = PLAT_TYPE_ATCA_CP3220; | 7531 | parent->plat_type = PLAT_TYPE_ATCA_CP3220; |
@@ -7548,7 +7534,7 @@ static int __devinit walk_phys(struct niu *np, struct niu_parent *parent) | |||
7548 | phy_encode(PORT_TYPE_1G, 1) | | 7534 | phy_encode(PORT_TYPE_1G, 1) | |
7549 | phy_encode(PORT_TYPE_1G, 2) | | 7535 | phy_encode(PORT_TYPE_1G, 2) | |
7550 | phy_encode(PORT_TYPE_1G, 3)); | 7536 | phy_encode(PORT_TYPE_1G, 3)); |
7551 | } else if (niu_board_model_match(np, NIU_FOXXY_BM_STR)) { | 7537 | } else if (!strcmp(np->vpd.model, NIU_FOXXY_MDL_STR)) { |
7552 | num_10g = 2; | 7538 | num_10g = 2; |
7553 | num_1g = 0; | 7539 | num_1g = 0; |
7554 | parent->num_ports = 2; | 7540 | parent->num_ports = 2; |
@@ -7943,6 +7929,7 @@ static int __devinit niu_get_of_props(struct niu *np) | |||
7943 | struct device_node *dp; | 7929 | struct device_node *dp; |
7944 | const char *phy_type; | 7930 | const char *phy_type; |
7945 | const u8 *mac_addr; | 7931 | const u8 *mac_addr; |
7932 | const char *model; | ||
7946 | int prop_len; | 7933 | int prop_len; |
7947 | 7934 | ||
7948 | if (np->parent->plat_type == PLAT_TYPE_NIU) | 7935 | if (np->parent->plat_type == PLAT_TYPE_NIU) |
@@ -7997,6 +7984,11 @@ static int __devinit niu_get_of_props(struct niu *np) | |||
7997 | 7984 | ||
7998 | memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len); | 7985 | memcpy(dev->dev_addr, dev->perm_addr, dev->addr_len); |
7999 | 7986 | ||
7987 | model = of_get_property(dp, "model", &prop_len); | ||
7988 | |||
7989 | if (model) | ||
7990 | strcpy(np->vpd.model, model); | ||
7991 | |||
8000 | return 0; | 7992 | return 0; |
8001 | #else | 7993 | #else |
8002 | return -EINVAL; | 7994 | return -EINVAL; |
diff --git a/drivers/net/niu.h b/drivers/net/niu.h index 101a3f1a8ec8..c6fa883daa22 100644 --- a/drivers/net/niu.h +++ b/drivers/net/niu.h | |||
@@ -2946,6 +2946,15 @@ struct rx_ring_info { | |||
2946 | #define NIU_ALONSO_BM_STR "373-0202" | 2946 | #define NIU_ALONSO_BM_STR "373-0202" |
2947 | #define NIU_FOXXY_BM_STR "501-7961" | 2947 | #define NIU_FOXXY_BM_STR "501-7961" |
2948 | #define NIU_2XGF_MRVL_BM_STR "SK-6E82" | 2948 | #define NIU_2XGF_MRVL_BM_STR "SK-6E82" |
2949 | #define NIU_QGC_LP_MDL_STR "SUNW,pcie-qgc" | ||
2950 | #define NIU_2XGF_LP_MDL_STR "SUNW,pcie-2xgf" | ||
2951 | #define NIU_QGC_PEM_MDL_STR "SUNW,pcie-qgc-pem" | ||
2952 | #define NIU_2XGF_PEM_MDL_STR "SUNW,pcie-2xgf-pem" | ||
2953 | #define NIU_ALONSO_MDL_STR "SUNW,CP3220" | ||
2954 | #define NIU_KIMI_MDL_STR "SUNW,CP3260" | ||
2955 | #define NIU_MARAMBA_MDL_STR "SUNW,pcie-neptune" | ||
2956 | #define NIU_FOXXY_MDL_STR "SUNW,pcie-rfem" | ||
2957 | #define NIU_2XGF_MRVL_MDL_STR "SysKonnect,pcie-2xgf" | ||
2949 | 2958 | ||
2950 | #define NIU_VPD_MIN_MAJOR 3 | 2959 | #define NIU_VPD_MIN_MAJOR 3 |
2951 | #define NIU_VPD_MIN_MINOR 4 | 2960 | #define NIU_VPD_MIN_MINOR 4 |
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index d0d5585114b0..81fd85214b98 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -22,12 +22,8 @@ | |||
22 | *************************************************************************/ | 22 | *************************************************************************/ |
23 | 23 | ||
24 | #define DRV_NAME "pcnet32" | 24 | #define DRV_NAME "pcnet32" |
25 | #ifdef CONFIG_PCNET32_NAPI | 25 | #define DRV_VERSION "1.35" |
26 | #define DRV_VERSION "1.34-NAPI" | 26 | #define DRV_RELDATE "21.Apr.2008" |
27 | #else | ||
28 | #define DRV_VERSION "1.34" | ||
29 | #endif | ||
30 | #define DRV_RELDATE "14.Aug.2007" | ||
31 | #define PFX DRV_NAME ": " | 27 | #define PFX DRV_NAME ": " |
32 | 28 | ||
33 | static const char *const version = | 29 | static const char *const version = |
@@ -445,30 +441,24 @@ static struct pcnet32_access pcnet32_dwio = { | |||
445 | 441 | ||
446 | static void pcnet32_netif_stop(struct net_device *dev) | 442 | static void pcnet32_netif_stop(struct net_device *dev) |
447 | { | 443 | { |
448 | #ifdef CONFIG_PCNET32_NAPI | ||
449 | struct pcnet32_private *lp = netdev_priv(dev); | 444 | struct pcnet32_private *lp = netdev_priv(dev); |
450 | #endif | 445 | |
451 | dev->trans_start = jiffies; | 446 | dev->trans_start = jiffies; |
452 | #ifdef CONFIG_PCNET32_NAPI | ||
453 | napi_disable(&lp->napi); | 447 | napi_disable(&lp->napi); |
454 | #endif | ||
455 | netif_tx_disable(dev); | 448 | netif_tx_disable(dev); |
456 | } | 449 | } |
457 | 450 | ||
458 | static void pcnet32_netif_start(struct net_device *dev) | 451 | static void pcnet32_netif_start(struct net_device *dev) |
459 | { | 452 | { |
460 | #ifdef CONFIG_PCNET32_NAPI | ||
461 | struct pcnet32_private *lp = netdev_priv(dev); | 453 | struct pcnet32_private *lp = netdev_priv(dev); |
462 | ulong ioaddr = dev->base_addr; | 454 | ulong ioaddr = dev->base_addr; |
463 | u16 val; | 455 | u16 val; |
464 | #endif | 456 | |
465 | netif_wake_queue(dev); | 457 | netif_wake_queue(dev); |
466 | #ifdef CONFIG_PCNET32_NAPI | ||
467 | val = lp->a.read_csr(ioaddr, CSR3); | 458 | val = lp->a.read_csr(ioaddr, CSR3); |
468 | val &= 0x00ff; | 459 | val &= 0x00ff; |
469 | lp->a.write_csr(ioaddr, CSR3, val); | 460 | lp->a.write_csr(ioaddr, CSR3, val); |
470 | napi_enable(&lp->napi); | 461 | napi_enable(&lp->napi); |
471 | #endif | ||
472 | } | 462 | } |
473 | 463 | ||
474 | /* | 464 | /* |
@@ -911,11 +901,7 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) | |||
911 | rc = 1; /* default to fail */ | 901 | rc = 1; /* default to fail */ |
912 | 902 | ||
913 | if (netif_running(dev)) | 903 | if (netif_running(dev)) |
914 | #ifdef CONFIG_PCNET32_NAPI | ||
915 | pcnet32_netif_stop(dev); | 904 | pcnet32_netif_stop(dev); |
916 | #else | ||
917 | pcnet32_close(dev); | ||
918 | #endif | ||
919 | 905 | ||
920 | spin_lock_irqsave(&lp->lock, flags); | 906 | spin_lock_irqsave(&lp->lock, flags); |
921 | lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ | 907 | lp->a.write_csr(ioaddr, CSR0, CSR0_STOP); /* stop the chip */ |
@@ -1046,7 +1032,6 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) | |||
1046 | x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ | 1032 | x = a->read_bcr(ioaddr, 32); /* reset internal loopback */ |
1047 | a->write_bcr(ioaddr, 32, (x & ~0x0002)); | 1033 | a->write_bcr(ioaddr, 32, (x & ~0x0002)); |
1048 | 1034 | ||
1049 | #ifdef CONFIG_PCNET32_NAPI | ||
1050 | if (netif_running(dev)) { | 1035 | if (netif_running(dev)) { |
1051 | pcnet32_netif_start(dev); | 1036 | pcnet32_netif_start(dev); |
1052 | pcnet32_restart(dev, CSR0_NORMAL); | 1037 | pcnet32_restart(dev, CSR0_NORMAL); |
@@ -1055,16 +1040,6 @@ static int pcnet32_loopback_test(struct net_device *dev, uint64_t * data1) | |||
1055 | lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ | 1040 | lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ |
1056 | } | 1041 | } |
1057 | spin_unlock_irqrestore(&lp->lock, flags); | 1042 | spin_unlock_irqrestore(&lp->lock, flags); |
1058 | #else | ||
1059 | if (netif_running(dev)) { | ||
1060 | spin_unlock_irqrestore(&lp->lock, flags); | ||
1061 | pcnet32_open(dev); | ||
1062 | } else { | ||
1063 | pcnet32_purge_rx_ring(dev); | ||
1064 | lp->a.write_bcr(ioaddr, 20, 4); /* return to 16bit mode */ | ||
1065 | spin_unlock_irqrestore(&lp->lock, flags); | ||
1066 | } | ||
1067 | #endif | ||
1068 | 1043 | ||
1069 | return (rc); | 1044 | return (rc); |
1070 | } /* end pcnet32_loopback_test */ | 1045 | } /* end pcnet32_loopback_test */ |
@@ -1270,11 +1245,7 @@ static void pcnet32_rx_entry(struct net_device *dev, | |||
1270 | } | 1245 | } |
1271 | dev->stats.rx_bytes += skb->len; | 1246 | dev->stats.rx_bytes += skb->len; |
1272 | skb->protocol = eth_type_trans(skb, dev); | 1247 | skb->protocol = eth_type_trans(skb, dev); |
1273 | #ifdef CONFIG_PCNET32_NAPI | ||
1274 | netif_receive_skb(skb); | 1248 | netif_receive_skb(skb); |
1275 | #else | ||
1276 | netif_rx(skb); | ||
1277 | #endif | ||
1278 | dev->last_rx = jiffies; | 1249 | dev->last_rx = jiffies; |
1279 | dev->stats.rx_packets++; | 1250 | dev->stats.rx_packets++; |
1280 | return; | 1251 | return; |
@@ -1403,7 +1374,6 @@ static int pcnet32_tx(struct net_device *dev) | |||
1403 | return must_restart; | 1374 | return must_restart; |
1404 | } | 1375 | } |
1405 | 1376 | ||
1406 | #ifdef CONFIG_PCNET32_NAPI | ||
1407 | static int pcnet32_poll(struct napi_struct *napi, int budget) | 1377 | static int pcnet32_poll(struct napi_struct *napi, int budget) |
1408 | { | 1378 | { |
1409 | struct pcnet32_private *lp = container_of(napi, struct pcnet32_private, napi); | 1379 | struct pcnet32_private *lp = container_of(napi, struct pcnet32_private, napi); |
@@ -1442,7 +1412,6 @@ static int pcnet32_poll(struct napi_struct *napi, int budget) | |||
1442 | } | 1412 | } |
1443 | return work_done; | 1413 | return work_done; |
1444 | } | 1414 | } |
1445 | #endif | ||
1446 | 1415 | ||
1447 | #define PCNET32_REGS_PER_PHY 32 | 1416 | #define PCNET32_REGS_PER_PHY 32 |
1448 | #define PCNET32_MAX_PHYS 32 | 1417 | #define PCNET32_MAX_PHYS 32 |
@@ -1864,9 +1833,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1864 | /* napi.weight is used in both the napi and non-napi cases */ | 1833 | /* napi.weight is used in both the napi and non-napi cases */ |
1865 | lp->napi.weight = lp->rx_ring_size / 2; | 1834 | lp->napi.weight = lp->rx_ring_size / 2; |
1866 | 1835 | ||
1867 | #ifdef CONFIG_PCNET32_NAPI | ||
1868 | netif_napi_add(dev, &lp->napi, pcnet32_poll, lp->rx_ring_size / 2); | 1836 | netif_napi_add(dev, &lp->napi, pcnet32_poll, lp->rx_ring_size / 2); |
1869 | #endif | ||
1870 | 1837 | ||
1871 | if (fdx && !(lp->options & PCNET32_PORT_ASEL) && | 1838 | if (fdx && !(lp->options & PCNET32_PORT_ASEL) && |
1872 | ((cards_found >= MAX_UNITS) || full_duplex[cards_found])) | 1839 | ((cards_found >= MAX_UNITS) || full_duplex[cards_found])) |
@@ -2297,9 +2264,7 @@ static int pcnet32_open(struct net_device *dev) | |||
2297 | goto err_free_ring; | 2264 | goto err_free_ring; |
2298 | } | 2265 | } |
2299 | 2266 | ||
2300 | #ifdef CONFIG_PCNET32_NAPI | ||
2301 | napi_enable(&lp->napi); | 2267 | napi_enable(&lp->napi); |
2302 | #endif | ||
2303 | 2268 | ||
2304 | /* Re-initialize the PCNET32, and start it when done. */ | 2269 | /* Re-initialize the PCNET32, and start it when done. */ |
2305 | lp->a.write_csr(ioaddr, 1, (lp->init_dma_addr & 0xffff)); | 2270 | lp->a.write_csr(ioaddr, 1, (lp->init_dma_addr & 0xffff)); |
@@ -2623,7 +2588,6 @@ pcnet32_interrupt(int irq, void *dev_id) | |||
2623 | dev->name, csr0); | 2588 | dev->name, csr0); |
2624 | /* unlike for the lance, there is no restart needed */ | 2589 | /* unlike for the lance, there is no restart needed */ |
2625 | } | 2590 | } |
2626 | #ifdef CONFIG_PCNET32_NAPI | ||
2627 | if (netif_rx_schedule_prep(dev, &lp->napi)) { | 2591 | if (netif_rx_schedule_prep(dev, &lp->napi)) { |
2628 | u16 val; | 2592 | u16 val; |
2629 | /* set interrupt masks */ | 2593 | /* set interrupt masks */ |
@@ -2634,24 +2598,9 @@ pcnet32_interrupt(int irq, void *dev_id) | |||
2634 | __netif_rx_schedule(dev, &lp->napi); | 2598 | __netif_rx_schedule(dev, &lp->napi); |
2635 | break; | 2599 | break; |
2636 | } | 2600 | } |
2637 | #else | ||
2638 | pcnet32_rx(dev, lp->napi.weight); | ||
2639 | if (pcnet32_tx(dev)) { | ||
2640 | /* reset the chip to clear the error condition, then restart */ | ||
2641 | lp->a.reset(ioaddr); | ||
2642 | lp->a.write_csr(ioaddr, CSR4, 0x0915); /* auto tx pad */ | ||
2643 | pcnet32_restart(dev, CSR0_START); | ||
2644 | netif_wake_queue(dev); | ||
2645 | } | ||
2646 | #endif | ||
2647 | csr0 = lp->a.read_csr(ioaddr, CSR0); | 2601 | csr0 = lp->a.read_csr(ioaddr, CSR0); |
2648 | } | 2602 | } |
2649 | 2603 | ||
2650 | #ifndef CONFIG_PCNET32_NAPI | ||
2651 | /* Set interrupt enable. */ | ||
2652 | lp->a.write_csr(ioaddr, CSR0, CSR0_INTEN); | ||
2653 | #endif | ||
2654 | |||
2655 | if (netif_msg_intr(lp)) | 2604 | if (netif_msg_intr(lp)) |
2656 | printk(KERN_DEBUG "%s: exiting interrupt, csr0=%#4.4x.\n", | 2605 | printk(KERN_DEBUG "%s: exiting interrupt, csr0=%#4.4x.\n", |
2657 | dev->name, lp->a.read_csr(ioaddr, CSR0)); | 2606 | dev->name, lp->a.read_csr(ioaddr, CSR0)); |
@@ -2670,9 +2619,7 @@ static int pcnet32_close(struct net_device *dev) | |||
2670 | del_timer_sync(&lp->watchdog_timer); | 2619 | del_timer_sync(&lp->watchdog_timer); |
2671 | 2620 | ||
2672 | netif_stop_queue(dev); | 2621 | netif_stop_queue(dev); |
2673 | #ifdef CONFIG_PCNET32_NAPI | ||
2674 | napi_disable(&lp->napi); | 2622 | napi_disable(&lp->napi); |
2675 | #endif | ||
2676 | 2623 | ||
2677 | spin_lock_irqsave(&lp->lock, flags); | 2624 | spin_lock_irqsave(&lp->lock, flags); |
2678 | 2625 | ||
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 3c18bb594957..45cc2914d347 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c | |||
@@ -547,7 +547,7 @@ static void phy_force_reduction(struct phy_device *phydev) | |||
547 | * Must not be called from interrupt context, or while the | 547 | * Must not be called from interrupt context, or while the |
548 | * phydev->lock is held. | 548 | * phydev->lock is held. |
549 | */ | 549 | */ |
550 | void phy_error(struct phy_device *phydev) | 550 | static void phy_error(struct phy_device *phydev) |
551 | { | 551 | { |
552 | mutex_lock(&phydev->lock); | 552 | mutex_lock(&phydev->lock); |
553 | phydev->state = PHY_HALTED; | 553 | phydev->state = PHY_HALTED; |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index d3207c0da895..1f4ca2b54a73 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -2458,6 +2458,7 @@ ppp_create_interface(int unit, int *retp) | |||
2458 | 2458 | ||
2459 | out3: | 2459 | out3: |
2460 | atomic_dec(&ppp_unit_count); | 2460 | atomic_dec(&ppp_unit_count); |
2461 | unregister_netdev(dev); | ||
2461 | out2: | 2462 | out2: |
2462 | mutex_unlock(&all_ppp_mutex); | 2463 | mutex_unlock(&all_ppp_mutex); |
2463 | free_netdev(dev); | 2464 | free_netdev(dev); |
diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c index 244d7830c92a..79359919335b 100644 --- a/drivers/net/pppol2tp.c +++ b/drivers/net/pppol2tp.c | |||
@@ -1621,9 +1621,16 @@ out_no_ppp: | |||
1621 | end: | 1621 | end: |
1622 | release_sock(sk); | 1622 | release_sock(sk); |
1623 | 1623 | ||
1624 | if (error != 0) | 1624 | if (error != 0) { |
1625 | PRINTK(session ? session->debug : -1, PPPOL2TP_MSG_CONTROL, KERN_WARNING, | 1625 | if (session) |
1626 | "%s: connect failed: %d\n", session->name, error); | 1626 | PRINTK(session->debug, |
1627 | PPPOL2TP_MSG_CONTROL, KERN_WARNING, | ||
1628 | "%s: connect failed: %d\n", | ||
1629 | session->name, error); | ||
1630 | else | ||
1631 | PRINTK(-1, PPPOL2TP_MSG_CONTROL, KERN_WARNING, | ||
1632 | "connect failed: %d\n", error); | ||
1633 | } | ||
1627 | 1634 | ||
1628 | return error; | 1635 | return error; |
1629 | } | 1636 | } |
diff --git a/drivers/net/ps3_gelic_wireless.c b/drivers/net/ps3_gelic_wireless.c index 0d32123085e9..1dae1f2ed813 100644 --- a/drivers/net/ps3_gelic_wireless.c +++ b/drivers/net/ps3_gelic_wireless.c | |||
@@ -2474,6 +2474,8 @@ static void gelic_wl_free(struct gelic_wl_info *wl) | |||
2474 | 2474 | ||
2475 | pr_debug("%s: <-\n", __func__); | 2475 | pr_debug("%s: <-\n", __func__); |
2476 | 2476 | ||
2477 | free_page((unsigned long)wl->buf); | ||
2478 | |||
2477 | pr_debug("%s: destroy queues\n", __func__); | 2479 | pr_debug("%s: destroy queues\n", __func__); |
2478 | destroy_workqueue(wl->eurus_cmd_queue); | 2480 | destroy_workqueue(wl->eurus_cmd_queue); |
2479 | destroy_workqueue(wl->event_queue); | 2481 | destroy_workqueue(wl->event_queue); |
diff --git a/drivers/net/sfc/Makefile b/drivers/net/sfc/Makefile index 0f023447eafd..1d2daeec7ac1 100644 --- a/drivers/net/sfc/Makefile +++ b/drivers/net/sfc/Makefile | |||
@@ -1,5 +1,5 @@ | |||
1 | sfc-y += efx.o falcon.o tx.o rx.o falcon_xmac.o \ | 1 | sfc-y += efx.o falcon.o tx.o rx.o falcon_xmac.o \ |
2 | i2c-direct.o ethtool.o xfp_phy.o mdio_10g.o \ | 2 | i2c-direct.o selftest.o ethtool.o xfp_phy.o \ |
3 | tenxpress.o boards.o sfe4001.o | 3 | mdio_10g.o tenxpress.o boards.o sfe4001.o |
4 | 4 | ||
5 | obj-$(CONFIG_SFC) += sfc.o | 5 | obj-$(CONFIG_SFC) += sfc.o |
diff --git a/drivers/net/sfc/boards.h b/drivers/net/sfc/boards.h index f56341d428e1..695764dc2e64 100644 --- a/drivers/net/sfc/boards.h +++ b/drivers/net/sfc/boards.h | |||
@@ -22,5 +22,7 @@ enum efx_board_type { | |||
22 | extern int efx_set_board_info(struct efx_nic *efx, u16 revision_info); | 22 | extern int efx_set_board_info(struct efx_nic *efx, u16 revision_info); |
23 | extern int sfe4001_poweron(struct efx_nic *efx); | 23 | extern int sfe4001_poweron(struct efx_nic *efx); |
24 | extern void sfe4001_poweroff(struct efx_nic *efx); | 24 | extern void sfe4001_poweroff(struct efx_nic *efx); |
25 | /* Are we putting the PHY into flash config mode */ | ||
26 | extern unsigned int sfe4001_phy_flash_cfg; | ||
25 | 27 | ||
26 | #endif | 28 | #endif |
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index 59edcf793c19..418f2e53a95b 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -1873,6 +1873,7 @@ static int efx_init_struct(struct efx_nic *efx, struct efx_nic_type *type, | |||
1873 | tx_queue->queue = i; | 1873 | tx_queue->queue = i; |
1874 | tx_queue->buffer = NULL; | 1874 | tx_queue->buffer = NULL; |
1875 | tx_queue->channel = &efx->channel[0]; /* for safety */ | 1875 | tx_queue->channel = &efx->channel[0]; /* for safety */ |
1876 | tx_queue->tso_headers_free = NULL; | ||
1876 | } | 1877 | } |
1877 | for (i = 0; i < EFX_MAX_RX_QUEUES; i++) { | 1878 | for (i = 0; i < EFX_MAX_RX_QUEUES; i++) { |
1878 | rx_queue = &efx->rx_queue[i]; | 1879 | rx_queue = &efx->rx_queue[i]; |
@@ -2071,7 +2072,8 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev, | |||
2071 | net_dev = alloc_etherdev(sizeof(*efx)); | 2072 | net_dev = alloc_etherdev(sizeof(*efx)); |
2072 | if (!net_dev) | 2073 | if (!net_dev) |
2073 | return -ENOMEM; | 2074 | return -ENOMEM; |
2074 | net_dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_HIGHDMA; | 2075 | net_dev->features |= (NETIF_F_IP_CSUM | NETIF_F_SG | |
2076 | NETIF_F_HIGHDMA | NETIF_F_TSO); | ||
2075 | if (lro) | 2077 | if (lro) |
2076 | net_dev->features |= NETIF_F_LRO; | 2078 | net_dev->features |= NETIF_F_LRO; |
2077 | efx = net_dev->priv; | 2079 | efx = net_dev->priv; |
diff --git a/drivers/net/sfc/enum.h b/drivers/net/sfc/enum.h index 43663a4619da..c53290d08e2b 100644 --- a/drivers/net/sfc/enum.h +++ b/drivers/net/sfc/enum.h | |||
@@ -10,6 +10,55 @@ | |||
10 | #ifndef EFX_ENUM_H | 10 | #ifndef EFX_ENUM_H |
11 | #define EFX_ENUM_H | 11 | #define EFX_ENUM_H |
12 | 12 | ||
13 | /** | ||
14 | * enum efx_loopback_mode - loopback modes | ||
15 | * @LOOPBACK_NONE: no loopback | ||
16 | * @LOOPBACK_XGMII: loopback within MAC at XGMII level | ||
17 | * @LOOPBACK_XGXS: loopback within MAC at XGXS level | ||
18 | * @LOOPBACK_XAUI: loopback within MAC at XAUI level | ||
19 | * @LOOPBACK_PHYXS: loopback within PHY at PHYXS level | ||
20 | * @LOOPBACK_PCS: loopback within PHY at PCS level | ||
21 | * @LOOPBACK_PMAPMD: loopback within PHY at PMAPMD level | ||
22 | * @LOOPBACK_NETWORK: reflecting loopback (even further than furthest!) | ||
23 | */ | ||
24 | /* Please keep in order and up-to-date w.r.t the following two #defines */ | ||
25 | enum efx_loopback_mode { | ||
26 | LOOPBACK_NONE = 0, | ||
27 | LOOPBACK_MAC = 1, | ||
28 | LOOPBACK_XGMII = 2, | ||
29 | LOOPBACK_XGXS = 3, | ||
30 | LOOPBACK_XAUI = 4, | ||
31 | LOOPBACK_PHY = 5, | ||
32 | LOOPBACK_PHYXS = 6, | ||
33 | LOOPBACK_PCS = 7, | ||
34 | LOOPBACK_PMAPMD = 8, | ||
35 | LOOPBACK_NETWORK = 9, | ||
36 | LOOPBACK_MAX | ||
37 | }; | ||
38 | |||
39 | #define LOOPBACK_TEST_MAX LOOPBACK_PMAPMD | ||
40 | |||
41 | extern const char *efx_loopback_mode_names[]; | ||
42 | #define LOOPBACK_MODE_NAME(mode) \ | ||
43 | STRING_TABLE_LOOKUP(mode, efx_loopback_mode) | ||
44 | #define LOOPBACK_MODE(efx) \ | ||
45 | LOOPBACK_MODE_NAME(efx->loopback_mode) | ||
46 | |||
47 | /* These loopbacks occur within the controller */ | ||
48 | #define LOOPBACKS_10G_INTERNAL ((1 << LOOPBACK_XGMII)| \ | ||
49 | (1 << LOOPBACK_XGXS) | \ | ||
50 | (1 << LOOPBACK_XAUI)) | ||
51 | |||
52 | #define LOOPBACK_MASK(_efx) \ | ||
53 | (1 << (_efx)->loopback_mode) | ||
54 | |||
55 | #define LOOPBACK_INTERNAL(_efx) \ | ||
56 | ((LOOPBACKS_10G_INTERNAL & LOOPBACK_MASK(_efx)) ? 1 : 0) | ||
57 | |||
58 | #define LOOPBACK_OUT_OF(_from, _to, _mask) \ | ||
59 | (((LOOPBACK_MASK(_from) & (_mask)) && \ | ||
60 | ((LOOPBACK_MASK(_to) & (_mask)) == 0)) ? 1 : 0) | ||
61 | |||
13 | /*****************************************************************************/ | 62 | /*****************************************************************************/ |
14 | 63 | ||
15 | /** | 64 | /** |
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c index ad541badbd98..e2c75d101610 100644 --- a/drivers/net/sfc/ethtool.c +++ b/drivers/net/sfc/ethtool.c | |||
@@ -12,12 +12,26 @@ | |||
12 | #include <linux/ethtool.h> | 12 | #include <linux/ethtool.h> |
13 | #include <linux/rtnetlink.h> | 13 | #include <linux/rtnetlink.h> |
14 | #include "net_driver.h" | 14 | #include "net_driver.h" |
15 | #include "selftest.h" | ||
15 | #include "efx.h" | 16 | #include "efx.h" |
16 | #include "ethtool.h" | 17 | #include "ethtool.h" |
17 | #include "falcon.h" | 18 | #include "falcon.h" |
18 | #include "gmii.h" | 19 | #include "gmii.h" |
19 | #include "mac.h" | 20 | #include "mac.h" |
20 | 21 | ||
22 | const char *efx_loopback_mode_names[] = { | ||
23 | [LOOPBACK_NONE] = "NONE", | ||
24 | [LOOPBACK_MAC] = "MAC", | ||
25 | [LOOPBACK_XGMII] = "XGMII", | ||
26 | [LOOPBACK_XGXS] = "XGXS", | ||
27 | [LOOPBACK_XAUI] = "XAUI", | ||
28 | [LOOPBACK_PHY] = "PHY", | ||
29 | [LOOPBACK_PHYXS] = "PHY(XS)", | ||
30 | [LOOPBACK_PCS] = "PHY(PCS)", | ||
31 | [LOOPBACK_PMAPMD] = "PHY(PMAPMD)", | ||
32 | [LOOPBACK_NETWORK] = "NETWORK", | ||
33 | }; | ||
34 | |||
21 | static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable); | 35 | static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable); |
22 | 36 | ||
23 | struct ethtool_string { | 37 | struct ethtool_string { |
@@ -217,23 +231,179 @@ static void efx_ethtool_get_drvinfo(struct net_device *net_dev, | |||
217 | strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info)); | 231 | strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info)); |
218 | } | 232 | } |
219 | 233 | ||
234 | /** | ||
235 | * efx_fill_test - fill in an individual self-test entry | ||
236 | * @test_index: Index of the test | ||
237 | * @strings: Ethtool strings, or %NULL | ||
238 | * @data: Ethtool test results, or %NULL | ||
239 | * @test: Pointer to test result (used only if data != %NULL) | ||
240 | * @unit_format: Unit name format (e.g. "channel\%d") | ||
241 | * @unit_id: Unit id (e.g. 0 for "channel0") | ||
242 | * @test_format: Test name format (e.g. "loopback.\%s.tx.sent") | ||
243 | * @test_id: Test id (e.g. "PHY" for "loopback.PHY.tx_sent") | ||
244 | * | ||
245 | * Fill in an individual self-test entry. | ||
246 | */ | ||
247 | static void efx_fill_test(unsigned int test_index, | ||
248 | struct ethtool_string *strings, u64 *data, | ||
249 | int *test, const char *unit_format, int unit_id, | ||
250 | const char *test_format, const char *test_id) | ||
251 | { | ||
252 | struct ethtool_string unit_str, test_str; | ||
253 | |||
254 | /* Fill data value, if applicable */ | ||
255 | if (data) | ||
256 | data[test_index] = *test; | ||
257 | |||
258 | /* Fill string, if applicable */ | ||
259 | if (strings) { | ||
260 | snprintf(unit_str.name, sizeof(unit_str.name), | ||
261 | unit_format, unit_id); | ||
262 | snprintf(test_str.name, sizeof(test_str.name), | ||
263 | test_format, test_id); | ||
264 | snprintf(strings[test_index].name, | ||
265 | sizeof(strings[test_index].name), | ||
266 | "%-9s%-17s", unit_str.name, test_str.name); | ||
267 | } | ||
268 | } | ||
269 | |||
270 | #define EFX_PORT_NAME "port%d", 0 | ||
271 | #define EFX_CHANNEL_NAME(_channel) "channel%d", _channel->channel | ||
272 | #define EFX_TX_QUEUE_NAME(_tx_queue) "txq%d", _tx_queue->queue | ||
273 | #define EFX_RX_QUEUE_NAME(_rx_queue) "rxq%d", _rx_queue->queue | ||
274 | #define EFX_LOOPBACK_NAME(_mode, _counter) \ | ||
275 | "loopback.%s." _counter, LOOPBACK_MODE_NAME(mode) | ||
276 | |||
277 | /** | ||
278 | * efx_fill_loopback_test - fill in a block of loopback self-test entries | ||
279 | * @efx: Efx NIC | ||
280 | * @lb_tests: Efx loopback self-test results structure | ||
281 | * @mode: Loopback test mode | ||
282 | * @test_index: Starting index of the test | ||
283 | * @strings: Ethtool strings, or %NULL | ||
284 | * @data: Ethtool test results, or %NULL | ||
285 | */ | ||
286 | static int efx_fill_loopback_test(struct efx_nic *efx, | ||
287 | struct efx_loopback_self_tests *lb_tests, | ||
288 | enum efx_loopback_mode mode, | ||
289 | unsigned int test_index, | ||
290 | struct ethtool_string *strings, u64 *data) | ||
291 | { | ||
292 | struct efx_tx_queue *tx_queue; | ||
293 | |||
294 | efx_for_each_tx_queue(tx_queue, efx) { | ||
295 | efx_fill_test(test_index++, strings, data, | ||
296 | &lb_tests->tx_sent[tx_queue->queue], | ||
297 | EFX_TX_QUEUE_NAME(tx_queue), | ||
298 | EFX_LOOPBACK_NAME(mode, "tx_sent")); | ||
299 | efx_fill_test(test_index++, strings, data, | ||
300 | &lb_tests->tx_done[tx_queue->queue], | ||
301 | EFX_TX_QUEUE_NAME(tx_queue), | ||
302 | EFX_LOOPBACK_NAME(mode, "tx_done")); | ||
303 | } | ||
304 | efx_fill_test(test_index++, strings, data, | ||
305 | &lb_tests->rx_good, | ||
306 | EFX_PORT_NAME, | ||
307 | EFX_LOOPBACK_NAME(mode, "rx_good")); | ||
308 | efx_fill_test(test_index++, strings, data, | ||
309 | &lb_tests->rx_bad, | ||
310 | EFX_PORT_NAME, | ||
311 | EFX_LOOPBACK_NAME(mode, "rx_bad")); | ||
312 | |||
313 | return test_index; | ||
314 | } | ||
315 | |||
316 | /** | ||
317 | * efx_ethtool_fill_self_tests - get self-test details | ||
318 | * @efx: Efx NIC | ||
319 | * @tests: Efx self-test results structure, or %NULL | ||
320 | * @strings: Ethtool strings, or %NULL | ||
321 | * @data: Ethtool test results, or %NULL | ||
322 | */ | ||
323 | static int efx_ethtool_fill_self_tests(struct efx_nic *efx, | ||
324 | struct efx_self_tests *tests, | ||
325 | struct ethtool_string *strings, | ||
326 | u64 *data) | ||
327 | { | ||
328 | struct efx_channel *channel; | ||
329 | unsigned int n = 0; | ||
330 | enum efx_loopback_mode mode; | ||
331 | |||
332 | /* Interrupt */ | ||
333 | efx_fill_test(n++, strings, data, &tests->interrupt, | ||
334 | "core", 0, "interrupt", NULL); | ||
335 | |||
336 | /* Event queues */ | ||
337 | efx_for_each_channel(channel, efx) { | ||
338 | efx_fill_test(n++, strings, data, | ||
339 | &tests->eventq_dma[channel->channel], | ||
340 | EFX_CHANNEL_NAME(channel), | ||
341 | "eventq.dma", NULL); | ||
342 | efx_fill_test(n++, strings, data, | ||
343 | &tests->eventq_int[channel->channel], | ||
344 | EFX_CHANNEL_NAME(channel), | ||
345 | "eventq.int", NULL); | ||
346 | efx_fill_test(n++, strings, data, | ||
347 | &tests->eventq_poll[channel->channel], | ||
348 | EFX_CHANNEL_NAME(channel), | ||
349 | "eventq.poll", NULL); | ||
350 | } | ||
351 | |||
352 | /* PHY presence */ | ||
353 | efx_fill_test(n++, strings, data, &tests->phy_ok, | ||
354 | EFX_PORT_NAME, "phy_ok", NULL); | ||
355 | |||
356 | /* Loopback tests */ | ||
357 | efx_fill_test(n++, strings, data, &tests->loopback_speed, | ||
358 | EFX_PORT_NAME, "loopback.speed", NULL); | ||
359 | efx_fill_test(n++, strings, data, &tests->loopback_full_duplex, | ||
360 | EFX_PORT_NAME, "loopback.full_duplex", NULL); | ||
361 | for (mode = LOOPBACK_NONE; mode < LOOPBACK_TEST_MAX; mode++) { | ||
362 | if (!(efx->loopback_modes & (1 << mode))) | ||
363 | continue; | ||
364 | n = efx_fill_loopback_test(efx, | ||
365 | &tests->loopback[mode], mode, n, | ||
366 | strings, data); | ||
367 | } | ||
368 | |||
369 | return n; | ||
370 | } | ||
371 | |||
220 | static int efx_ethtool_get_stats_count(struct net_device *net_dev) | 372 | static int efx_ethtool_get_stats_count(struct net_device *net_dev) |
221 | { | 373 | { |
222 | return EFX_ETHTOOL_NUM_STATS; | 374 | return EFX_ETHTOOL_NUM_STATS; |
223 | } | 375 | } |
224 | 376 | ||
377 | static int efx_ethtool_self_test_count(struct net_device *net_dev) | ||
378 | { | ||
379 | struct efx_nic *efx = net_dev->priv; | ||
380 | |||
381 | return efx_ethtool_fill_self_tests(efx, NULL, NULL, NULL); | ||
382 | } | ||
383 | |||
225 | static void efx_ethtool_get_strings(struct net_device *net_dev, | 384 | static void efx_ethtool_get_strings(struct net_device *net_dev, |
226 | u32 string_set, u8 *strings) | 385 | u32 string_set, u8 *strings) |
227 | { | 386 | { |
387 | struct efx_nic *efx = net_dev->priv; | ||
228 | struct ethtool_string *ethtool_strings = | 388 | struct ethtool_string *ethtool_strings = |
229 | (struct ethtool_string *)strings; | 389 | (struct ethtool_string *)strings; |
230 | int i; | 390 | int i; |
231 | 391 | ||
232 | if (string_set == ETH_SS_STATS) | 392 | switch (string_set) { |
393 | case ETH_SS_STATS: | ||
233 | for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) | 394 | for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) |
234 | strncpy(ethtool_strings[i].name, | 395 | strncpy(ethtool_strings[i].name, |
235 | efx_ethtool_stats[i].name, | 396 | efx_ethtool_stats[i].name, |
236 | sizeof(ethtool_strings[i].name)); | 397 | sizeof(ethtool_strings[i].name)); |
398 | break; | ||
399 | case ETH_SS_TEST: | ||
400 | efx_ethtool_fill_self_tests(efx, NULL, | ||
401 | ethtool_strings, NULL); | ||
402 | break; | ||
403 | default: | ||
404 | /* No other string sets */ | ||
405 | break; | ||
406 | } | ||
237 | } | 407 | } |
238 | 408 | ||
239 | static void efx_ethtool_get_stats(struct net_device *net_dev, | 409 | static void efx_ethtool_get_stats(struct net_device *net_dev, |
@@ -272,6 +442,22 @@ static void efx_ethtool_get_stats(struct net_device *net_dev, | |||
272 | } | 442 | } |
273 | } | 443 | } |
274 | 444 | ||
445 | static int efx_ethtool_set_tso(struct net_device *net_dev, u32 enable) | ||
446 | { | ||
447 | int rc; | ||
448 | |||
449 | /* Our TSO requires TX checksumming, so force TX checksumming | ||
450 | * on when TSO is enabled. | ||
451 | */ | ||
452 | if (enable) { | ||
453 | rc = efx_ethtool_set_tx_csum(net_dev, 1); | ||
454 | if (rc) | ||
455 | return rc; | ||
456 | } | ||
457 | |||
458 | return ethtool_op_set_tso(net_dev, enable); | ||
459 | } | ||
460 | |||
275 | static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable) | 461 | static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable) |
276 | { | 462 | { |
277 | struct efx_nic *efx = net_dev->priv; | 463 | struct efx_nic *efx = net_dev->priv; |
@@ -283,6 +469,15 @@ static int efx_ethtool_set_tx_csum(struct net_device *net_dev, u32 enable) | |||
283 | 469 | ||
284 | efx_flush_queues(efx); | 470 | efx_flush_queues(efx); |
285 | 471 | ||
472 | /* Our TSO requires TX checksumming, so disable TSO when | ||
473 | * checksumming is disabled | ||
474 | */ | ||
475 | if (!enable) { | ||
476 | rc = efx_ethtool_set_tso(net_dev, 0); | ||
477 | if (rc) | ||
478 | return rc; | ||
479 | } | ||
480 | |||
286 | return 0; | 481 | return 0; |
287 | } | 482 | } |
288 | 483 | ||
@@ -305,6 +500,64 @@ static u32 efx_ethtool_get_rx_csum(struct net_device *net_dev) | |||
305 | return efx->rx_checksum_enabled; | 500 | return efx->rx_checksum_enabled; |
306 | } | 501 | } |
307 | 502 | ||
503 | static void efx_ethtool_self_test(struct net_device *net_dev, | ||
504 | struct ethtool_test *test, u64 *data) | ||
505 | { | ||
506 | struct efx_nic *efx = net_dev->priv; | ||
507 | struct efx_self_tests efx_tests; | ||
508 | int offline, already_up; | ||
509 | int rc; | ||
510 | |||
511 | ASSERT_RTNL(); | ||
512 | if (efx->state != STATE_RUNNING) { | ||
513 | rc = -EIO; | ||
514 | goto fail1; | ||
515 | } | ||
516 | |||
517 | /* We need rx buffers and interrupts. */ | ||
518 | already_up = (efx->net_dev->flags & IFF_UP); | ||
519 | if (!already_up) { | ||
520 | rc = dev_open(efx->net_dev); | ||
521 | if (rc) { | ||
522 | EFX_ERR(efx, "failed opening device.\n"); | ||
523 | goto fail2; | ||
524 | } | ||
525 | } | ||
526 | |||
527 | memset(&efx_tests, 0, sizeof(efx_tests)); | ||
528 | offline = (test->flags & ETH_TEST_FL_OFFLINE); | ||
529 | |||
530 | /* Perform online self tests first */ | ||
531 | rc = efx_online_test(efx, &efx_tests); | ||
532 | if (rc) | ||
533 | goto out; | ||
534 | |||
535 | /* Perform offline tests only if online tests passed */ | ||
536 | if (offline) { | ||
537 | /* Stop the kernel from sending packets during the test. */ | ||
538 | efx_stop_queue(efx); | ||
539 | rc = efx_flush_queues(efx); | ||
540 | if (!rc) | ||
541 | rc = efx_offline_test(efx, &efx_tests, | ||
542 | efx->loopback_modes); | ||
543 | efx_wake_queue(efx); | ||
544 | } | ||
545 | |||
546 | out: | ||
547 | if (!already_up) | ||
548 | dev_close(efx->net_dev); | ||
549 | |||
550 | EFX_LOG(efx, "%s all %sline self-tests\n", | ||
551 | rc == 0 ? "passed" : "failed", offline ? "off" : "on"); | ||
552 | |||
553 | fail2: | ||
554 | fail1: | ||
555 | /* Fill ethtool results structures */ | ||
556 | efx_ethtool_fill_self_tests(efx, &efx_tests, NULL, data); | ||
557 | if (rc) | ||
558 | test->flags |= ETH_TEST_FL_FAILED; | ||
559 | } | ||
560 | |||
308 | /* Restart autonegotiation */ | 561 | /* Restart autonegotiation */ |
309 | static int efx_ethtool_nway_reset(struct net_device *net_dev) | 562 | static int efx_ethtool_nway_reset(struct net_device *net_dev) |
310 | { | 563 | { |
@@ -451,8 +704,12 @@ struct ethtool_ops efx_ethtool_ops = { | |||
451 | .set_tx_csum = efx_ethtool_set_tx_csum, | 704 | .set_tx_csum = efx_ethtool_set_tx_csum, |
452 | .get_sg = ethtool_op_get_sg, | 705 | .get_sg = ethtool_op_get_sg, |
453 | .set_sg = ethtool_op_set_sg, | 706 | .set_sg = ethtool_op_set_sg, |
707 | .get_tso = ethtool_op_get_tso, | ||
708 | .set_tso = efx_ethtool_set_tso, | ||
454 | .get_flags = ethtool_op_get_flags, | 709 | .get_flags = ethtool_op_get_flags, |
455 | .set_flags = ethtool_op_set_flags, | 710 | .set_flags = ethtool_op_set_flags, |
711 | .self_test_count = efx_ethtool_self_test_count, | ||
712 | .self_test = efx_ethtool_self_test, | ||
456 | .get_strings = efx_ethtool_get_strings, | 713 | .get_strings = efx_ethtool_get_strings, |
457 | .phys_id = efx_ethtool_phys_id, | 714 | .phys_id = efx_ethtool_phys_id, |
458 | .get_stats_count = efx_ethtool_get_stats_count, | 715 | .get_stats_count = efx_ethtool_get_stats_count, |
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c index 46db549ce580..b57cc68058c0 100644 --- a/drivers/net/sfc/falcon.c +++ b/drivers/net/sfc/falcon.c | |||
@@ -1129,6 +1129,7 @@ static void falcon_handle_driver_event(struct efx_channel *channel, | |||
1129 | case RX_RECOVERY_EV_DECODE: | 1129 | case RX_RECOVERY_EV_DECODE: |
1130 | EFX_ERR(efx, "channel %d seen DRIVER RX_RESET event. " | 1130 | EFX_ERR(efx, "channel %d seen DRIVER RX_RESET event. " |
1131 | "Resetting.\n", channel->channel); | 1131 | "Resetting.\n", channel->channel); |
1132 | atomic_inc(&efx->rx_reset); | ||
1132 | efx_schedule_reset(efx, | 1133 | efx_schedule_reset(efx, |
1133 | EFX_WORKAROUND_6555(efx) ? | 1134 | EFX_WORKAROUND_6555(efx) ? |
1134 | RESET_TYPE_RX_RECOVERY : | 1135 | RESET_TYPE_RX_RECOVERY : |
@@ -1731,7 +1732,8 @@ void falcon_drain_tx_fifo(struct efx_nic *efx) | |||
1731 | efx_oword_t temp; | 1732 | efx_oword_t temp; |
1732 | int count; | 1733 | int count; |
1733 | 1734 | ||
1734 | if (FALCON_REV(efx) < FALCON_REV_B0) | 1735 | if ((FALCON_REV(efx) < FALCON_REV_B0) || |
1736 | (efx->loopback_mode != LOOPBACK_NONE)) | ||
1735 | return; | 1737 | return; |
1736 | 1738 | ||
1737 | falcon_read(efx, &temp, MAC0_CTRL_REG_KER); | 1739 | falcon_read(efx, &temp, MAC0_CTRL_REG_KER); |
@@ -2091,6 +2093,8 @@ static int falcon_probe_phy(struct efx_nic *efx) | |||
2091 | efx->phy_type); | 2093 | efx->phy_type); |
2092 | return -1; | 2094 | return -1; |
2093 | } | 2095 | } |
2096 | |||
2097 | efx->loopback_modes = LOOPBACKS_10G_INTERNAL | efx->phy_op->loopbacks; | ||
2094 | return 0; | 2098 | return 0; |
2095 | } | 2099 | } |
2096 | 2100 | ||
@@ -2468,14 +2472,12 @@ int falcon_probe_nic(struct efx_nic *efx) | |||
2468 | fail5: | 2472 | fail5: |
2469 | falcon_free_buffer(efx, &efx->irq_status); | 2473 | falcon_free_buffer(efx, &efx->irq_status); |
2470 | fail4: | 2474 | fail4: |
2471 | /* fall-thru */ | ||
2472 | fail3: | 2475 | fail3: |
2473 | if (nic_data->pci_dev2) { | 2476 | if (nic_data->pci_dev2) { |
2474 | pci_dev_put(nic_data->pci_dev2); | 2477 | pci_dev_put(nic_data->pci_dev2); |
2475 | nic_data->pci_dev2 = NULL; | 2478 | nic_data->pci_dev2 = NULL; |
2476 | } | 2479 | } |
2477 | fail2: | 2480 | fail2: |
2478 | /* fall-thru */ | ||
2479 | fail1: | 2481 | fail1: |
2480 | kfree(efx->nic_data); | 2482 | kfree(efx->nic_data); |
2481 | return rc; | 2483 | return rc; |
diff --git a/drivers/net/sfc/falcon_hwdefs.h b/drivers/net/sfc/falcon_hwdefs.h index 0485a63eaff6..06e2d68fc3d1 100644 --- a/drivers/net/sfc/falcon_hwdefs.h +++ b/drivers/net/sfc/falcon_hwdefs.h | |||
@@ -636,6 +636,14 @@ | |||
636 | #define XX_HIDRVA_WIDTH 1 | 636 | #define XX_HIDRVA_WIDTH 1 |
637 | #define XX_LODRVA_LBN 8 | 637 | #define XX_LODRVA_LBN 8 |
638 | #define XX_LODRVA_WIDTH 1 | 638 | #define XX_LODRVA_WIDTH 1 |
639 | #define XX_LPBKD_LBN 3 | ||
640 | #define XX_LPBKD_WIDTH 1 | ||
641 | #define XX_LPBKC_LBN 2 | ||
642 | #define XX_LPBKC_WIDTH 1 | ||
643 | #define XX_LPBKB_LBN 1 | ||
644 | #define XX_LPBKB_WIDTH 1 | ||
645 | #define XX_LPBKA_LBN 0 | ||
646 | #define XX_LPBKA_WIDTH 1 | ||
639 | 647 | ||
640 | #define XX_TXDRV_CTL_REG_MAC 0x12 | 648 | #define XX_TXDRV_CTL_REG_MAC 0x12 |
641 | #define XX_DEQD_LBN 28 | 649 | #define XX_DEQD_LBN 28 |
@@ -656,8 +664,14 @@ | |||
656 | #define XX_DTXA_WIDTH 4 | 664 | #define XX_DTXA_WIDTH 4 |
657 | 665 | ||
658 | /* XAUI XGXS core status register */ | 666 | /* XAUI XGXS core status register */ |
659 | #define XX_FORCE_SIG_DECODE_FORCED 0xff | ||
660 | #define XX_CORE_STAT_REG_MAC 0x16 | 667 | #define XX_CORE_STAT_REG_MAC 0x16 |
668 | #define XX_FORCE_SIG_LBN 24 | ||
669 | #define XX_FORCE_SIG_WIDTH 8 | ||
670 | #define XX_FORCE_SIG_DECODE_FORCED 0xff | ||
671 | #define XX_XGXS_LB_EN_LBN 23 | ||
672 | #define XX_XGXS_LB_EN_WIDTH 1 | ||
673 | #define XX_XGMII_LB_EN_LBN 22 | ||
674 | #define XX_XGMII_LB_EN_WIDTH 1 | ||
661 | #define XX_ALIGN_DONE_LBN 20 | 675 | #define XX_ALIGN_DONE_LBN 20 |
662 | #define XX_ALIGN_DONE_WIDTH 1 | 676 | #define XX_ALIGN_DONE_WIDTH 1 |
663 | #define XX_SYNC_STAT_LBN 16 | 677 | #define XX_SYNC_STAT_LBN 16 |
diff --git a/drivers/net/sfc/falcon_xmac.c b/drivers/net/sfc/falcon_xmac.c index aa7521b24a5d..a74b7931a3c4 100644 --- a/drivers/net/sfc/falcon_xmac.c +++ b/drivers/net/sfc/falcon_xmac.c | |||
@@ -32,7 +32,7 @@ | |||
32 | (FALCON_XMAC_REGBANK + ((mac_reg) * FALCON_XMAC_REG_SIZE)) | 32 | (FALCON_XMAC_REGBANK + ((mac_reg) * FALCON_XMAC_REG_SIZE)) |
33 | 33 | ||
34 | void falcon_xmac_writel(struct efx_nic *efx, | 34 | void falcon_xmac_writel(struct efx_nic *efx, |
35 | efx_dword_t *value, unsigned int mac_reg) | 35 | efx_dword_t *value, unsigned int mac_reg) |
36 | { | 36 | { |
37 | efx_oword_t temp; | 37 | efx_oword_t temp; |
38 | 38 | ||
@@ -69,6 +69,10 @@ static int falcon_reset_xmac(struct efx_nic *efx) | |||
69 | udelay(10); | 69 | udelay(10); |
70 | } | 70 | } |
71 | 71 | ||
72 | /* This often fails when DSP is disabled, ignore it */ | ||
73 | if (sfe4001_phy_flash_cfg != 0) | ||
74 | return 0; | ||
75 | |||
72 | EFX_ERR(efx, "timed out waiting for XMAC core reset\n"); | 76 | EFX_ERR(efx, "timed out waiting for XMAC core reset\n"); |
73 | return -ETIMEDOUT; | 77 | return -ETIMEDOUT; |
74 | } | 78 | } |
@@ -223,7 +227,7 @@ static int falcon_xgmii_status(struct efx_nic *efx) | |||
223 | /* The ISR latches, so clear it and re-read */ | 227 | /* The ISR latches, so clear it and re-read */ |
224 | falcon_xmac_readl(efx, ®, XM_MGT_INT_REG_MAC_B0); | 228 | falcon_xmac_readl(efx, ®, XM_MGT_INT_REG_MAC_B0); |
225 | falcon_xmac_readl(efx, ®, XM_MGT_INT_REG_MAC_B0); | 229 | falcon_xmac_readl(efx, ®, XM_MGT_INT_REG_MAC_B0); |
226 | 230 | ||
227 | if (EFX_DWORD_FIELD(reg, XM_LCLFLT) || | 231 | if (EFX_DWORD_FIELD(reg, XM_LCLFLT) || |
228 | EFX_DWORD_FIELD(reg, XM_RMTFLT)) { | 232 | EFX_DWORD_FIELD(reg, XM_RMTFLT)) { |
229 | EFX_INFO(efx, "MGT_INT: "EFX_DWORD_FMT"\n", EFX_DWORD_VAL(reg)); | 233 | EFX_INFO(efx, "MGT_INT: "EFX_DWORD_FMT"\n", EFX_DWORD_VAL(reg)); |
@@ -237,7 +241,7 @@ static void falcon_mask_status_intr(struct efx_nic *efx, int enable) | |||
237 | { | 241 | { |
238 | efx_dword_t reg; | 242 | efx_dword_t reg; |
239 | 243 | ||
240 | if (FALCON_REV(efx) < FALCON_REV_B0) | 244 | if ((FALCON_REV(efx) < FALCON_REV_B0) || LOOPBACK_INTERNAL(efx)) |
241 | return; | 245 | return; |
242 | 246 | ||
243 | /* Flush the ISR */ | 247 | /* Flush the ISR */ |
@@ -284,6 +288,9 @@ int falcon_xaui_link_ok(struct efx_nic *efx) | |||
284 | efx_dword_t reg; | 288 | efx_dword_t reg; |
285 | int align_done, sync_status, link_ok = 0; | 289 | int align_done, sync_status, link_ok = 0; |
286 | 290 | ||
291 | if (LOOPBACK_INTERNAL(efx)) | ||
292 | return 1; | ||
293 | |||
287 | /* Read link status */ | 294 | /* Read link status */ |
288 | falcon_xmac_readl(efx, ®, XX_CORE_STAT_REG_MAC); | 295 | falcon_xmac_readl(efx, ®, XX_CORE_STAT_REG_MAC); |
289 | 296 | ||
@@ -374,6 +381,61 @@ static void falcon_reconfigure_xmac_core(struct efx_nic *efx) | |||
374 | falcon_xmac_writel(efx, ®, XM_ADR_HI_REG_MAC); | 381 | falcon_xmac_writel(efx, ®, XM_ADR_HI_REG_MAC); |
375 | } | 382 | } |
376 | 383 | ||
384 | static void falcon_reconfigure_xgxs_core(struct efx_nic *efx) | ||
385 | { | ||
386 | efx_dword_t reg; | ||
387 | int xgxs_loopback = (efx->loopback_mode == LOOPBACK_XGXS) ? 1 : 0; | ||
388 | int xaui_loopback = (efx->loopback_mode == LOOPBACK_XAUI) ? 1 : 0; | ||
389 | int xgmii_loopback = | ||
390 | (efx->loopback_mode == LOOPBACK_XGMII) ? 1 : 0; | ||
391 | |||
392 | /* XGXS block is flaky and will need to be reset if moving | ||
393 | * into our out of XGMII, XGXS or XAUI loopbacks. */ | ||
394 | if (EFX_WORKAROUND_5147(efx)) { | ||
395 | int old_xgmii_loopback, old_xgxs_loopback, old_xaui_loopback; | ||
396 | int reset_xgxs; | ||
397 | |||
398 | falcon_xmac_readl(efx, ®, XX_CORE_STAT_REG_MAC); | ||
399 | old_xgxs_loopback = EFX_DWORD_FIELD(reg, XX_XGXS_LB_EN); | ||
400 | old_xgmii_loopback = EFX_DWORD_FIELD(reg, XX_XGMII_LB_EN); | ||
401 | |||
402 | falcon_xmac_readl(efx, ®, XX_SD_CTL_REG_MAC); | ||
403 | old_xaui_loopback = EFX_DWORD_FIELD(reg, XX_LPBKA); | ||
404 | |||
405 | /* The PHY driver may have turned XAUI off */ | ||
406 | reset_xgxs = ((xgxs_loopback != old_xgxs_loopback) || | ||
407 | (xaui_loopback != old_xaui_loopback) || | ||
408 | (xgmii_loopback != old_xgmii_loopback)); | ||
409 | if (reset_xgxs) { | ||
410 | falcon_xmac_readl(efx, ®, XX_PWR_RST_REG_MAC); | ||
411 | EFX_SET_DWORD_FIELD(reg, XX_RSTXGXSTX_EN, 1); | ||
412 | EFX_SET_DWORD_FIELD(reg, XX_RSTXGXSRX_EN, 1); | ||
413 | falcon_xmac_writel(efx, ®, XX_PWR_RST_REG_MAC); | ||
414 | udelay(1); | ||
415 | EFX_SET_DWORD_FIELD(reg, XX_RSTXGXSTX_EN, 0); | ||
416 | EFX_SET_DWORD_FIELD(reg, XX_RSTXGXSRX_EN, 0); | ||
417 | falcon_xmac_writel(efx, ®, XX_PWR_RST_REG_MAC); | ||
418 | udelay(1); | ||
419 | } | ||
420 | } | ||
421 | |||
422 | falcon_xmac_readl(efx, ®, XX_CORE_STAT_REG_MAC); | ||
423 | EFX_SET_DWORD_FIELD(reg, XX_FORCE_SIG, | ||
424 | (xgxs_loopback || xaui_loopback) ? | ||
425 | XX_FORCE_SIG_DECODE_FORCED : 0); | ||
426 | EFX_SET_DWORD_FIELD(reg, XX_XGXS_LB_EN, xgxs_loopback); | ||
427 | EFX_SET_DWORD_FIELD(reg, XX_XGMII_LB_EN, xgmii_loopback); | ||
428 | falcon_xmac_writel(efx, ®, XX_CORE_STAT_REG_MAC); | ||
429 | |||
430 | falcon_xmac_readl(efx, ®, XX_SD_CTL_REG_MAC); | ||
431 | EFX_SET_DWORD_FIELD(reg, XX_LPBKD, xaui_loopback); | ||
432 | EFX_SET_DWORD_FIELD(reg, XX_LPBKC, xaui_loopback); | ||
433 | EFX_SET_DWORD_FIELD(reg, XX_LPBKB, xaui_loopback); | ||
434 | EFX_SET_DWORD_FIELD(reg, XX_LPBKA, xaui_loopback); | ||
435 | falcon_xmac_writel(efx, ®, XX_SD_CTL_REG_MAC); | ||
436 | } | ||
437 | |||
438 | |||
377 | /* Try and bring the Falcon side of the Falcon-Phy XAUI link fails | 439 | /* Try and bring the Falcon side of the Falcon-Phy XAUI link fails |
378 | * to come back up. Bash it until it comes back up */ | 440 | * to come back up. Bash it until it comes back up */ |
379 | static int falcon_check_xaui_link_up(struct efx_nic *efx) | 441 | static int falcon_check_xaui_link_up(struct efx_nic *efx) |
@@ -382,7 +444,8 @@ static int falcon_check_xaui_link_up(struct efx_nic *efx) | |||
382 | tries = EFX_WORKAROUND_5147(efx) ? 5 : 1; | 444 | tries = EFX_WORKAROUND_5147(efx) ? 5 : 1; |
383 | max_tries = tries; | 445 | max_tries = tries; |
384 | 446 | ||
385 | if (efx->phy_type == PHY_TYPE_NONE) | 447 | if ((efx->loopback_mode == LOOPBACK_NETWORK) || |
448 | (efx->phy_type == PHY_TYPE_NONE)) | ||
386 | return 0; | 449 | return 0; |
387 | 450 | ||
388 | while (tries) { | 451 | while (tries) { |
@@ -408,8 +471,13 @@ void falcon_reconfigure_xmac(struct efx_nic *efx) | |||
408 | falcon_mask_status_intr(efx, 0); | 471 | falcon_mask_status_intr(efx, 0); |
409 | 472 | ||
410 | falcon_deconfigure_mac_wrapper(efx); | 473 | falcon_deconfigure_mac_wrapper(efx); |
474 | |||
475 | efx->tx_disabled = LOOPBACK_INTERNAL(efx); | ||
411 | efx->phy_op->reconfigure(efx); | 476 | efx->phy_op->reconfigure(efx); |
477 | |||
478 | falcon_reconfigure_xgxs_core(efx); | ||
412 | falcon_reconfigure_xmac_core(efx); | 479 | falcon_reconfigure_xmac_core(efx); |
480 | |||
413 | falcon_reconfigure_mac_wrapper(efx); | 481 | falcon_reconfigure_mac_wrapper(efx); |
414 | 482 | ||
415 | /* Ensure XAUI link is up */ | 483 | /* Ensure XAUI link is up */ |
@@ -491,13 +559,15 @@ void falcon_update_stats_xmac(struct efx_nic *efx) | |||
491 | (mac_stats->rx_bytes - mac_stats->rx_good_bytes); | 559 | (mac_stats->rx_bytes - mac_stats->rx_good_bytes); |
492 | } | 560 | } |
493 | 561 | ||
494 | #define EFX_XAUI_RETRAIN_MAX 8 | ||
495 | |||
496 | int falcon_check_xmac(struct efx_nic *efx) | 562 | int falcon_check_xmac(struct efx_nic *efx) |
497 | { | 563 | { |
498 | unsigned xaui_link_ok; | 564 | unsigned xaui_link_ok; |
499 | int rc; | 565 | int rc; |
500 | 566 | ||
567 | if ((efx->loopback_mode == LOOPBACK_NETWORK) || | ||
568 | (efx->phy_type == PHY_TYPE_NONE)) | ||
569 | return 0; | ||
570 | |||
501 | falcon_mask_status_intr(efx, 0); | 571 | falcon_mask_status_intr(efx, 0); |
502 | xaui_link_ok = falcon_xaui_link_ok(efx); | 572 | xaui_link_ok = falcon_xaui_link_ok(efx); |
503 | 573 | ||
diff --git a/drivers/net/sfc/mdio_10g.c b/drivers/net/sfc/mdio_10g.c index dc06bb0aa575..c4f540e93b79 100644 --- a/drivers/net/sfc/mdio_10g.c +++ b/drivers/net/sfc/mdio_10g.c | |||
@@ -44,6 +44,9 @@ static int mdio_clause45_check_mmd(struct efx_nic *efx, int mmd, | |||
44 | int status; | 44 | int status; |
45 | int phy_id = efx->mii.phy_id; | 45 | int phy_id = efx->mii.phy_id; |
46 | 46 | ||
47 | if (LOOPBACK_INTERNAL(efx)) | ||
48 | return 0; | ||
49 | |||
47 | /* Read MMD STATUS2 to check it is responding. */ | 50 | /* Read MMD STATUS2 to check it is responding. */ |
48 | status = mdio_clause45_read(efx, phy_id, mmd, MDIO_MMDREG_STAT2); | 51 | status = mdio_clause45_read(efx, phy_id, mmd, MDIO_MMDREG_STAT2); |
49 | if (((status >> MDIO_MMDREG_STAT2_PRESENT_LBN) & | 52 | if (((status >> MDIO_MMDREG_STAT2_PRESENT_LBN) & |
@@ -164,6 +167,22 @@ int mdio_clause45_links_ok(struct efx_nic *efx, unsigned int mmd_mask) | |||
164 | int mmd = 0; | 167 | int mmd = 0; |
165 | int good; | 168 | int good; |
166 | 169 | ||
170 | /* If the port is in loopback, then we should only consider a subset | ||
171 | * of mmd's */ | ||
172 | if (LOOPBACK_INTERNAL(efx)) | ||
173 | return 1; | ||
174 | else if (efx->loopback_mode == LOOPBACK_NETWORK) | ||
175 | return 0; | ||
176 | else if (efx->loopback_mode == LOOPBACK_PHYXS) | ||
177 | mmd_mask &= ~(MDIO_MMDREG_DEVS0_PHYXS | | ||
178 | MDIO_MMDREG_DEVS0_PCS | | ||
179 | MDIO_MMDREG_DEVS0_PMAPMD); | ||
180 | else if (efx->loopback_mode == LOOPBACK_PCS) | ||
181 | mmd_mask &= ~(MDIO_MMDREG_DEVS0_PCS | | ||
182 | MDIO_MMDREG_DEVS0_PMAPMD); | ||
183 | else if (efx->loopback_mode == LOOPBACK_PMAPMD) | ||
184 | mmd_mask &= ~MDIO_MMDREG_DEVS0_PMAPMD; | ||
185 | |||
167 | while (mmd_mask) { | 186 | while (mmd_mask) { |
168 | if (mmd_mask & 1) { | 187 | if (mmd_mask & 1) { |
169 | /* Double reads because link state is latched, and a | 188 | /* Double reads because link state is latched, and a |
@@ -182,6 +201,65 @@ int mdio_clause45_links_ok(struct efx_nic *efx, unsigned int mmd_mask) | |||
182 | return ok; | 201 | return ok; |
183 | } | 202 | } |
184 | 203 | ||
204 | void mdio_clause45_transmit_disable(struct efx_nic *efx) | ||
205 | { | ||
206 | int phy_id = efx->mii.phy_id; | ||
207 | int ctrl1, ctrl2; | ||
208 | |||
209 | ctrl1 = ctrl2 = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD, | ||
210 | MDIO_MMDREG_TXDIS); | ||
211 | if (efx->tx_disabled) | ||
212 | ctrl2 |= (1 << MDIO_MMDREG_TXDIS_GLOBAL_LBN); | ||
213 | else | ||
214 | ctrl1 &= ~(1 << MDIO_MMDREG_TXDIS_GLOBAL_LBN); | ||
215 | if (ctrl1 != ctrl2) | ||
216 | mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD, | ||
217 | MDIO_MMDREG_TXDIS, ctrl2); | ||
218 | } | ||
219 | |||
220 | void mdio_clause45_phy_reconfigure(struct efx_nic *efx) | ||
221 | { | ||
222 | int phy_id = efx->mii.phy_id; | ||
223 | int ctrl1, ctrl2; | ||
224 | |||
225 | /* Handle (with debouncing) PMA/PMD loopback */ | ||
226 | ctrl1 = ctrl2 = mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD, | ||
227 | MDIO_MMDREG_CTRL1); | ||
228 | |||
229 | if (efx->loopback_mode == LOOPBACK_PMAPMD) | ||
230 | ctrl2 |= (1 << MDIO_PMAPMD_CTRL1_LBACK_LBN); | ||
231 | else | ||
232 | ctrl2 &= ~(1 << MDIO_PMAPMD_CTRL1_LBACK_LBN); | ||
233 | |||
234 | if (ctrl1 != ctrl2) | ||
235 | mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD, | ||
236 | MDIO_MMDREG_CTRL1, ctrl2); | ||
237 | |||
238 | /* Handle (with debouncing) PCS loopback */ | ||
239 | ctrl1 = ctrl2 = mdio_clause45_read(efx, phy_id, MDIO_MMD_PCS, | ||
240 | MDIO_MMDREG_CTRL1); | ||
241 | if (efx->loopback_mode == LOOPBACK_PCS) | ||
242 | ctrl2 |= (1 << MDIO_MMDREG_CTRL1_LBACK_LBN); | ||
243 | else | ||
244 | ctrl2 &= ~(1 << MDIO_MMDREG_CTRL1_LBACK_LBN); | ||
245 | |||
246 | if (ctrl1 != ctrl2) | ||
247 | mdio_clause45_write(efx, phy_id, MDIO_MMD_PCS, | ||
248 | MDIO_MMDREG_CTRL1, ctrl2); | ||
249 | |||
250 | /* Handle (with debouncing) PHYXS network loopback */ | ||
251 | ctrl1 = ctrl2 = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS, | ||
252 | MDIO_MMDREG_CTRL1); | ||
253 | if (efx->loopback_mode == LOOPBACK_NETWORK) | ||
254 | ctrl2 |= (1 << MDIO_MMDREG_CTRL1_LBACK_LBN); | ||
255 | else | ||
256 | ctrl2 &= ~(1 << MDIO_MMDREG_CTRL1_LBACK_LBN); | ||
257 | |||
258 | if (ctrl1 != ctrl2) | ||
259 | mdio_clause45_write(efx, phy_id, MDIO_MMD_PHYXS, | ||
260 | MDIO_MMDREG_CTRL1, ctrl2); | ||
261 | } | ||
262 | |||
185 | /** | 263 | /** |
186 | * mdio_clause45_get_settings - Read (some of) the PHY settings over MDIO. | 264 | * mdio_clause45_get_settings - Read (some of) the PHY settings over MDIO. |
187 | * @efx: Efx NIC | 265 | * @efx: Efx NIC |
diff --git a/drivers/net/sfc/mdio_10g.h b/drivers/net/sfc/mdio_10g.h index 2214b6d820a7..cb99f3f4491c 100644 --- a/drivers/net/sfc/mdio_10g.h +++ b/drivers/net/sfc/mdio_10g.h | |||
@@ -44,11 +44,16 @@ | |||
44 | #define MDIO_MMDREG_DEVS1 (6) | 44 | #define MDIO_MMDREG_DEVS1 (6) |
45 | #define MDIO_MMDREG_CTRL2 (7) | 45 | #define MDIO_MMDREG_CTRL2 (7) |
46 | #define MDIO_MMDREG_STAT2 (8) | 46 | #define MDIO_MMDREG_STAT2 (8) |
47 | #define MDIO_MMDREG_TXDIS (9) | ||
47 | 48 | ||
48 | /* Bits in MMDREG_CTRL1 */ | 49 | /* Bits in MMDREG_CTRL1 */ |
49 | /* Reset */ | 50 | /* Reset */ |
50 | #define MDIO_MMDREG_CTRL1_RESET_LBN (15) | 51 | #define MDIO_MMDREG_CTRL1_RESET_LBN (15) |
51 | #define MDIO_MMDREG_CTRL1_RESET_WIDTH (1) | 52 | #define MDIO_MMDREG_CTRL1_RESET_WIDTH (1) |
53 | /* Loopback */ | ||
54 | /* Loopback bit for WIS, PCS, PHYSX and DTEXS */ | ||
55 | #define MDIO_MMDREG_CTRL1_LBACK_LBN (14) | ||
56 | #define MDIO_MMDREG_CTRL1_LBACK_WIDTH (1) | ||
52 | 57 | ||
53 | /* Bits in MMDREG_STAT1 */ | 58 | /* Bits in MMDREG_STAT1 */ |
54 | #define MDIO_MMDREG_STAT1_FAULT_LBN (7) | 59 | #define MDIO_MMDREG_STAT1_FAULT_LBN (7) |
@@ -56,6 +61,9 @@ | |||
56 | /* Link state */ | 61 | /* Link state */ |
57 | #define MDIO_MMDREG_STAT1_LINK_LBN (2) | 62 | #define MDIO_MMDREG_STAT1_LINK_LBN (2) |
58 | #define MDIO_MMDREG_STAT1_LINK_WIDTH (1) | 63 | #define MDIO_MMDREG_STAT1_LINK_WIDTH (1) |
64 | /* Low power ability */ | ||
65 | #define MDIO_MMDREG_STAT1_LPABLE_LBN (1) | ||
66 | #define MDIO_MMDREG_STAT1_LPABLE_WIDTH (1) | ||
59 | 67 | ||
60 | /* Bits in ID reg */ | 68 | /* Bits in ID reg */ |
61 | #define MDIO_ID_REV(_id32) (_id32 & 0xf) | 69 | #define MDIO_ID_REV(_id32) (_id32 & 0xf) |
@@ -76,6 +84,14 @@ | |||
76 | #define MDIO_MMDREG_STAT2_PRESENT_LBN (14) | 84 | #define MDIO_MMDREG_STAT2_PRESENT_LBN (14) |
77 | #define MDIO_MMDREG_STAT2_PRESENT_WIDTH (2) | 85 | #define MDIO_MMDREG_STAT2_PRESENT_WIDTH (2) |
78 | 86 | ||
87 | /* Bits in MMDREG_TXDIS */ | ||
88 | #define MDIO_MMDREG_TXDIS_GLOBAL_LBN (0) | ||
89 | #define MDIO_MMDREG_TXDIS_GLOBAL_WIDTH (1) | ||
90 | |||
91 | /* MMD-specific bits, ordered by MMD, then register */ | ||
92 | #define MDIO_PMAPMD_CTRL1_LBACK_LBN (0) | ||
93 | #define MDIO_PMAPMD_CTRL1_LBACK_WIDTH (1) | ||
94 | |||
79 | /* PMA type (4 bits) */ | 95 | /* PMA type (4 bits) */ |
80 | #define MDIO_PMAPMD_CTRL2_10G_CX4 (0x0) | 96 | #define MDIO_PMAPMD_CTRL2_10G_CX4 (0x0) |
81 | #define MDIO_PMAPMD_CTRL2_10G_EW (0x1) | 97 | #define MDIO_PMAPMD_CTRL2_10G_EW (0x1) |
@@ -95,7 +111,7 @@ | |||
95 | #define MDIO_PMAPMD_CTRL2_10_BT (0xf) | 111 | #define MDIO_PMAPMD_CTRL2_10_BT (0xf) |
96 | #define MDIO_PMAPMD_CTRL2_TYPE_MASK (0xf) | 112 | #define MDIO_PMAPMD_CTRL2_TYPE_MASK (0xf) |
97 | 113 | ||
98 | /* /\* PHY XGXS lane state *\/ */ | 114 | /* PHY XGXS lane state */ |
99 | #define MDIO_PHYXS_LANE_STATE (0x18) | 115 | #define MDIO_PHYXS_LANE_STATE (0x18) |
100 | #define MDIO_PHYXS_LANE_ALIGNED_LBN (12) | 116 | #define MDIO_PHYXS_LANE_ALIGNED_LBN (12) |
101 | 117 | ||
@@ -217,6 +233,12 @@ int mdio_clause45_check_mmds(struct efx_nic *efx, | |||
217 | extern int mdio_clause45_links_ok(struct efx_nic *efx, | 233 | extern int mdio_clause45_links_ok(struct efx_nic *efx, |
218 | unsigned int mmd_mask); | 234 | unsigned int mmd_mask); |
219 | 235 | ||
236 | /* Generic transmit disable support though PMAPMD */ | ||
237 | extern void mdio_clause45_transmit_disable(struct efx_nic *efx); | ||
238 | |||
239 | /* Generic part of reconfigure: set/clear loopback bits */ | ||
240 | extern void mdio_clause45_phy_reconfigure(struct efx_nic *efx); | ||
241 | |||
220 | /* Read (some of) the PHY settings over MDIO */ | 242 | /* Read (some of) the PHY settings over MDIO */ |
221 | extern void mdio_clause45_get_settings(struct efx_nic *efx, | 243 | extern void mdio_clause45_get_settings(struct efx_nic *efx, |
222 | struct ethtool_cmd *ecmd); | 244 | struct ethtool_cmd *ecmd); |
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h index c505482c2520..59f261b4171f 100644 --- a/drivers/net/sfc/net_driver.h +++ b/drivers/net/sfc/net_driver.h | |||
@@ -134,6 +134,8 @@ struct efx_special_buffer { | |||
134 | * Set only on the final fragment of a packet; %NULL for all other | 134 | * Set only on the final fragment of a packet; %NULL for all other |
135 | * fragments. When this fragment completes, then we can free this | 135 | * fragments. When this fragment completes, then we can free this |
136 | * skb. | 136 | * skb. |
137 | * @tsoh: The associated TSO header structure, or %NULL if this | ||
138 | * buffer is not a TSO header. | ||
137 | * @dma_addr: DMA address of the fragment. | 139 | * @dma_addr: DMA address of the fragment. |
138 | * @len: Length of this fragment. | 140 | * @len: Length of this fragment. |
139 | * This field is zero when the queue slot is empty. | 141 | * This field is zero when the queue slot is empty. |
@@ -144,6 +146,7 @@ struct efx_special_buffer { | |||
144 | */ | 146 | */ |
145 | struct efx_tx_buffer { | 147 | struct efx_tx_buffer { |
146 | const struct sk_buff *skb; | 148 | const struct sk_buff *skb; |
149 | struct efx_tso_header *tsoh; | ||
147 | dma_addr_t dma_addr; | 150 | dma_addr_t dma_addr; |
148 | unsigned short len; | 151 | unsigned short len; |
149 | unsigned char continuation; | 152 | unsigned char continuation; |
@@ -187,6 +190,13 @@ struct efx_tx_buffer { | |||
187 | * variable indicates that the queue is full. This is to | 190 | * variable indicates that the queue is full. This is to |
188 | * avoid cache-line ping-pong between the xmit path and the | 191 | * avoid cache-line ping-pong between the xmit path and the |
189 | * completion path. | 192 | * completion path. |
193 | * @tso_headers_free: A list of TSO headers allocated for this TX queue | ||
194 | * that are not in use, and so available for new TSO sends. The list | ||
195 | * is protected by the TX queue lock. | ||
196 | * @tso_bursts: Number of times TSO xmit invoked by kernel | ||
197 | * @tso_long_headers: Number of packets with headers too long for standard | ||
198 | * blocks | ||
199 | * @tso_packets: Number of packets via the TSO xmit path | ||
190 | */ | 200 | */ |
191 | struct efx_tx_queue { | 201 | struct efx_tx_queue { |
192 | /* Members which don't change on the fast path */ | 202 | /* Members which don't change on the fast path */ |
@@ -206,6 +216,10 @@ struct efx_tx_queue { | |||
206 | unsigned int insert_count ____cacheline_aligned_in_smp; | 216 | unsigned int insert_count ____cacheline_aligned_in_smp; |
207 | unsigned int write_count; | 217 | unsigned int write_count; |
208 | unsigned int old_read_count; | 218 | unsigned int old_read_count; |
219 | struct efx_tso_header *tso_headers_free; | ||
220 | unsigned int tso_bursts; | ||
221 | unsigned int tso_long_headers; | ||
222 | unsigned int tso_packets; | ||
209 | }; | 223 | }; |
210 | 224 | ||
211 | /** | 225 | /** |
@@ -434,6 +448,9 @@ struct efx_board { | |||
434 | struct efx_blinker blinker; | 448 | struct efx_blinker blinker; |
435 | }; | 449 | }; |
436 | 450 | ||
451 | #define STRING_TABLE_LOOKUP(val, member) \ | ||
452 | member ## _names[val] | ||
453 | |||
437 | enum efx_int_mode { | 454 | enum efx_int_mode { |
438 | /* Be careful if altering to correct macro below */ | 455 | /* Be careful if altering to correct macro below */ |
439 | EFX_INT_MODE_MSIX = 0, | 456 | EFX_INT_MODE_MSIX = 0, |
@@ -506,6 +523,7 @@ enum efx_fc_type { | |||
506 | * @check_hw: Check hardware | 523 | * @check_hw: Check hardware |
507 | * @reset_xaui: Reset XAUI side of PHY for (software sequenced reset) | 524 | * @reset_xaui: Reset XAUI side of PHY for (software sequenced reset) |
508 | * @mmds: MMD presence mask | 525 | * @mmds: MMD presence mask |
526 | * @loopbacks: Supported loopback modes mask | ||
509 | */ | 527 | */ |
510 | struct efx_phy_operations { | 528 | struct efx_phy_operations { |
511 | int (*init) (struct efx_nic *efx); | 529 | int (*init) (struct efx_nic *efx); |
@@ -515,6 +533,7 @@ struct efx_phy_operations { | |||
515 | int (*check_hw) (struct efx_nic *efx); | 533 | int (*check_hw) (struct efx_nic *efx); |
516 | void (*reset_xaui) (struct efx_nic *efx); | 534 | void (*reset_xaui) (struct efx_nic *efx); |
517 | int mmds; | 535 | int mmds; |
536 | unsigned loopbacks; | ||
518 | }; | 537 | }; |
519 | 538 | ||
520 | /* | 539 | /* |
@@ -653,7 +672,6 @@ union efx_multicast_hash { | |||
653 | * @phy_op: PHY interface | 672 | * @phy_op: PHY interface |
654 | * @phy_data: PHY private data (including PHY-specific stats) | 673 | * @phy_data: PHY private data (including PHY-specific stats) |
655 | * @mii: PHY interface | 674 | * @mii: PHY interface |
656 | * @phy_powered: PHY power state | ||
657 | * @tx_disabled: PHY transmitter turned off | 675 | * @tx_disabled: PHY transmitter turned off |
658 | * @link_up: Link status | 676 | * @link_up: Link status |
659 | * @link_options: Link options (MII/GMII format) | 677 | * @link_options: Link options (MII/GMII format) |
@@ -662,6 +680,9 @@ union efx_multicast_hash { | |||
662 | * @multicast_hash: Multicast hash table | 680 | * @multicast_hash: Multicast hash table |
663 | * @flow_control: Flow control flags - separate RX/TX so can't use link_options | 681 | * @flow_control: Flow control flags - separate RX/TX so can't use link_options |
664 | * @reconfigure_work: work item for dealing with PHY events | 682 | * @reconfigure_work: work item for dealing with PHY events |
683 | * @loopback_mode: Loopback status | ||
684 | * @loopback_modes: Supported loopback mode bitmask | ||
685 | * @loopback_selftest: Offline self-test private state | ||
665 | * | 686 | * |
666 | * The @priv field of the corresponding &struct net_device points to | 687 | * The @priv field of the corresponding &struct net_device points to |
667 | * this. | 688 | * this. |
@@ -721,6 +742,7 @@ struct efx_nic { | |||
721 | struct efx_phy_operations *phy_op; | 742 | struct efx_phy_operations *phy_op; |
722 | void *phy_data; | 743 | void *phy_data; |
723 | struct mii_if_info mii; | 744 | struct mii_if_info mii; |
745 | unsigned tx_disabled; | ||
724 | 746 | ||
725 | int link_up; | 747 | int link_up; |
726 | unsigned int link_options; | 748 | unsigned int link_options; |
@@ -732,6 +754,10 @@ struct efx_nic { | |||
732 | struct work_struct reconfigure_work; | 754 | struct work_struct reconfigure_work; |
733 | 755 | ||
734 | atomic_t rx_reset; | 756 | atomic_t rx_reset; |
757 | enum efx_loopback_mode loopback_mode; | ||
758 | unsigned int loopback_modes; | ||
759 | |||
760 | void *loopback_selftest; | ||
735 | }; | 761 | }; |
736 | 762 | ||
737 | /** | 763 | /** |
diff --git a/drivers/net/sfc/rx.c b/drivers/net/sfc/rx.c index 551299b462ae..670622373ddf 100644 --- a/drivers/net/sfc/rx.c +++ b/drivers/net/sfc/rx.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include "rx.h" | 19 | #include "rx.h" |
20 | #include "efx.h" | 20 | #include "efx.h" |
21 | #include "falcon.h" | 21 | #include "falcon.h" |
22 | #include "selftest.h" | ||
22 | #include "workarounds.h" | 23 | #include "workarounds.h" |
23 | 24 | ||
24 | /* Number of RX descriptors pushed at once. */ | 25 | /* Number of RX descriptors pushed at once. */ |
@@ -683,6 +684,15 @@ void __efx_rx_packet(struct efx_channel *channel, | |||
683 | struct sk_buff *skb; | 684 | struct sk_buff *skb; |
684 | int lro = efx->net_dev->features & NETIF_F_LRO; | 685 | int lro = efx->net_dev->features & NETIF_F_LRO; |
685 | 686 | ||
687 | /* If we're in loopback test, then pass the packet directly to the | ||
688 | * loopback layer, and free the rx_buf here | ||
689 | */ | ||
690 | if (unlikely(efx->loopback_selftest)) { | ||
691 | efx_loopback_rx_packet(efx, rx_buf->data, rx_buf->len); | ||
692 | efx_free_rx_buffer(efx, rx_buf); | ||
693 | goto done; | ||
694 | } | ||
695 | |||
686 | if (rx_buf->skb) { | 696 | if (rx_buf->skb) { |
687 | prefetch(skb_shinfo(rx_buf->skb)); | 697 | prefetch(skb_shinfo(rx_buf->skb)); |
688 | 698 | ||
@@ -736,7 +746,6 @@ void __efx_rx_packet(struct efx_channel *channel, | |||
736 | /* Update allocation strategy method */ | 746 | /* Update allocation strategy method */ |
737 | channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; | 747 | channel->rx_alloc_level += RX_ALLOC_FACTOR_SKB; |
738 | 748 | ||
739 | /* fall-thru */ | ||
740 | done: | 749 | done: |
741 | efx->net_dev->last_rx = jiffies; | 750 | efx->net_dev->last_rx = jiffies; |
742 | } | 751 | } |
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c new file mode 100644 index 000000000000..cbda15946e8f --- /dev/null +++ b/drivers/net/sfc/selftest.c | |||
@@ -0,0 +1,717 @@ | |||
1 | /**************************************************************************** | ||
2 | * Driver for Solarflare Solarstorm network controllers and boards | ||
3 | * Copyright 2005-2006 Fen Systems Ltd. | ||
4 | * Copyright 2006-2008 Solarflare Communications Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation, incorporated herein by reference. | ||
9 | */ | ||
10 | |||
11 | #include <linux/netdevice.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/kernel_stat.h> | ||
15 | #include <linux/pci.h> | ||
16 | #include <linux/ethtool.h> | ||
17 | #include <linux/ip.h> | ||
18 | #include <linux/in.h> | ||
19 | #include <linux/udp.h> | ||
20 | #include <linux/rtnetlink.h> | ||
21 | #include <asm/io.h> | ||
22 | #include "net_driver.h" | ||
23 | #include "ethtool.h" | ||
24 | #include "efx.h" | ||
25 | #include "falcon.h" | ||
26 | #include "selftest.h" | ||
27 | #include "boards.h" | ||
28 | #include "workarounds.h" | ||
29 | #include "mac.h" | ||
30 | |||
31 | /* | ||
32 | * Loopback test packet structure | ||
33 | * | ||
34 | * The self-test should stress every RSS vector, and unfortunately | ||
35 | * Falcon only performs RSS on TCP/UDP packets. | ||
36 | */ | ||
37 | struct efx_loopback_payload { | ||
38 | struct ethhdr header; | ||
39 | struct iphdr ip; | ||
40 | struct udphdr udp; | ||
41 | __be16 iteration; | ||
42 | const char msg[64]; | ||
43 | } __attribute__ ((packed)); | ||
44 | |||
45 | /* Loopback test source MAC address */ | ||
46 | static const unsigned char payload_source[ETH_ALEN] = { | ||
47 | 0x00, 0x0f, 0x53, 0x1b, 0x1b, 0x1b, | ||
48 | }; | ||
49 | |||
50 | static const char *payload_msg = | ||
51 | "Hello world! This is an Efx loopback test in progress!"; | ||
52 | |||
53 | /** | ||
54 | * efx_selftest_state - persistent state during a selftest | ||
55 | * @flush: Drop all packets in efx_loopback_rx_packet | ||
56 | * @packet_count: Number of packets being used in this test | ||
57 | * @skbs: An array of skbs transmitted | ||
58 | * @rx_good: RX good packet count | ||
59 | * @rx_bad: RX bad packet count | ||
60 | * @payload: Payload used in tests | ||
61 | */ | ||
62 | struct efx_selftest_state { | ||
63 | int flush; | ||
64 | int packet_count; | ||
65 | struct sk_buff **skbs; | ||
66 | atomic_t rx_good; | ||
67 | atomic_t rx_bad; | ||
68 | struct efx_loopback_payload payload; | ||
69 | }; | ||
70 | |||
71 | /************************************************************************** | ||
72 | * | ||
73 | * Configurable values | ||
74 | * | ||
75 | **************************************************************************/ | ||
76 | |||
77 | /* Level of loopback testing | ||
78 | * | ||
79 | * The maximum packet burst length is 16**(n-1), i.e. | ||
80 | * | ||
81 | * - Level 0 : no packets | ||
82 | * - Level 1 : 1 packet | ||
83 | * - Level 2 : 17 packets (1 * 1 packet, 1 * 16 packets) | ||
84 | * - Level 3 : 273 packets (1 * 1 packet, 1 * 16 packet, 1 * 256 packets) | ||
85 | * | ||
86 | */ | ||
87 | static unsigned int loopback_test_level = 3; | ||
88 | |||
89 | /************************************************************************** | ||
90 | * | ||
91 | * Interrupt and event queue testing | ||
92 | * | ||
93 | **************************************************************************/ | ||
94 | |||
95 | /* Test generation and receipt of interrupts */ | ||
96 | static int efx_test_interrupts(struct efx_nic *efx, | ||
97 | struct efx_self_tests *tests) | ||
98 | { | ||
99 | struct efx_channel *channel; | ||
100 | |||
101 | EFX_LOG(efx, "testing interrupts\n"); | ||
102 | tests->interrupt = -1; | ||
103 | |||
104 | /* Reset interrupt flag */ | ||
105 | efx->last_irq_cpu = -1; | ||
106 | smp_wmb(); | ||
107 | |||
108 | /* ACK each interrupting event queue. Receiving an interrupt due to | ||
109 | * traffic before a test event is raised is considered a pass */ | ||
110 | efx_for_each_channel_with_interrupt(channel, efx) { | ||
111 | if (channel->work_pending) | ||
112 | efx_process_channel_now(channel); | ||
113 | if (efx->last_irq_cpu >= 0) | ||
114 | goto success; | ||
115 | } | ||
116 | |||
117 | falcon_generate_interrupt(efx); | ||
118 | |||
119 | /* Wait for arrival of test interrupt. */ | ||
120 | EFX_LOG(efx, "waiting for test interrupt\n"); | ||
121 | schedule_timeout_uninterruptible(HZ / 10); | ||
122 | if (efx->last_irq_cpu >= 0) | ||
123 | goto success; | ||
124 | |||
125 | EFX_ERR(efx, "timed out waiting for interrupt\n"); | ||
126 | return -ETIMEDOUT; | ||
127 | |||
128 | success: | ||
129 | EFX_LOG(efx, "test interrupt (mode %d) seen on CPU%d\n", | ||
130 | efx->interrupt_mode, efx->last_irq_cpu); | ||
131 | tests->interrupt = 1; | ||
132 | return 0; | ||
133 | } | ||
134 | |||
135 | /* Test generation and receipt of non-interrupting events */ | ||
136 | static int efx_test_eventq(struct efx_channel *channel, | ||
137 | struct efx_self_tests *tests) | ||
138 | { | ||
139 | unsigned int magic; | ||
140 | |||
141 | /* Channel specific code, limited to 20 bits */ | ||
142 | magic = (0x00010150 + channel->channel); | ||
143 | EFX_LOG(channel->efx, "channel %d testing event queue with code %x\n", | ||
144 | channel->channel, magic); | ||
145 | |||
146 | tests->eventq_dma[channel->channel] = -1; | ||
147 | tests->eventq_int[channel->channel] = 1; /* fake pass */ | ||
148 | tests->eventq_poll[channel->channel] = 1; /* fake pass */ | ||
149 | |||
150 | /* Reset flag and zero magic word */ | ||
151 | channel->efx->last_irq_cpu = -1; | ||
152 | channel->eventq_magic = 0; | ||
153 | smp_wmb(); | ||
154 | |||
155 | falcon_generate_test_event(channel, magic); | ||
156 | udelay(1); | ||
157 | |||
158 | efx_process_channel_now(channel); | ||
159 | if (channel->eventq_magic != magic) { | ||
160 | EFX_ERR(channel->efx, "channel %d failed to see test event\n", | ||
161 | channel->channel); | ||
162 | return -ETIMEDOUT; | ||
163 | } else { | ||
164 | tests->eventq_dma[channel->channel] = 1; | ||
165 | } | ||
166 | |||
167 | return 0; | ||
168 | } | ||
169 | |||
170 | /* Test generation and receipt of interrupting events */ | ||
171 | static int efx_test_eventq_irq(struct efx_channel *channel, | ||
172 | struct efx_self_tests *tests) | ||
173 | { | ||
174 | unsigned int magic, count; | ||
175 | |||
176 | /* Channel specific code, limited to 20 bits */ | ||
177 | magic = (0x00010150 + channel->channel); | ||
178 | EFX_LOG(channel->efx, "channel %d testing event queue with code %x\n", | ||
179 | channel->channel, magic); | ||
180 | |||
181 | tests->eventq_dma[channel->channel] = -1; | ||
182 | tests->eventq_int[channel->channel] = -1; | ||
183 | tests->eventq_poll[channel->channel] = -1; | ||
184 | |||
185 | /* Reset flag and zero magic word */ | ||
186 | channel->efx->last_irq_cpu = -1; | ||
187 | channel->eventq_magic = 0; | ||
188 | smp_wmb(); | ||
189 | |||
190 | falcon_generate_test_event(channel, magic); | ||
191 | |||
192 | /* Wait for arrival of interrupt */ | ||
193 | count = 0; | ||
194 | do { | ||
195 | schedule_timeout_uninterruptible(HZ / 100); | ||
196 | |||
197 | if (channel->work_pending) | ||
198 | efx_process_channel_now(channel); | ||
199 | |||
200 | if (channel->eventq_magic == magic) | ||
201 | goto eventq_ok; | ||
202 | } while (++count < 2); | ||
203 | |||
204 | EFX_ERR(channel->efx, "channel %d timed out waiting for event queue\n", | ||
205 | channel->channel); | ||
206 | |||
207 | /* See if interrupt arrived */ | ||
208 | if (channel->efx->last_irq_cpu >= 0) { | ||
209 | EFX_ERR(channel->efx, "channel %d saw interrupt on CPU%d " | ||
210 | "during event queue test\n", channel->channel, | ||
211 | raw_smp_processor_id()); | ||
212 | tests->eventq_int[channel->channel] = 1; | ||
213 | } | ||
214 | |||
215 | /* Check to see if event was received even if interrupt wasn't */ | ||
216 | efx_process_channel_now(channel); | ||
217 | if (channel->eventq_magic == magic) { | ||
218 | EFX_ERR(channel->efx, "channel %d event was generated, but " | ||
219 | "failed to trigger an interrupt\n", channel->channel); | ||
220 | tests->eventq_dma[channel->channel] = 1; | ||
221 | } | ||
222 | |||
223 | return -ETIMEDOUT; | ||
224 | eventq_ok: | ||
225 | EFX_LOG(channel->efx, "channel %d event queue passed\n", | ||
226 | channel->channel); | ||
227 | tests->eventq_dma[channel->channel] = 1; | ||
228 | tests->eventq_int[channel->channel] = 1; | ||
229 | tests->eventq_poll[channel->channel] = 1; | ||
230 | return 0; | ||
231 | } | ||
232 | |||
233 | /************************************************************************** | ||
234 | * | ||
235 | * PHY testing | ||
236 | * | ||
237 | **************************************************************************/ | ||
238 | |||
239 | /* Check PHY presence by reading the PHY ID registers */ | ||
240 | static int efx_test_phy(struct efx_nic *efx, | ||
241 | struct efx_self_tests *tests) | ||
242 | { | ||
243 | u16 physid1, physid2; | ||
244 | struct mii_if_info *mii = &efx->mii; | ||
245 | struct net_device *net_dev = efx->net_dev; | ||
246 | |||
247 | if (efx->phy_type == PHY_TYPE_NONE) | ||
248 | return 0; | ||
249 | |||
250 | EFX_LOG(efx, "testing PHY presence\n"); | ||
251 | tests->phy_ok = -1; | ||
252 | |||
253 | physid1 = mii->mdio_read(net_dev, mii->phy_id, MII_PHYSID1); | ||
254 | physid2 = mii->mdio_read(net_dev, mii->phy_id, MII_PHYSID2); | ||
255 | |||
256 | if ((physid1 != 0x0000) && (physid1 != 0xffff) && | ||
257 | (physid2 != 0x0000) && (physid2 != 0xffff)) { | ||
258 | EFX_LOG(efx, "found MII PHY %d ID 0x%x:%x\n", | ||
259 | mii->phy_id, physid1, physid2); | ||
260 | tests->phy_ok = 1; | ||
261 | return 0; | ||
262 | } | ||
263 | |||
264 | EFX_ERR(efx, "no MII PHY present with ID %d\n", mii->phy_id); | ||
265 | return -ENODEV; | ||
266 | } | ||
267 | |||
268 | /************************************************************************** | ||
269 | * | ||
270 | * Loopback testing | ||
271 | * NB Only one loopback test can be executing concurrently. | ||
272 | * | ||
273 | **************************************************************************/ | ||
274 | |||
275 | /* Loopback test RX callback | ||
276 | * This is called for each received packet during loopback testing. | ||
277 | */ | ||
278 | void efx_loopback_rx_packet(struct efx_nic *efx, | ||
279 | const char *buf_ptr, int pkt_len) | ||
280 | { | ||
281 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
282 | struct efx_loopback_payload *received; | ||
283 | struct efx_loopback_payload *payload; | ||
284 | |||
285 | BUG_ON(!buf_ptr); | ||
286 | |||
287 | /* If we are just flushing, then drop the packet */ | ||
288 | if ((state == NULL) || state->flush) | ||
289 | return; | ||
290 | |||
291 | payload = &state->payload; | ||
292 | |||
293 | received = (struct efx_loopback_payload *)(char *) buf_ptr; | ||
294 | received->ip.saddr = payload->ip.saddr; | ||
295 | received->ip.check = payload->ip.check; | ||
296 | |||
297 | /* Check that header exists */ | ||
298 | if (pkt_len < sizeof(received->header)) { | ||
299 | EFX_ERR(efx, "saw runt RX packet (length %d) in %s loopback " | ||
300 | "test\n", pkt_len, LOOPBACK_MODE(efx)); | ||
301 | goto err; | ||
302 | } | ||
303 | |||
304 | /* Check that the ethernet header exists */ | ||
305 | if (memcmp(&received->header, &payload->header, ETH_HLEN) != 0) { | ||
306 | EFX_ERR(efx, "saw non-loopback RX packet in %s loopback test\n", | ||
307 | LOOPBACK_MODE(efx)); | ||
308 | goto err; | ||
309 | } | ||
310 | |||
311 | /* Check packet length */ | ||
312 | if (pkt_len != sizeof(*payload)) { | ||
313 | EFX_ERR(efx, "saw incorrect RX packet length %d (wanted %d) in " | ||
314 | "%s loopback test\n", pkt_len, (int)sizeof(*payload), | ||
315 | LOOPBACK_MODE(efx)); | ||
316 | goto err; | ||
317 | } | ||
318 | |||
319 | /* Check that IP header matches */ | ||
320 | if (memcmp(&received->ip, &payload->ip, sizeof(payload->ip)) != 0) { | ||
321 | EFX_ERR(efx, "saw corrupted IP header in %s loopback test\n", | ||
322 | LOOPBACK_MODE(efx)); | ||
323 | goto err; | ||
324 | } | ||
325 | |||
326 | /* Check that msg and padding matches */ | ||
327 | if (memcmp(&received->msg, &payload->msg, sizeof(received->msg)) != 0) { | ||
328 | EFX_ERR(efx, "saw corrupted RX packet in %s loopback test\n", | ||
329 | LOOPBACK_MODE(efx)); | ||
330 | goto err; | ||
331 | } | ||
332 | |||
333 | /* Check that iteration matches */ | ||
334 | if (received->iteration != payload->iteration) { | ||
335 | EFX_ERR(efx, "saw RX packet from iteration %d (wanted %d) in " | ||
336 | "%s loopback test\n", ntohs(received->iteration), | ||
337 | ntohs(payload->iteration), LOOPBACK_MODE(efx)); | ||
338 | goto err; | ||
339 | } | ||
340 | |||
341 | /* Increase correct RX count */ | ||
342 | EFX_TRACE(efx, "got loopback RX in %s loopback test\n", | ||
343 | LOOPBACK_MODE(efx)); | ||
344 | |||
345 | atomic_inc(&state->rx_good); | ||
346 | return; | ||
347 | |||
348 | err: | ||
349 | #ifdef EFX_ENABLE_DEBUG | ||
350 | if (atomic_read(&state->rx_bad) == 0) { | ||
351 | EFX_ERR(efx, "received packet:\n"); | ||
352 | print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1, | ||
353 | buf_ptr, pkt_len, 0); | ||
354 | EFX_ERR(efx, "expected packet:\n"); | ||
355 | print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1, | ||
356 | &state->payload, sizeof(state->payload), 0); | ||
357 | } | ||
358 | #endif | ||
359 | atomic_inc(&state->rx_bad); | ||
360 | } | ||
361 | |||
362 | /* Initialise an efx_selftest_state for a new iteration */ | ||
363 | static void efx_iterate_state(struct efx_nic *efx) | ||
364 | { | ||
365 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
366 | struct net_device *net_dev = efx->net_dev; | ||
367 | struct efx_loopback_payload *payload = &state->payload; | ||
368 | |||
369 | /* Initialise the layerII header */ | ||
370 | memcpy(&payload->header.h_dest, net_dev->dev_addr, ETH_ALEN); | ||
371 | memcpy(&payload->header.h_source, &payload_source, ETH_ALEN); | ||
372 | payload->header.h_proto = htons(ETH_P_IP); | ||
373 | |||
374 | /* saddr set later and used as incrementing count */ | ||
375 | payload->ip.daddr = htonl(INADDR_LOOPBACK); | ||
376 | payload->ip.ihl = 5; | ||
377 | payload->ip.check = htons(0xdead); | ||
378 | payload->ip.tot_len = htons(sizeof(*payload) - sizeof(struct ethhdr)); | ||
379 | payload->ip.version = IPVERSION; | ||
380 | payload->ip.protocol = IPPROTO_UDP; | ||
381 | |||
382 | /* Initialise udp header */ | ||
383 | payload->udp.source = 0; | ||
384 | payload->udp.len = htons(sizeof(*payload) - sizeof(struct ethhdr) - | ||
385 | sizeof(struct iphdr)); | ||
386 | payload->udp.check = 0; /* checksum ignored */ | ||
387 | |||
388 | /* Fill out payload */ | ||
389 | payload->iteration = htons(ntohs(payload->iteration) + 1); | ||
390 | memcpy(&payload->msg, payload_msg, sizeof(payload_msg)); | ||
391 | |||
392 | /* Fill out remaining state members */ | ||
393 | atomic_set(&state->rx_good, 0); | ||
394 | atomic_set(&state->rx_bad, 0); | ||
395 | smp_wmb(); | ||
396 | } | ||
397 | |||
398 | static int efx_tx_loopback(struct efx_tx_queue *tx_queue) | ||
399 | { | ||
400 | struct efx_nic *efx = tx_queue->efx; | ||
401 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
402 | struct efx_loopback_payload *payload; | ||
403 | struct sk_buff *skb; | ||
404 | int i, rc; | ||
405 | |||
406 | /* Transmit N copies of buffer */ | ||
407 | for (i = 0; i < state->packet_count; i++) { | ||
408 | /* Allocate an skb, holding an extra reference for | ||
409 | * transmit completion counting */ | ||
410 | skb = alloc_skb(sizeof(state->payload), GFP_KERNEL); | ||
411 | if (!skb) | ||
412 | return -ENOMEM; | ||
413 | state->skbs[i] = skb; | ||
414 | skb_get(skb); | ||
415 | |||
416 | /* Copy the payload in, incrementing the source address to | ||
417 | * exercise the rss vectors */ | ||
418 | payload = ((struct efx_loopback_payload *) | ||
419 | skb_put(skb, sizeof(state->payload))); | ||
420 | memcpy(payload, &state->payload, sizeof(state->payload)); | ||
421 | payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2)); | ||
422 | |||
423 | /* Ensure everything we've written is visible to the | ||
424 | * interrupt handler. */ | ||
425 | smp_wmb(); | ||
426 | |||
427 | if (NET_DEV_REGISTERED(efx)) | ||
428 | netif_tx_lock_bh(efx->net_dev); | ||
429 | rc = efx_xmit(efx, tx_queue, skb); | ||
430 | if (NET_DEV_REGISTERED(efx)) | ||
431 | netif_tx_unlock_bh(efx->net_dev); | ||
432 | |||
433 | if (rc != NETDEV_TX_OK) { | ||
434 | EFX_ERR(efx, "TX queue %d could not transmit packet %d " | ||
435 | "of %d in %s loopback test\n", tx_queue->queue, | ||
436 | i + 1, state->packet_count, LOOPBACK_MODE(efx)); | ||
437 | |||
438 | /* Defer cleaning up the other skbs for the caller */ | ||
439 | kfree_skb(skb); | ||
440 | return -EPIPE; | ||
441 | } | ||
442 | } | ||
443 | |||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | static int efx_rx_loopback(struct efx_tx_queue *tx_queue, | ||
448 | struct efx_loopback_self_tests *lb_tests) | ||
449 | { | ||
450 | struct efx_nic *efx = tx_queue->efx; | ||
451 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
452 | struct sk_buff *skb; | ||
453 | int tx_done = 0, rx_good, rx_bad; | ||
454 | int i, rc = 0; | ||
455 | |||
456 | if (NET_DEV_REGISTERED(efx)) | ||
457 | netif_tx_lock_bh(efx->net_dev); | ||
458 | |||
459 | /* Count the number of tx completions, and decrement the refcnt. Any | ||
460 | * skbs not already completed will be free'd when the queue is flushed */ | ||
461 | for (i=0; i < state->packet_count; i++) { | ||
462 | skb = state->skbs[i]; | ||
463 | if (skb && !skb_shared(skb)) | ||
464 | ++tx_done; | ||
465 | dev_kfree_skb_any(skb); | ||
466 | } | ||
467 | |||
468 | if (NET_DEV_REGISTERED(efx)) | ||
469 | netif_tx_unlock_bh(efx->net_dev); | ||
470 | |||
471 | /* Check TX completion and received packet counts */ | ||
472 | rx_good = atomic_read(&state->rx_good); | ||
473 | rx_bad = atomic_read(&state->rx_bad); | ||
474 | if (tx_done != state->packet_count) { | ||
475 | /* Don't free the skbs; they will be picked up on TX | ||
476 | * overflow or channel teardown. | ||
477 | */ | ||
478 | EFX_ERR(efx, "TX queue %d saw only %d out of an expected %d " | ||
479 | "TX completion events in %s loopback test\n", | ||
480 | tx_queue->queue, tx_done, state->packet_count, | ||
481 | LOOPBACK_MODE(efx)); | ||
482 | rc = -ETIMEDOUT; | ||
483 | /* Allow to fall through so we see the RX errors as well */ | ||
484 | } | ||
485 | |||
486 | /* We may always be up to a flush away from our desired packet total */ | ||
487 | if (rx_good != state->packet_count) { | ||
488 | EFX_LOG(efx, "TX queue %d saw only %d out of an expected %d " | ||
489 | "received packets in %s loopback test\n", | ||
490 | tx_queue->queue, rx_good, state->packet_count, | ||
491 | LOOPBACK_MODE(efx)); | ||
492 | rc = -ETIMEDOUT; | ||
493 | /* Fall through */ | ||
494 | } | ||
495 | |||
496 | /* Update loopback test structure */ | ||
497 | lb_tests->tx_sent[tx_queue->queue] += state->packet_count; | ||
498 | lb_tests->tx_done[tx_queue->queue] += tx_done; | ||
499 | lb_tests->rx_good += rx_good; | ||
500 | lb_tests->rx_bad += rx_bad; | ||
501 | |||
502 | return rc; | ||
503 | } | ||
504 | |||
505 | static int | ||
506 | efx_test_loopback(struct efx_tx_queue *tx_queue, | ||
507 | struct efx_loopback_self_tests *lb_tests) | ||
508 | { | ||
509 | struct efx_nic *efx = tx_queue->efx; | ||
510 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
511 | struct efx_channel *channel; | ||
512 | int i, rc = 0; | ||
513 | |||
514 | for (i = 0; i < loopback_test_level; i++) { | ||
515 | /* Determine how many packets to send */ | ||
516 | state->packet_count = (efx->type->txd_ring_mask + 1) / 3; | ||
517 | state->packet_count = min(1 << (i << 2), state->packet_count); | ||
518 | state->skbs = kzalloc(sizeof(state->skbs[0]) * | ||
519 | state->packet_count, GFP_KERNEL); | ||
520 | state->flush = 0; | ||
521 | |||
522 | EFX_LOG(efx, "TX queue %d testing %s loopback with %d " | ||
523 | "packets\n", tx_queue->queue, LOOPBACK_MODE(efx), | ||
524 | state->packet_count); | ||
525 | |||
526 | efx_iterate_state(efx); | ||
527 | rc = efx_tx_loopback(tx_queue); | ||
528 | |||
529 | /* NAPI polling is not enabled, so process channels synchronously */ | ||
530 | schedule_timeout_uninterruptible(HZ / 50); | ||
531 | efx_for_each_channel_with_interrupt(channel, efx) { | ||
532 | if (channel->work_pending) | ||
533 | efx_process_channel_now(channel); | ||
534 | } | ||
535 | |||
536 | rc |= efx_rx_loopback(tx_queue, lb_tests); | ||
537 | kfree(state->skbs); | ||
538 | |||
539 | if (rc) { | ||
540 | /* Wait a while to ensure there are no packets | ||
541 | * floating around after a failure. */ | ||
542 | schedule_timeout_uninterruptible(HZ / 10); | ||
543 | return rc; | ||
544 | } | ||
545 | } | ||
546 | |||
547 | EFX_LOG(efx, "TX queue %d passed %s loopback test with a burst length " | ||
548 | "of %d packets\n", tx_queue->queue, LOOPBACK_MODE(efx), | ||
549 | state->packet_count); | ||
550 | |||
551 | return rc; | ||
552 | } | ||
553 | |||
554 | static int efx_test_loopbacks(struct efx_nic *efx, | ||
555 | struct efx_self_tests *tests, | ||
556 | unsigned int loopback_modes) | ||
557 | { | ||
558 | struct efx_selftest_state *state = efx->loopback_selftest; | ||
559 | struct ethtool_cmd ecmd, ecmd_loopback; | ||
560 | struct efx_tx_queue *tx_queue; | ||
561 | enum efx_loopback_mode old_mode, mode; | ||
562 | int count, rc = 0, link_up; | ||
563 | |||
564 | rc = efx_ethtool_get_settings(efx->net_dev, &ecmd); | ||
565 | if (rc) { | ||
566 | EFX_ERR(efx, "could not get GMII settings\n"); | ||
567 | return rc; | ||
568 | } | ||
569 | old_mode = efx->loopback_mode; | ||
570 | |||
571 | /* Disable autonegotiation for the purposes of loopback */ | ||
572 | memcpy(&ecmd_loopback, &ecmd, sizeof(ecmd_loopback)); | ||
573 | if (ecmd_loopback.autoneg == AUTONEG_ENABLE) { | ||
574 | ecmd_loopback.autoneg = AUTONEG_DISABLE; | ||
575 | ecmd_loopback.duplex = DUPLEX_FULL; | ||
576 | ecmd_loopback.speed = SPEED_10000; | ||
577 | } | ||
578 | |||
579 | rc = efx_ethtool_set_settings(efx->net_dev, &ecmd_loopback); | ||
580 | if (rc) { | ||
581 | EFX_ERR(efx, "could not disable autonegotiation\n"); | ||
582 | goto out; | ||
583 | } | ||
584 | tests->loopback_speed = ecmd_loopback.speed; | ||
585 | tests->loopback_full_duplex = ecmd_loopback.duplex; | ||
586 | |||
587 | /* Test all supported loopback modes */ | ||
588 | for (mode = LOOPBACK_NONE; mode < LOOPBACK_TEST_MAX; mode++) { | ||
589 | if (!(loopback_modes & (1 << mode))) | ||
590 | continue; | ||
591 | |||
592 | /* Move the port into the specified loopback mode. */ | ||
593 | state->flush = 1; | ||
594 | efx->loopback_mode = mode; | ||
595 | efx_reconfigure_port(efx); | ||
596 | |||
597 | /* Wait for the PHY to signal the link is up */ | ||
598 | count = 0; | ||
599 | do { | ||
600 | struct efx_channel *channel = &efx->channel[0]; | ||
601 | |||
602 | falcon_check_xmac(efx); | ||
603 | schedule_timeout_uninterruptible(HZ / 10); | ||
604 | if (channel->work_pending) | ||
605 | efx_process_channel_now(channel); | ||
606 | /* Wait for PHY events to be processed */ | ||
607 | flush_workqueue(efx->workqueue); | ||
608 | rmb(); | ||
609 | |||
610 | /* efx->link_up can be 1 even if the XAUI link is down, | ||
611 | * (bug5762). Usually, it's not worth bothering with the | ||
612 | * difference, but for selftests, we need that extra | ||
613 | * guarantee that the link is really, really, up. | ||
614 | */ | ||
615 | link_up = efx->link_up; | ||
616 | if (!falcon_xaui_link_ok(efx)) | ||
617 | link_up = 0; | ||
618 | |||
619 | } while ((++count < 20) && !link_up); | ||
620 | |||
621 | /* The link should now be up. If it isn't, there is no point | ||
622 | * in attempting a loopback test */ | ||
623 | if (!link_up) { | ||
624 | EFX_ERR(efx, "loopback %s never came up\n", | ||
625 | LOOPBACK_MODE(efx)); | ||
626 | rc = -EIO; | ||
627 | goto out; | ||
628 | } | ||
629 | |||
630 | EFX_LOG(efx, "link came up in %s loopback in %d iterations\n", | ||
631 | LOOPBACK_MODE(efx), count); | ||
632 | |||
633 | /* Test every TX queue */ | ||
634 | efx_for_each_tx_queue(tx_queue, efx) { | ||
635 | rc |= efx_test_loopback(tx_queue, | ||
636 | &tests->loopback[mode]); | ||
637 | if (rc) | ||
638 | goto out; | ||
639 | } | ||
640 | } | ||
641 | |||
642 | out: | ||
643 | /* Take out of loopback and restore PHY settings */ | ||
644 | state->flush = 1; | ||
645 | efx->loopback_mode = old_mode; | ||
646 | efx_ethtool_set_settings(efx->net_dev, &ecmd); | ||
647 | |||
648 | return rc; | ||
649 | } | ||
650 | |||
651 | /************************************************************************** | ||
652 | * | ||
653 | * Entry points | ||
654 | * | ||
655 | *************************************************************************/ | ||
656 | |||
657 | /* Online (i.e. non-disruptive) testing | ||
658 | * This checks interrupt generation, event delivery and PHY presence. */ | ||
659 | int efx_online_test(struct efx_nic *efx, struct efx_self_tests *tests) | ||
660 | { | ||
661 | struct efx_channel *channel; | ||
662 | int rc = 0; | ||
663 | |||
664 | EFX_LOG(efx, "performing online self-tests\n"); | ||
665 | |||
666 | rc |= efx_test_interrupts(efx, tests); | ||
667 | efx_for_each_channel(channel, efx) { | ||
668 | if (channel->has_interrupt) | ||
669 | rc |= efx_test_eventq_irq(channel, tests); | ||
670 | else | ||
671 | rc |= efx_test_eventq(channel, tests); | ||
672 | } | ||
673 | rc |= efx_test_phy(efx, tests); | ||
674 | |||
675 | if (rc) | ||
676 | EFX_ERR(efx, "failed online self-tests\n"); | ||
677 | |||
678 | return rc; | ||
679 | } | ||
680 | |||
681 | /* Offline (i.e. disruptive) testing | ||
682 | * This checks MAC and PHY loopback on the specified port. */ | ||
683 | int efx_offline_test(struct efx_nic *efx, | ||
684 | struct efx_self_tests *tests, unsigned int loopback_modes) | ||
685 | { | ||
686 | struct efx_selftest_state *state; | ||
687 | int rc = 0; | ||
688 | |||
689 | EFX_LOG(efx, "performing offline self-tests\n"); | ||
690 | |||
691 | /* Create a selftest_state structure to hold state for the test */ | ||
692 | state = kzalloc(sizeof(*state), GFP_KERNEL); | ||
693 | if (state == NULL) { | ||
694 | rc = -ENOMEM; | ||
695 | goto out; | ||
696 | } | ||
697 | |||
698 | /* Set the port loopback_selftest member. From this point on | ||
699 | * all received packets will be dropped. Mark the state as | ||
700 | * "flushing" so all inflight packets are dropped */ | ||
701 | BUG_ON(efx->loopback_selftest); | ||
702 | state->flush = 1; | ||
703 | efx->loopback_selftest = (void *)state; | ||
704 | |||
705 | rc = efx_test_loopbacks(efx, tests, loopback_modes); | ||
706 | |||
707 | efx->loopback_selftest = NULL; | ||
708 | wmb(); | ||
709 | kfree(state); | ||
710 | |||
711 | out: | ||
712 | if (rc) | ||
713 | EFX_ERR(efx, "failed offline self-tests\n"); | ||
714 | |||
715 | return rc; | ||
716 | } | ||
717 | |||
diff --git a/drivers/net/sfc/selftest.h b/drivers/net/sfc/selftest.h new file mode 100644 index 000000000000..f6999c2b622d --- /dev/null +++ b/drivers/net/sfc/selftest.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /**************************************************************************** | ||
2 | * Driver for Solarflare Solarstorm network controllers and boards | ||
3 | * Copyright 2005-2006 Fen Systems Ltd. | ||
4 | * Copyright 2006-2008 Solarflare Communications Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License version 2 as published | ||
8 | * by the Free Software Foundation, incorporated herein by reference. | ||
9 | */ | ||
10 | |||
11 | #ifndef EFX_SELFTEST_H | ||
12 | #define EFX_SELFTEST_H | ||
13 | |||
14 | #include "net_driver.h" | ||
15 | |||
16 | /* | ||
17 | * Self tests | ||
18 | */ | ||
19 | |||
20 | struct efx_loopback_self_tests { | ||
21 | int tx_sent[EFX_MAX_TX_QUEUES]; | ||
22 | int tx_done[EFX_MAX_TX_QUEUES]; | ||
23 | int rx_good; | ||
24 | int rx_bad; | ||
25 | }; | ||
26 | |||
27 | /* Efx self test results | ||
28 | * For fields which are not counters, 1 indicates success and -1 | ||
29 | * indicates failure. | ||
30 | */ | ||
31 | struct efx_self_tests { | ||
32 | int interrupt; | ||
33 | int eventq_dma[EFX_MAX_CHANNELS]; | ||
34 | int eventq_int[EFX_MAX_CHANNELS]; | ||
35 | int eventq_poll[EFX_MAX_CHANNELS]; | ||
36 | int phy_ok; | ||
37 | int loopback_speed; | ||
38 | int loopback_full_duplex; | ||
39 | struct efx_loopback_self_tests loopback[LOOPBACK_TEST_MAX]; | ||
40 | }; | ||
41 | |||
42 | extern void efx_loopback_rx_packet(struct efx_nic *efx, | ||
43 | const char *buf_ptr, int pkt_len); | ||
44 | extern int efx_online_test(struct efx_nic *efx, | ||
45 | struct efx_self_tests *tests); | ||
46 | extern int efx_offline_test(struct efx_nic *efx, | ||
47 | struct efx_self_tests *tests, | ||
48 | unsigned int loopback_modes); | ||
49 | |||
50 | #endif /* EFX_SELFTEST_H */ | ||
diff --git a/drivers/net/sfc/sfe4001.c b/drivers/net/sfc/sfe4001.c index 11fa9fb8f48b..725d1a539c49 100644 --- a/drivers/net/sfc/sfe4001.c +++ b/drivers/net/sfc/sfe4001.c | |||
@@ -130,6 +130,15 @@ void sfe4001_poweroff(struct efx_nic *efx) | |||
130 | (void) efx_i2c_read(i2c, MAX6647, RSL, &in, 1); | 130 | (void) efx_i2c_read(i2c, MAX6647, RSL, &in, 1); |
131 | } | 131 | } |
132 | 132 | ||
133 | /* The P0_EN_3V3X line on SFE4001 boards (from A2 onward) is connected | ||
134 | * to the FLASH_CFG_1 input on the DSP. We must keep it high at power- | ||
135 | * up to allow writing the flash (done through MDIO from userland). | ||
136 | */ | ||
137 | unsigned int sfe4001_phy_flash_cfg; | ||
138 | module_param_named(phy_flash_cfg, sfe4001_phy_flash_cfg, uint, 0444); | ||
139 | MODULE_PARM_DESC(phy_flash_cfg, | ||
140 | "Force PHY to enter flash configuration mode"); | ||
141 | |||
133 | /* This board uses an I2C expander to provider power to the PHY, which needs to | 142 | /* This board uses an I2C expander to provider power to the PHY, which needs to |
134 | * be turned on before the PHY can be used. | 143 | * be turned on before the PHY can be used. |
135 | * Context: Process context, rtnl lock held | 144 | * Context: Process context, rtnl lock held |
@@ -203,6 +212,8 @@ int sfe4001_poweron(struct efx_nic *efx) | |||
203 | out = 0xff & ~((1 << P0_EN_1V2_LBN) | (1 << P0_EN_2V5_LBN) | | 212 | out = 0xff & ~((1 << P0_EN_1V2_LBN) | (1 << P0_EN_2V5_LBN) | |
204 | (1 << P0_EN_3V3X_LBN) | (1 << P0_EN_5V_LBN) | | 213 | (1 << P0_EN_3V3X_LBN) | (1 << P0_EN_5V_LBN) | |
205 | (1 << P0_X_TRST_LBN)); | 214 | (1 << P0_X_TRST_LBN)); |
215 | if (sfe4001_phy_flash_cfg) | ||
216 | out |= 1 << P0_EN_3V3X_LBN; | ||
206 | 217 | ||
207 | rc = efx_i2c_write(i2c, PCA9539, P0_OUT, &out, 1); | 218 | rc = efx_i2c_write(i2c, PCA9539, P0_OUT, &out, 1); |
208 | if (rc) | 219 | if (rc) |
@@ -226,6 +237,9 @@ int sfe4001_poweron(struct efx_nic *efx) | |||
226 | if (in & (1 << P1_AFE_PWD_LBN)) | 237 | if (in & (1 << P1_AFE_PWD_LBN)) |
227 | goto done; | 238 | goto done; |
228 | 239 | ||
240 | /* DSP doesn't look powered in flash config mode */ | ||
241 | if (sfe4001_phy_flash_cfg) | ||
242 | goto done; | ||
229 | } while (++count < 20); | 243 | } while (++count < 20); |
230 | 244 | ||
231 | EFX_INFO(efx, "timed out waiting for power\n"); | 245 | EFX_INFO(efx, "timed out waiting for power\n"); |
diff --git a/drivers/net/sfc/tenxpress.c b/drivers/net/sfc/tenxpress.c index a2e9f79e47b1..b1cd6deec01f 100644 --- a/drivers/net/sfc/tenxpress.c +++ b/drivers/net/sfc/tenxpress.c | |||
@@ -24,6 +24,11 @@ | |||
24 | MDIO_MMDREG_DEVS0_PCS | \ | 24 | MDIO_MMDREG_DEVS0_PCS | \ |
25 | MDIO_MMDREG_DEVS0_PHYXS) | 25 | MDIO_MMDREG_DEVS0_PHYXS) |
26 | 26 | ||
27 | #define TENXPRESS_LOOPBACKS ((1 << LOOPBACK_PHYXS) | \ | ||
28 | (1 << LOOPBACK_PCS) | \ | ||
29 | (1 << LOOPBACK_PMAPMD) | \ | ||
30 | (1 << LOOPBACK_NETWORK)) | ||
31 | |||
27 | /* We complain if we fail to see the link partner as 10G capable this many | 32 | /* We complain if we fail to see the link partner as 10G capable this many |
28 | * times in a row (must be > 1 as sampling the autoneg. registers is racy) | 33 | * times in a row (must be > 1 as sampling the autoneg. registers is racy) |
29 | */ | 34 | */ |
@@ -72,6 +77,10 @@ | |||
72 | #define PMA_PMD_BIST_RXD_LBN (1) | 77 | #define PMA_PMD_BIST_RXD_LBN (1) |
73 | #define PMA_PMD_BIST_AFE_LBN (0) | 78 | #define PMA_PMD_BIST_AFE_LBN (0) |
74 | 79 | ||
80 | /* Special Software reset register */ | ||
81 | #define PMA_PMD_EXT_CTRL_REG 49152 | ||
82 | #define PMA_PMD_EXT_SSR_LBN 15 | ||
83 | |||
75 | #define BIST_MAX_DELAY (1000) | 84 | #define BIST_MAX_DELAY (1000) |
76 | #define BIST_POLL_DELAY (10) | 85 | #define BIST_POLL_DELAY (10) |
77 | 86 | ||
@@ -86,6 +95,11 @@ | |||
86 | #define PCS_TEST_SELECT_REG 0xd807 /* PRM 10.5.8 */ | 95 | #define PCS_TEST_SELECT_REG 0xd807 /* PRM 10.5.8 */ |
87 | #define CLK312_EN_LBN 3 | 96 | #define CLK312_EN_LBN 3 |
88 | 97 | ||
98 | /* PHYXS registers */ | ||
99 | #define PHYXS_TEST1 (49162) | ||
100 | #define LOOPBACK_NEAR_LBN (8) | ||
101 | #define LOOPBACK_NEAR_WIDTH (1) | ||
102 | |||
89 | /* Boot status register */ | 103 | /* Boot status register */ |
90 | #define PCS_BOOT_STATUS_REG (0xd000) | 104 | #define PCS_BOOT_STATUS_REG (0xd000) |
91 | #define PCS_BOOT_FATAL_ERR_LBN (0) | 105 | #define PCS_BOOT_FATAL_ERR_LBN (0) |
@@ -106,7 +120,9 @@ MODULE_PARM_DESC(crc_error_reset_threshold, | |||
106 | 120 | ||
107 | struct tenxpress_phy_data { | 121 | struct tenxpress_phy_data { |
108 | enum tenxpress_state state; | 122 | enum tenxpress_state state; |
123 | enum efx_loopback_mode loopback_mode; | ||
109 | atomic_t bad_crc_count; | 124 | atomic_t bad_crc_count; |
125 | int tx_disabled; | ||
110 | int bad_lp_tries; | 126 | int bad_lp_tries; |
111 | }; | 127 | }; |
112 | 128 | ||
@@ -199,10 +215,12 @@ static int tenxpress_phy_init(struct efx_nic *efx) | |||
199 | 215 | ||
200 | tenxpress_set_state(efx, TENXPRESS_STATUS_NORMAL); | 216 | tenxpress_set_state(efx, TENXPRESS_STATUS_NORMAL); |
201 | 217 | ||
202 | rc = mdio_clause45_wait_reset_mmds(efx, | 218 | if (!sfe4001_phy_flash_cfg) { |
203 | TENXPRESS_REQUIRED_DEVS); | 219 | rc = mdio_clause45_wait_reset_mmds(efx, |
204 | if (rc < 0) | 220 | TENXPRESS_REQUIRED_DEVS); |
205 | goto fail; | 221 | if (rc < 0) |
222 | goto fail; | ||
223 | } | ||
206 | 224 | ||
207 | rc = mdio_clause45_check_mmds(efx, TENXPRESS_REQUIRED_DEVS, 0); | 225 | rc = mdio_clause45_check_mmds(efx, TENXPRESS_REQUIRED_DEVS, 0); |
208 | if (rc < 0) | 226 | if (rc < 0) |
@@ -225,6 +243,35 @@ static int tenxpress_phy_init(struct efx_nic *efx) | |||
225 | return rc; | 243 | return rc; |
226 | } | 244 | } |
227 | 245 | ||
246 | static int tenxpress_special_reset(struct efx_nic *efx) | ||
247 | { | ||
248 | int rc, reg; | ||
249 | |||
250 | EFX_TRACE(efx, "%s\n", __func__); | ||
251 | |||
252 | /* Initiate reset */ | ||
253 | reg = mdio_clause45_read(efx, efx->mii.phy_id, | ||
254 | MDIO_MMD_PMAPMD, PMA_PMD_EXT_CTRL_REG); | ||
255 | reg |= (1 << PMA_PMD_EXT_SSR_LBN); | ||
256 | mdio_clause45_write(efx, efx->mii.phy_id, MDIO_MMD_PMAPMD, | ||
257 | PMA_PMD_EXT_CTRL_REG, reg); | ||
258 | |||
259 | msleep(200); | ||
260 | |||
261 | /* Wait for the blocks to come out of reset */ | ||
262 | rc = mdio_clause45_wait_reset_mmds(efx, | ||
263 | TENXPRESS_REQUIRED_DEVS); | ||
264 | if (rc < 0) | ||
265 | return rc; | ||
266 | |||
267 | /* Try and reconfigure the device */ | ||
268 | rc = tenxpress_init(efx); | ||
269 | if (rc < 0) | ||
270 | return rc; | ||
271 | |||
272 | return 0; | ||
273 | } | ||
274 | |||
228 | static void tenxpress_set_bad_lp(struct efx_nic *efx, int bad_lp) | 275 | static void tenxpress_set_bad_lp(struct efx_nic *efx, int bad_lp) |
229 | { | 276 | { |
230 | struct tenxpress_phy_data *pd = efx->phy_data; | 277 | struct tenxpress_phy_data *pd = efx->phy_data; |
@@ -299,11 +346,46 @@ static int tenxpress_link_ok(struct efx_nic *efx, int check_lp) | |||
299 | return ok; | 346 | return ok; |
300 | } | 347 | } |
301 | 348 | ||
349 | static void tenxpress_phyxs_loopback(struct efx_nic *efx) | ||
350 | { | ||
351 | int phy_id = efx->mii.phy_id; | ||
352 | int ctrl1, ctrl2; | ||
353 | |||
354 | ctrl1 = ctrl2 = mdio_clause45_read(efx, phy_id, MDIO_MMD_PHYXS, | ||
355 | PHYXS_TEST1); | ||
356 | if (efx->loopback_mode == LOOPBACK_PHYXS) | ||
357 | ctrl2 |= (1 << LOOPBACK_NEAR_LBN); | ||
358 | else | ||
359 | ctrl2 &= ~(1 << LOOPBACK_NEAR_LBN); | ||
360 | if (ctrl1 != ctrl2) | ||
361 | mdio_clause45_write(efx, phy_id, MDIO_MMD_PHYXS, | ||
362 | PHYXS_TEST1, ctrl2); | ||
363 | } | ||
364 | |||
302 | static void tenxpress_phy_reconfigure(struct efx_nic *efx) | 365 | static void tenxpress_phy_reconfigure(struct efx_nic *efx) |
303 | { | 366 | { |
367 | struct tenxpress_phy_data *phy_data = efx->phy_data; | ||
368 | int loop_change = LOOPBACK_OUT_OF(phy_data, efx, | ||
369 | TENXPRESS_LOOPBACKS); | ||
370 | |||
304 | if (!tenxpress_state_is(efx, TENXPRESS_STATUS_NORMAL)) | 371 | if (!tenxpress_state_is(efx, TENXPRESS_STATUS_NORMAL)) |
305 | return; | 372 | return; |
306 | 373 | ||
374 | /* When coming out of transmit disable, coming out of low power | ||
375 | * mode, or moving out of any PHY internal loopback mode, | ||
376 | * perform a special software reset */ | ||
377 | if ((phy_data->tx_disabled && !efx->tx_disabled) || | ||
378 | loop_change) { | ||
379 | (void) tenxpress_special_reset(efx); | ||
380 | falcon_reset_xaui(efx); | ||
381 | } | ||
382 | |||
383 | mdio_clause45_transmit_disable(efx); | ||
384 | mdio_clause45_phy_reconfigure(efx); | ||
385 | tenxpress_phyxs_loopback(efx); | ||
386 | |||
387 | phy_data->tx_disabled = efx->tx_disabled; | ||
388 | phy_data->loopback_mode = efx->loopback_mode; | ||
307 | efx->link_up = tenxpress_link_ok(efx, 0); | 389 | efx->link_up = tenxpress_link_ok(efx, 0); |
308 | efx->link_options = GM_LPA_10000FULL; | 390 | efx->link_options = GM_LPA_10000FULL; |
309 | } | 391 | } |
@@ -431,4 +513,5 @@ struct efx_phy_operations falcon_tenxpress_phy_ops = { | |||
431 | .clear_interrupt = tenxpress_phy_clear_interrupt, | 513 | .clear_interrupt = tenxpress_phy_clear_interrupt, |
432 | .reset_xaui = tenxpress_reset_xaui, | 514 | .reset_xaui = tenxpress_reset_xaui, |
433 | .mmds = TENXPRESS_REQUIRED_DEVS, | 515 | .mmds = TENXPRESS_REQUIRED_DEVS, |
516 | .loopbacks = TENXPRESS_LOOPBACKS, | ||
434 | }; | 517 | }; |
diff --git a/drivers/net/sfc/tx.c b/drivers/net/sfc/tx.c index fbb866b2185e..9b436f5b4888 100644 --- a/drivers/net/sfc/tx.c +++ b/drivers/net/sfc/tx.c | |||
@@ -82,6 +82,46 @@ static inline void efx_dequeue_buffer(struct efx_tx_queue *tx_queue, | |||
82 | } | 82 | } |
83 | } | 83 | } |
84 | 84 | ||
85 | /** | ||
86 | * struct efx_tso_header - a DMA mapped buffer for packet headers | ||
87 | * @next: Linked list of free ones. | ||
88 | * The list is protected by the TX queue lock. | ||
89 | * @dma_unmap_len: Length to unmap for an oversize buffer, or 0. | ||
90 | * @dma_addr: The DMA address of the header below. | ||
91 | * | ||
92 | * This controls the memory used for a TSO header. Use TSOH_DATA() | ||
93 | * to find the packet header data. Use TSOH_SIZE() to calculate the | ||
94 | * total size required for a given packet header length. TSO headers | ||
95 | * in the free list are exactly %TSOH_STD_SIZE bytes in size. | ||
96 | */ | ||
97 | struct efx_tso_header { | ||
98 | union { | ||
99 | struct efx_tso_header *next; | ||
100 | size_t unmap_len; | ||
101 | }; | ||
102 | dma_addr_t dma_addr; | ||
103 | }; | ||
104 | |||
105 | static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, | ||
106 | const struct sk_buff *skb); | ||
107 | static void efx_fini_tso(struct efx_tx_queue *tx_queue); | ||
108 | static void efx_tsoh_heap_free(struct efx_tx_queue *tx_queue, | ||
109 | struct efx_tso_header *tsoh); | ||
110 | |||
111 | static inline void efx_tsoh_free(struct efx_tx_queue *tx_queue, | ||
112 | struct efx_tx_buffer *buffer) | ||
113 | { | ||
114 | if (buffer->tsoh) { | ||
115 | if (likely(!buffer->tsoh->unmap_len)) { | ||
116 | buffer->tsoh->next = tx_queue->tso_headers_free; | ||
117 | tx_queue->tso_headers_free = buffer->tsoh; | ||
118 | } else { | ||
119 | efx_tsoh_heap_free(tx_queue, buffer->tsoh); | ||
120 | } | ||
121 | buffer->tsoh = NULL; | ||
122 | } | ||
123 | } | ||
124 | |||
85 | 125 | ||
86 | /* | 126 | /* |
87 | * Add a socket buffer to a TX queue | 127 | * Add a socket buffer to a TX queue |
@@ -114,6 +154,9 @@ static inline int efx_enqueue_skb(struct efx_tx_queue *tx_queue, | |||
114 | 154 | ||
115 | EFX_BUG_ON_PARANOID(tx_queue->write_count != tx_queue->insert_count); | 155 | EFX_BUG_ON_PARANOID(tx_queue->write_count != tx_queue->insert_count); |
116 | 156 | ||
157 | if (skb_shinfo((struct sk_buff *)skb)->gso_size) | ||
158 | return efx_enqueue_skb_tso(tx_queue, skb); | ||
159 | |||
117 | /* Get size of the initial fragment */ | 160 | /* Get size of the initial fragment */ |
118 | len = skb_headlen(skb); | 161 | len = skb_headlen(skb); |
119 | 162 | ||
@@ -166,6 +209,8 @@ static inline int efx_enqueue_skb(struct efx_tx_queue *tx_queue, | |||
166 | insert_ptr = (tx_queue->insert_count & | 209 | insert_ptr = (tx_queue->insert_count & |
167 | efx->type->txd_ring_mask); | 210 | efx->type->txd_ring_mask); |
168 | buffer = &tx_queue->buffer[insert_ptr]; | 211 | buffer = &tx_queue->buffer[insert_ptr]; |
212 | efx_tsoh_free(tx_queue, buffer); | ||
213 | EFX_BUG_ON_PARANOID(buffer->tsoh); | ||
169 | EFX_BUG_ON_PARANOID(buffer->skb); | 214 | EFX_BUG_ON_PARANOID(buffer->skb); |
170 | EFX_BUG_ON_PARANOID(buffer->len); | 215 | EFX_BUG_ON_PARANOID(buffer->len); |
171 | EFX_BUG_ON_PARANOID(buffer->continuation != 1); | 216 | EFX_BUG_ON_PARANOID(buffer->continuation != 1); |
@@ -432,6 +477,9 @@ void efx_fini_tx_queue(struct efx_tx_queue *tx_queue) | |||
432 | 477 | ||
433 | efx_release_tx_buffers(tx_queue); | 478 | efx_release_tx_buffers(tx_queue); |
434 | 479 | ||
480 | /* Free up TSO header cache */ | ||
481 | efx_fini_tso(tx_queue); | ||
482 | |||
435 | /* Release queue's stop on port, if any */ | 483 | /* Release queue's stop on port, if any */ |
436 | if (tx_queue->stopped) { | 484 | if (tx_queue->stopped) { |
437 | tx_queue->stopped = 0; | 485 | tx_queue->stopped = 0; |
@@ -450,3 +498,619 @@ void efx_remove_tx_queue(struct efx_tx_queue *tx_queue) | |||
450 | } | 498 | } |
451 | 499 | ||
452 | 500 | ||
501 | /* Efx TCP segmentation acceleration. | ||
502 | * | ||
503 | * Why? Because by doing it here in the driver we can go significantly | ||
504 | * faster than the GSO. | ||
505 | * | ||
506 | * Requires TX checksum offload support. | ||
507 | */ | ||
508 | |||
509 | /* Number of bytes inserted at the start of a TSO header buffer, | ||
510 | * similar to NET_IP_ALIGN. | ||
511 | */ | ||
512 | #if defined(__i386__) || defined(__x86_64__) | ||
513 | #define TSOH_OFFSET 0 | ||
514 | #else | ||
515 | #define TSOH_OFFSET NET_IP_ALIGN | ||
516 | #endif | ||
517 | |||
518 | #define TSOH_BUFFER(tsoh) ((u8 *)(tsoh + 1) + TSOH_OFFSET) | ||
519 | |||
520 | /* Total size of struct efx_tso_header, buffer and padding */ | ||
521 | #define TSOH_SIZE(hdr_len) \ | ||
522 | (sizeof(struct efx_tso_header) + TSOH_OFFSET + hdr_len) | ||
523 | |||
524 | /* Size of blocks on free list. Larger blocks must be allocated from | ||
525 | * the heap. | ||
526 | */ | ||
527 | #define TSOH_STD_SIZE 128 | ||
528 | |||
529 | #define PTR_DIFF(p1, p2) ((u8 *)(p1) - (u8 *)(p2)) | ||
530 | #define ETH_HDR_LEN(skb) (skb_network_header(skb) - (skb)->data) | ||
531 | #define SKB_TCP_OFF(skb) PTR_DIFF(tcp_hdr(skb), (skb)->data) | ||
532 | #define SKB_IPV4_OFF(skb) PTR_DIFF(ip_hdr(skb), (skb)->data) | ||
533 | |||
534 | /** | ||
535 | * struct tso_state - TSO state for an SKB | ||
536 | * @remaining_len: Bytes of data we've yet to segment | ||
537 | * @seqnum: Current sequence number | ||
538 | * @packet_space: Remaining space in current packet | ||
539 | * @ifc: Input fragment cursor. | ||
540 | * Where we are in the current fragment of the incoming SKB. These | ||
541 | * values get updated in place when we split a fragment over | ||
542 | * multiple packets. | ||
543 | * @p: Parameters. | ||
544 | * These values are set once at the start of the TSO send and do | ||
545 | * not get changed as the routine progresses. | ||
546 | * | ||
547 | * The state used during segmentation. It is put into this data structure | ||
548 | * just to make it easy to pass into inline functions. | ||
549 | */ | ||
550 | struct tso_state { | ||
551 | unsigned remaining_len; | ||
552 | unsigned seqnum; | ||
553 | unsigned packet_space; | ||
554 | |||
555 | struct { | ||
556 | /* DMA address of current position */ | ||
557 | dma_addr_t dma_addr; | ||
558 | /* Remaining length */ | ||
559 | unsigned int len; | ||
560 | /* DMA address and length of the whole fragment */ | ||
561 | unsigned int unmap_len; | ||
562 | dma_addr_t unmap_addr; | ||
563 | struct page *page; | ||
564 | unsigned page_off; | ||
565 | } ifc; | ||
566 | |||
567 | struct { | ||
568 | /* The number of bytes of header */ | ||
569 | unsigned int header_length; | ||
570 | |||
571 | /* The number of bytes to put in each outgoing segment. */ | ||
572 | int full_packet_size; | ||
573 | |||
574 | /* Current IPv4 ID, host endian. */ | ||
575 | unsigned ipv4_id; | ||
576 | } p; | ||
577 | }; | ||
578 | |||
579 | |||
580 | /* | ||
581 | * Verify that our various assumptions about sk_buffs and the conditions | ||
582 | * under which TSO will be attempted hold true. | ||
583 | */ | ||
584 | static inline void efx_tso_check_safe(const struct sk_buff *skb) | ||
585 | { | ||
586 | EFX_BUG_ON_PARANOID(skb->protocol != htons(ETH_P_IP)); | ||
587 | EFX_BUG_ON_PARANOID(((struct ethhdr *)skb->data)->h_proto != | ||
588 | skb->protocol); | ||
589 | EFX_BUG_ON_PARANOID(ip_hdr(skb)->protocol != IPPROTO_TCP); | ||
590 | EFX_BUG_ON_PARANOID((PTR_DIFF(tcp_hdr(skb), skb->data) | ||
591 | + (tcp_hdr(skb)->doff << 2u)) > | ||
592 | skb_headlen(skb)); | ||
593 | } | ||
594 | |||
595 | |||
596 | /* | ||
597 | * Allocate a page worth of efx_tso_header structures, and string them | ||
598 | * into the tx_queue->tso_headers_free linked list. Return 0 or -ENOMEM. | ||
599 | */ | ||
600 | static int efx_tsoh_block_alloc(struct efx_tx_queue *tx_queue) | ||
601 | { | ||
602 | |||
603 | struct pci_dev *pci_dev = tx_queue->efx->pci_dev; | ||
604 | struct efx_tso_header *tsoh; | ||
605 | dma_addr_t dma_addr; | ||
606 | u8 *base_kva, *kva; | ||
607 | |||
608 | base_kva = pci_alloc_consistent(pci_dev, PAGE_SIZE, &dma_addr); | ||
609 | if (base_kva == NULL) { | ||
610 | EFX_ERR(tx_queue->efx, "Unable to allocate page for TSO" | ||
611 | " headers\n"); | ||
612 | return -ENOMEM; | ||
613 | } | ||
614 | |||
615 | /* pci_alloc_consistent() allocates pages. */ | ||
616 | EFX_BUG_ON_PARANOID(dma_addr & (PAGE_SIZE - 1u)); | ||
617 | |||
618 | for (kva = base_kva; kva < base_kva + PAGE_SIZE; kva += TSOH_STD_SIZE) { | ||
619 | tsoh = (struct efx_tso_header *)kva; | ||
620 | tsoh->dma_addr = dma_addr + (TSOH_BUFFER(tsoh) - base_kva); | ||
621 | tsoh->next = tx_queue->tso_headers_free; | ||
622 | tx_queue->tso_headers_free = tsoh; | ||
623 | } | ||
624 | |||
625 | return 0; | ||
626 | } | ||
627 | |||
628 | |||
629 | /* Free up a TSO header, and all others in the same page. */ | ||
630 | static void efx_tsoh_block_free(struct efx_tx_queue *tx_queue, | ||
631 | struct efx_tso_header *tsoh, | ||
632 | struct pci_dev *pci_dev) | ||
633 | { | ||
634 | struct efx_tso_header **p; | ||
635 | unsigned long base_kva; | ||
636 | dma_addr_t base_dma; | ||
637 | |||
638 | base_kva = (unsigned long)tsoh & PAGE_MASK; | ||
639 | base_dma = tsoh->dma_addr & PAGE_MASK; | ||
640 | |||
641 | p = &tx_queue->tso_headers_free; | ||
642 | while (*p != NULL) | ||
643 | if (((unsigned long)*p & PAGE_MASK) == base_kva) | ||
644 | *p = (*p)->next; | ||
645 | else | ||
646 | p = &(*p)->next; | ||
647 | |||
648 | pci_free_consistent(pci_dev, PAGE_SIZE, (void *)base_kva, base_dma); | ||
649 | } | ||
650 | |||
651 | static struct efx_tso_header * | ||
652 | efx_tsoh_heap_alloc(struct efx_tx_queue *tx_queue, size_t header_len) | ||
653 | { | ||
654 | struct efx_tso_header *tsoh; | ||
655 | |||
656 | tsoh = kmalloc(TSOH_SIZE(header_len), GFP_ATOMIC | GFP_DMA); | ||
657 | if (unlikely(!tsoh)) | ||
658 | return NULL; | ||
659 | |||
660 | tsoh->dma_addr = pci_map_single(tx_queue->efx->pci_dev, | ||
661 | TSOH_BUFFER(tsoh), header_len, | ||
662 | PCI_DMA_TODEVICE); | ||
663 | if (unlikely(pci_dma_mapping_error(tsoh->dma_addr))) { | ||
664 | kfree(tsoh); | ||
665 | return NULL; | ||
666 | } | ||
667 | |||
668 | tsoh->unmap_len = header_len; | ||
669 | return tsoh; | ||
670 | } | ||
671 | |||
672 | static void | ||
673 | efx_tsoh_heap_free(struct efx_tx_queue *tx_queue, struct efx_tso_header *tsoh) | ||
674 | { | ||
675 | pci_unmap_single(tx_queue->efx->pci_dev, | ||
676 | tsoh->dma_addr, tsoh->unmap_len, | ||
677 | PCI_DMA_TODEVICE); | ||
678 | kfree(tsoh); | ||
679 | } | ||
680 | |||
681 | /** | ||
682 | * efx_tx_queue_insert - push descriptors onto the TX queue | ||
683 | * @tx_queue: Efx TX queue | ||
684 | * @dma_addr: DMA address of fragment | ||
685 | * @len: Length of fragment | ||
686 | * @skb: Only non-null for end of last segment | ||
687 | * @end_of_packet: True if last fragment in a packet | ||
688 | * @unmap_addr: DMA address of fragment for unmapping | ||
689 | * @unmap_len: Only set this in last segment of a fragment | ||
690 | * | ||
691 | * Push descriptors onto the TX queue. Return 0 on success or 1 if | ||
692 | * @tx_queue full. | ||
693 | */ | ||
694 | static int efx_tx_queue_insert(struct efx_tx_queue *tx_queue, | ||
695 | dma_addr_t dma_addr, unsigned len, | ||
696 | const struct sk_buff *skb, int end_of_packet, | ||
697 | dma_addr_t unmap_addr, unsigned unmap_len) | ||
698 | { | ||
699 | struct efx_tx_buffer *buffer; | ||
700 | struct efx_nic *efx = tx_queue->efx; | ||
701 | unsigned dma_len, fill_level, insert_ptr, misalign; | ||
702 | int q_space; | ||
703 | |||
704 | EFX_BUG_ON_PARANOID(len <= 0); | ||
705 | |||
706 | fill_level = tx_queue->insert_count - tx_queue->old_read_count; | ||
707 | /* -1 as there is no way to represent all descriptors used */ | ||
708 | q_space = efx->type->txd_ring_mask - 1 - fill_level; | ||
709 | |||
710 | while (1) { | ||
711 | if (unlikely(q_space-- <= 0)) { | ||
712 | /* It might be that completions have happened | ||
713 | * since the xmit path last checked. Update | ||
714 | * the xmit path's copy of read_count. | ||
715 | */ | ||
716 | ++tx_queue->stopped; | ||
717 | /* This memory barrier protects the change of | ||
718 | * stopped from the access of read_count. */ | ||
719 | smp_mb(); | ||
720 | tx_queue->old_read_count = | ||
721 | *(volatile unsigned *)&tx_queue->read_count; | ||
722 | fill_level = (tx_queue->insert_count | ||
723 | - tx_queue->old_read_count); | ||
724 | q_space = efx->type->txd_ring_mask - 1 - fill_level; | ||
725 | if (unlikely(q_space-- <= 0)) | ||
726 | return 1; | ||
727 | smp_mb(); | ||
728 | --tx_queue->stopped; | ||
729 | } | ||
730 | |||
731 | insert_ptr = tx_queue->insert_count & efx->type->txd_ring_mask; | ||
732 | buffer = &tx_queue->buffer[insert_ptr]; | ||
733 | ++tx_queue->insert_count; | ||
734 | |||
735 | EFX_BUG_ON_PARANOID(tx_queue->insert_count - | ||
736 | tx_queue->read_count > | ||
737 | efx->type->txd_ring_mask); | ||
738 | |||
739 | efx_tsoh_free(tx_queue, buffer); | ||
740 | EFX_BUG_ON_PARANOID(buffer->len); | ||
741 | EFX_BUG_ON_PARANOID(buffer->unmap_len); | ||
742 | EFX_BUG_ON_PARANOID(buffer->skb); | ||
743 | EFX_BUG_ON_PARANOID(buffer->continuation != 1); | ||
744 | EFX_BUG_ON_PARANOID(buffer->tsoh); | ||
745 | |||
746 | buffer->dma_addr = dma_addr; | ||
747 | |||
748 | /* Ensure we do not cross a boundary unsupported by H/W */ | ||
749 | dma_len = (~dma_addr & efx->type->tx_dma_mask) + 1; | ||
750 | |||
751 | misalign = (unsigned)dma_addr & efx->type->bug5391_mask; | ||
752 | if (misalign && dma_len + misalign > 512) | ||
753 | dma_len = 512 - misalign; | ||
754 | |||
755 | /* If there is enough space to send then do so */ | ||
756 | if (dma_len >= len) | ||
757 | break; | ||
758 | |||
759 | buffer->len = dma_len; /* Don't set the other members */ | ||
760 | dma_addr += dma_len; | ||
761 | len -= dma_len; | ||
762 | } | ||
763 | |||
764 | EFX_BUG_ON_PARANOID(!len); | ||
765 | buffer->len = len; | ||
766 | buffer->skb = skb; | ||
767 | buffer->continuation = !end_of_packet; | ||
768 | buffer->unmap_addr = unmap_addr; | ||
769 | buffer->unmap_len = unmap_len; | ||
770 | return 0; | ||
771 | } | ||
772 | |||
773 | |||
774 | /* | ||
775 | * Put a TSO header into the TX queue. | ||
776 | * | ||
777 | * This is special-cased because we know that it is small enough to fit in | ||
778 | * a single fragment, and we know it doesn't cross a page boundary. It | ||
779 | * also allows us to not worry about end-of-packet etc. | ||
780 | */ | ||
781 | static inline void efx_tso_put_header(struct efx_tx_queue *tx_queue, | ||
782 | struct efx_tso_header *tsoh, unsigned len) | ||
783 | { | ||
784 | struct efx_tx_buffer *buffer; | ||
785 | |||
786 | buffer = &tx_queue->buffer[tx_queue->insert_count & | ||
787 | tx_queue->efx->type->txd_ring_mask]; | ||
788 | efx_tsoh_free(tx_queue, buffer); | ||
789 | EFX_BUG_ON_PARANOID(buffer->len); | ||
790 | EFX_BUG_ON_PARANOID(buffer->unmap_len); | ||
791 | EFX_BUG_ON_PARANOID(buffer->skb); | ||
792 | EFX_BUG_ON_PARANOID(buffer->continuation != 1); | ||
793 | EFX_BUG_ON_PARANOID(buffer->tsoh); | ||
794 | buffer->len = len; | ||
795 | buffer->dma_addr = tsoh->dma_addr; | ||
796 | buffer->tsoh = tsoh; | ||
797 | |||
798 | ++tx_queue->insert_count; | ||
799 | } | ||
800 | |||
801 | |||
802 | /* Remove descriptors put into a tx_queue. */ | ||
803 | static void efx_enqueue_unwind(struct efx_tx_queue *tx_queue) | ||
804 | { | ||
805 | struct efx_tx_buffer *buffer; | ||
806 | |||
807 | /* Work backwards until we hit the original insert pointer value */ | ||
808 | while (tx_queue->insert_count != tx_queue->write_count) { | ||
809 | --tx_queue->insert_count; | ||
810 | buffer = &tx_queue->buffer[tx_queue->insert_count & | ||
811 | tx_queue->efx->type->txd_ring_mask]; | ||
812 | efx_tsoh_free(tx_queue, buffer); | ||
813 | EFX_BUG_ON_PARANOID(buffer->skb); | ||
814 | buffer->len = 0; | ||
815 | buffer->continuation = 1; | ||
816 | if (buffer->unmap_len) { | ||
817 | pci_unmap_page(tx_queue->efx->pci_dev, | ||
818 | buffer->unmap_addr, | ||
819 | buffer->unmap_len, PCI_DMA_TODEVICE); | ||
820 | buffer->unmap_len = 0; | ||
821 | } | ||
822 | } | ||
823 | } | ||
824 | |||
825 | |||
826 | /* Parse the SKB header and initialise state. */ | ||
827 | static inline void tso_start(struct tso_state *st, const struct sk_buff *skb) | ||
828 | { | ||
829 | /* All ethernet/IP/TCP headers combined size is TCP header size | ||
830 | * plus offset of TCP header relative to start of packet. | ||
831 | */ | ||
832 | st->p.header_length = ((tcp_hdr(skb)->doff << 2u) | ||
833 | + PTR_DIFF(tcp_hdr(skb), skb->data)); | ||
834 | st->p.full_packet_size = (st->p.header_length | ||
835 | + skb_shinfo(skb)->gso_size); | ||
836 | |||
837 | st->p.ipv4_id = ntohs(ip_hdr(skb)->id); | ||
838 | st->seqnum = ntohl(tcp_hdr(skb)->seq); | ||
839 | |||
840 | EFX_BUG_ON_PARANOID(tcp_hdr(skb)->urg); | ||
841 | EFX_BUG_ON_PARANOID(tcp_hdr(skb)->syn); | ||
842 | EFX_BUG_ON_PARANOID(tcp_hdr(skb)->rst); | ||
843 | |||
844 | st->packet_space = st->p.full_packet_size; | ||
845 | st->remaining_len = skb->len - st->p.header_length; | ||
846 | } | ||
847 | |||
848 | |||
849 | /** | ||
850 | * tso_get_fragment - record fragment details and map for DMA | ||
851 | * @st: TSO state | ||
852 | * @efx: Efx NIC | ||
853 | * @data: Pointer to fragment data | ||
854 | * @len: Length of fragment | ||
855 | * | ||
856 | * Record fragment details and map for DMA. Return 0 on success, or | ||
857 | * -%ENOMEM if DMA mapping fails. | ||
858 | */ | ||
859 | static inline int tso_get_fragment(struct tso_state *st, struct efx_nic *efx, | ||
860 | int len, struct page *page, int page_off) | ||
861 | { | ||
862 | |||
863 | st->ifc.unmap_addr = pci_map_page(efx->pci_dev, page, page_off, | ||
864 | len, PCI_DMA_TODEVICE); | ||
865 | if (likely(!pci_dma_mapping_error(st->ifc.unmap_addr))) { | ||
866 | st->ifc.unmap_len = len; | ||
867 | st->ifc.len = len; | ||
868 | st->ifc.dma_addr = st->ifc.unmap_addr; | ||
869 | st->ifc.page = page; | ||
870 | st->ifc.page_off = page_off; | ||
871 | return 0; | ||
872 | } | ||
873 | return -ENOMEM; | ||
874 | } | ||
875 | |||
876 | |||
877 | /** | ||
878 | * tso_fill_packet_with_fragment - form descriptors for the current fragment | ||
879 | * @tx_queue: Efx TX queue | ||
880 | * @skb: Socket buffer | ||
881 | * @st: TSO state | ||
882 | * | ||
883 | * Form descriptors for the current fragment, until we reach the end | ||
884 | * of fragment or end-of-packet. Return 0 on success, 1 if not enough | ||
885 | * space in @tx_queue. | ||
886 | */ | ||
887 | static inline int tso_fill_packet_with_fragment(struct efx_tx_queue *tx_queue, | ||
888 | const struct sk_buff *skb, | ||
889 | struct tso_state *st) | ||
890 | { | ||
891 | |||
892 | int n, end_of_packet, rc; | ||
893 | |||
894 | if (st->ifc.len == 0) | ||
895 | return 0; | ||
896 | if (st->packet_space == 0) | ||
897 | return 0; | ||
898 | |||
899 | EFX_BUG_ON_PARANOID(st->ifc.len <= 0); | ||
900 | EFX_BUG_ON_PARANOID(st->packet_space <= 0); | ||
901 | |||
902 | n = min(st->ifc.len, st->packet_space); | ||
903 | |||
904 | st->packet_space -= n; | ||
905 | st->remaining_len -= n; | ||
906 | st->ifc.len -= n; | ||
907 | st->ifc.page_off += n; | ||
908 | end_of_packet = st->remaining_len == 0 || st->packet_space == 0; | ||
909 | |||
910 | rc = efx_tx_queue_insert(tx_queue, st->ifc.dma_addr, n, | ||
911 | st->remaining_len ? NULL : skb, | ||
912 | end_of_packet, st->ifc.unmap_addr, | ||
913 | st->ifc.len ? 0 : st->ifc.unmap_len); | ||
914 | |||
915 | st->ifc.dma_addr += n; | ||
916 | |||
917 | return rc; | ||
918 | } | ||
919 | |||
920 | |||
921 | /** | ||
922 | * tso_start_new_packet - generate a new header and prepare for the new packet | ||
923 | * @tx_queue: Efx TX queue | ||
924 | * @skb: Socket buffer | ||
925 | * @st: TSO state | ||
926 | * | ||
927 | * Generate a new header and prepare for the new packet. Return 0 on | ||
928 | * success, or -1 if failed to alloc header. | ||
929 | */ | ||
930 | static inline int tso_start_new_packet(struct efx_tx_queue *tx_queue, | ||
931 | const struct sk_buff *skb, | ||
932 | struct tso_state *st) | ||
933 | { | ||
934 | struct efx_tso_header *tsoh; | ||
935 | struct iphdr *tsoh_iph; | ||
936 | struct tcphdr *tsoh_th; | ||
937 | unsigned ip_length; | ||
938 | u8 *header; | ||
939 | |||
940 | /* Allocate a DMA-mapped header buffer. */ | ||
941 | if (likely(TSOH_SIZE(st->p.header_length) <= TSOH_STD_SIZE)) { | ||
942 | if (tx_queue->tso_headers_free == NULL) | ||
943 | if (efx_tsoh_block_alloc(tx_queue)) | ||
944 | return -1; | ||
945 | EFX_BUG_ON_PARANOID(!tx_queue->tso_headers_free); | ||
946 | tsoh = tx_queue->tso_headers_free; | ||
947 | tx_queue->tso_headers_free = tsoh->next; | ||
948 | tsoh->unmap_len = 0; | ||
949 | } else { | ||
950 | tx_queue->tso_long_headers++; | ||
951 | tsoh = efx_tsoh_heap_alloc(tx_queue, st->p.header_length); | ||
952 | if (unlikely(!tsoh)) | ||
953 | return -1; | ||
954 | } | ||
955 | |||
956 | header = TSOH_BUFFER(tsoh); | ||
957 | tsoh_th = (struct tcphdr *)(header + SKB_TCP_OFF(skb)); | ||
958 | tsoh_iph = (struct iphdr *)(header + SKB_IPV4_OFF(skb)); | ||
959 | |||
960 | /* Copy and update the headers. */ | ||
961 | memcpy(header, skb->data, st->p.header_length); | ||
962 | |||
963 | tsoh_th->seq = htonl(st->seqnum); | ||
964 | st->seqnum += skb_shinfo(skb)->gso_size; | ||
965 | if (st->remaining_len > skb_shinfo(skb)->gso_size) { | ||
966 | /* This packet will not finish the TSO burst. */ | ||
967 | ip_length = st->p.full_packet_size - ETH_HDR_LEN(skb); | ||
968 | tsoh_th->fin = 0; | ||
969 | tsoh_th->psh = 0; | ||
970 | } else { | ||
971 | /* This packet will be the last in the TSO burst. */ | ||
972 | ip_length = (st->p.header_length - ETH_HDR_LEN(skb) | ||
973 | + st->remaining_len); | ||
974 | tsoh_th->fin = tcp_hdr(skb)->fin; | ||
975 | tsoh_th->psh = tcp_hdr(skb)->psh; | ||
976 | } | ||
977 | tsoh_iph->tot_len = htons(ip_length); | ||
978 | |||
979 | /* Linux leaves suitable gaps in the IP ID space for us to fill. */ | ||
980 | tsoh_iph->id = htons(st->p.ipv4_id); | ||
981 | st->p.ipv4_id++; | ||
982 | |||
983 | st->packet_space = skb_shinfo(skb)->gso_size; | ||
984 | ++tx_queue->tso_packets; | ||
985 | |||
986 | /* Form a descriptor for this header. */ | ||
987 | efx_tso_put_header(tx_queue, tsoh, st->p.header_length); | ||
988 | |||
989 | return 0; | ||
990 | } | ||
991 | |||
992 | |||
993 | /** | ||
994 | * efx_enqueue_skb_tso - segment and transmit a TSO socket buffer | ||
995 | * @tx_queue: Efx TX queue | ||
996 | * @skb: Socket buffer | ||
997 | * | ||
998 | * Context: You must hold netif_tx_lock() to call this function. | ||
999 | * | ||
1000 | * Add socket buffer @skb to @tx_queue, doing TSO or return != 0 if | ||
1001 | * @skb was not enqueued. In all cases @skb is consumed. Return | ||
1002 | * %NETDEV_TX_OK or %NETDEV_TX_BUSY. | ||
1003 | */ | ||
1004 | static int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, | ||
1005 | const struct sk_buff *skb) | ||
1006 | { | ||
1007 | int frag_i, rc, rc2 = NETDEV_TX_OK; | ||
1008 | struct tso_state state; | ||
1009 | skb_frag_t *f; | ||
1010 | |||
1011 | /* Verify TSO is safe - these checks should never fail. */ | ||
1012 | efx_tso_check_safe(skb); | ||
1013 | |||
1014 | EFX_BUG_ON_PARANOID(tx_queue->write_count != tx_queue->insert_count); | ||
1015 | |||
1016 | tso_start(&state, skb); | ||
1017 | |||
1018 | /* Assume that skb header area contains exactly the headers, and | ||
1019 | * all payload is in the frag list. | ||
1020 | */ | ||
1021 | if (skb_headlen(skb) == state.p.header_length) { | ||
1022 | /* Grab the first payload fragment. */ | ||
1023 | EFX_BUG_ON_PARANOID(skb_shinfo(skb)->nr_frags < 1); | ||
1024 | frag_i = 0; | ||
1025 | f = &skb_shinfo(skb)->frags[frag_i]; | ||
1026 | rc = tso_get_fragment(&state, tx_queue->efx, | ||
1027 | f->size, f->page, f->page_offset); | ||
1028 | if (rc) | ||
1029 | goto mem_err; | ||
1030 | } else { | ||
1031 | /* It may look like this code fragment assumes that the | ||
1032 | * skb->data portion does not cross a page boundary, but | ||
1033 | * that is not the case. It is guaranteed to be direct | ||
1034 | * mapped memory, and therefore is physically contiguous, | ||
1035 | * and so DMA will work fine. kmap_atomic() on this region | ||
1036 | * will just return the direct mapping, so that will work | ||
1037 | * too. | ||
1038 | */ | ||
1039 | int page_off = (unsigned long)skb->data & (PAGE_SIZE - 1); | ||
1040 | int hl = state.p.header_length; | ||
1041 | rc = tso_get_fragment(&state, tx_queue->efx, | ||
1042 | skb_headlen(skb) - hl, | ||
1043 | virt_to_page(skb->data), page_off + hl); | ||
1044 | if (rc) | ||
1045 | goto mem_err; | ||
1046 | frag_i = -1; | ||
1047 | } | ||
1048 | |||
1049 | if (tso_start_new_packet(tx_queue, skb, &state) < 0) | ||
1050 | goto mem_err; | ||
1051 | |||
1052 | while (1) { | ||
1053 | rc = tso_fill_packet_with_fragment(tx_queue, skb, &state); | ||
1054 | if (unlikely(rc)) | ||
1055 | goto stop; | ||
1056 | |||
1057 | /* Move onto the next fragment? */ | ||
1058 | if (state.ifc.len == 0) { | ||
1059 | if (++frag_i >= skb_shinfo(skb)->nr_frags) | ||
1060 | /* End of payload reached. */ | ||
1061 | break; | ||
1062 | f = &skb_shinfo(skb)->frags[frag_i]; | ||
1063 | rc = tso_get_fragment(&state, tx_queue->efx, | ||
1064 | f->size, f->page, f->page_offset); | ||
1065 | if (rc) | ||
1066 | goto mem_err; | ||
1067 | } | ||
1068 | |||
1069 | /* Start at new packet? */ | ||
1070 | if (state.packet_space == 0 && | ||
1071 | tso_start_new_packet(tx_queue, skb, &state) < 0) | ||
1072 | goto mem_err; | ||
1073 | } | ||
1074 | |||
1075 | /* Pass off to hardware */ | ||
1076 | falcon_push_buffers(tx_queue); | ||
1077 | |||
1078 | tx_queue->tso_bursts++; | ||
1079 | return NETDEV_TX_OK; | ||
1080 | |||
1081 | mem_err: | ||
1082 | EFX_ERR(tx_queue->efx, "Out of memory for TSO headers, or PCI mapping" | ||
1083 | " error\n"); | ||
1084 | dev_kfree_skb_any((struct sk_buff *)skb); | ||
1085 | goto unwind; | ||
1086 | |||
1087 | stop: | ||
1088 | rc2 = NETDEV_TX_BUSY; | ||
1089 | |||
1090 | /* Stop the queue if it wasn't stopped before. */ | ||
1091 | if (tx_queue->stopped == 1) | ||
1092 | efx_stop_queue(tx_queue->efx); | ||
1093 | |||
1094 | unwind: | ||
1095 | efx_enqueue_unwind(tx_queue); | ||
1096 | return rc2; | ||
1097 | } | ||
1098 | |||
1099 | |||
1100 | /* | ||
1101 | * Free up all TSO datastructures associated with tx_queue. This | ||
1102 | * routine should be called only once the tx_queue is both empty and | ||
1103 | * will no longer be used. | ||
1104 | */ | ||
1105 | static void efx_fini_tso(struct efx_tx_queue *tx_queue) | ||
1106 | { | ||
1107 | unsigned i; | ||
1108 | |||
1109 | if (tx_queue->buffer) | ||
1110 | for (i = 0; i <= tx_queue->efx->type->txd_ring_mask; ++i) | ||
1111 | efx_tsoh_free(tx_queue, &tx_queue->buffer[i]); | ||
1112 | |||
1113 | while (tx_queue->tso_headers_free != NULL) | ||
1114 | efx_tsoh_block_free(tx_queue, tx_queue->tso_headers_free, | ||
1115 | tx_queue->efx->pci_dev); | ||
1116 | } | ||
diff --git a/drivers/net/sfc/xfp_phy.c b/drivers/net/sfc/xfp_phy.c index 66dd5bf1eaa9..3b9f9ddbc372 100644 --- a/drivers/net/sfc/xfp_phy.c +++ b/drivers/net/sfc/xfp_phy.c | |||
@@ -24,6 +24,10 @@ | |||
24 | MDIO_MMDREG_DEVS0_PMAPMD | \ | 24 | MDIO_MMDREG_DEVS0_PMAPMD | \ |
25 | MDIO_MMDREG_DEVS0_PHYXS) | 25 | MDIO_MMDREG_DEVS0_PHYXS) |
26 | 26 | ||
27 | #define XFP_LOOPBACKS ((1 << LOOPBACK_PCS) | \ | ||
28 | (1 << LOOPBACK_PMAPMD) | \ | ||
29 | (1 << LOOPBACK_NETWORK)) | ||
30 | |||
27 | /****************************************************************************/ | 31 | /****************************************************************************/ |
28 | /* Quake-specific MDIO registers */ | 32 | /* Quake-specific MDIO registers */ |
29 | #define MDIO_QUAKE_LED0_REG (0xD006) | 33 | #define MDIO_QUAKE_LED0_REG (0xD006) |
@@ -35,6 +39,10 @@ void xfp_set_led(struct efx_nic *p, int led, int mode) | |||
35 | mode); | 39 | mode); |
36 | } | 40 | } |
37 | 41 | ||
42 | struct xfp_phy_data { | ||
43 | int tx_disabled; | ||
44 | }; | ||
45 | |||
38 | #define XFP_MAX_RESET_TIME 500 | 46 | #define XFP_MAX_RESET_TIME 500 |
39 | #define XFP_RESET_WAIT 10 | 47 | #define XFP_RESET_WAIT 10 |
40 | 48 | ||
@@ -72,18 +80,31 @@ static int xfp_reset_phy(struct efx_nic *efx) | |||
72 | 80 | ||
73 | static int xfp_phy_init(struct efx_nic *efx) | 81 | static int xfp_phy_init(struct efx_nic *efx) |
74 | { | 82 | { |
83 | struct xfp_phy_data *phy_data; | ||
75 | u32 devid = mdio_clause45_read_id(efx, MDIO_MMD_PHYXS); | 84 | u32 devid = mdio_clause45_read_id(efx, MDIO_MMD_PHYXS); |
76 | int rc; | 85 | int rc; |
77 | 86 | ||
87 | phy_data = kzalloc(sizeof(struct xfp_phy_data), GFP_KERNEL); | ||
88 | efx->phy_data = (void *) phy_data; | ||
89 | |||
78 | EFX_INFO(efx, "XFP: PHY ID reg %x (OUI %x model %x revision" | 90 | EFX_INFO(efx, "XFP: PHY ID reg %x (OUI %x model %x revision" |
79 | " %x)\n", devid, MDIO_ID_OUI(devid), MDIO_ID_MODEL(devid), | 91 | " %x)\n", devid, MDIO_ID_OUI(devid), MDIO_ID_MODEL(devid), |
80 | MDIO_ID_REV(devid)); | 92 | MDIO_ID_REV(devid)); |
81 | 93 | ||
94 | phy_data->tx_disabled = efx->tx_disabled; | ||
95 | |||
82 | rc = xfp_reset_phy(efx); | 96 | rc = xfp_reset_phy(efx); |
83 | 97 | ||
84 | EFX_INFO(efx, "XFP: PHY init %s.\n", | 98 | EFX_INFO(efx, "XFP: PHY init %s.\n", |
85 | rc ? "failed" : "successful"); | 99 | rc ? "failed" : "successful"); |
100 | if (rc < 0) | ||
101 | goto fail; | ||
86 | 102 | ||
103 | return 0; | ||
104 | |||
105 | fail: | ||
106 | kfree(efx->phy_data); | ||
107 | efx->phy_data = NULL; | ||
87 | return rc; | 108 | return rc; |
88 | } | 109 | } |
89 | 110 | ||
@@ -110,6 +131,16 @@ static int xfp_phy_check_hw(struct efx_nic *efx) | |||
110 | 131 | ||
111 | static void xfp_phy_reconfigure(struct efx_nic *efx) | 132 | static void xfp_phy_reconfigure(struct efx_nic *efx) |
112 | { | 133 | { |
134 | struct xfp_phy_data *phy_data = efx->phy_data; | ||
135 | |||
136 | /* Reset the PHY when moving from tx off to tx on */ | ||
137 | if (phy_data->tx_disabled && !efx->tx_disabled) | ||
138 | xfp_reset_phy(efx); | ||
139 | |||
140 | mdio_clause45_transmit_disable(efx); | ||
141 | mdio_clause45_phy_reconfigure(efx); | ||
142 | |||
143 | phy_data->tx_disabled = efx->tx_disabled; | ||
113 | efx->link_up = xfp_link_ok(efx); | 144 | efx->link_up = xfp_link_ok(efx); |
114 | efx->link_options = GM_LPA_10000FULL; | 145 | efx->link_options = GM_LPA_10000FULL; |
115 | } | 146 | } |
@@ -119,6 +150,10 @@ static void xfp_phy_fini(struct efx_nic *efx) | |||
119 | { | 150 | { |
120 | /* Clobber the LED if it was blinking */ | 151 | /* Clobber the LED if it was blinking */ |
121 | efx->board_info.blink(efx, 0); | 152 | efx->board_info.blink(efx, 0); |
153 | |||
154 | /* Free the context block */ | ||
155 | kfree(efx->phy_data); | ||
156 | efx->phy_data = NULL; | ||
122 | } | 157 | } |
123 | 158 | ||
124 | struct efx_phy_operations falcon_xfp_phy_ops = { | 159 | struct efx_phy_operations falcon_xfp_phy_ops = { |
@@ -129,4 +164,5 @@ struct efx_phy_operations falcon_xfp_phy_ops = { | |||
129 | .clear_interrupt = xfp_phy_clear_interrupt, | 164 | .clear_interrupt = xfp_phy_clear_interrupt, |
130 | .reset_xaui = efx_port_dummy_op_void, | 165 | .reset_xaui = efx_port_dummy_op_void, |
131 | .mmds = XFP_REQUIRED_DEVS, | 166 | .mmds = XFP_REQUIRED_DEVS, |
167 | .loopbacks = XFP_LOOPBACKS, | ||
132 | }; | 168 | }; |
diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 7bb3ba9bcbd8..c0a5eea20007 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h | |||
@@ -1966,13 +1966,13 @@ struct sky2_status_le { | |||
1966 | struct tx_ring_info { | 1966 | struct tx_ring_info { |
1967 | struct sk_buff *skb; | 1967 | struct sk_buff *skb; |
1968 | DECLARE_PCI_UNMAP_ADDR(mapaddr); | 1968 | DECLARE_PCI_UNMAP_ADDR(mapaddr); |
1969 | DECLARE_PCI_UNMAP_ADDR(maplen); | 1969 | DECLARE_PCI_UNMAP_LEN(maplen); |
1970 | }; | 1970 | }; |
1971 | 1971 | ||
1972 | struct rx_ring_info { | 1972 | struct rx_ring_info { |
1973 | struct sk_buff *skb; | 1973 | struct sk_buff *skb; |
1974 | dma_addr_t data_addr; | 1974 | dma_addr_t data_addr; |
1975 | DECLARE_PCI_UNMAP_ADDR(data_size); | 1975 | DECLARE_PCI_UNMAP_LEN(data_size); |
1976 | dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT]; | 1976 | dma_addr_t frag_addr[ETH_JUMBO_MTU >> PAGE_SHIFT]; |
1977 | }; | 1977 | }; |
1978 | 1978 | ||
diff --git a/drivers/net/tulip/uli526x.c b/drivers/net/tulip/uli526x.c index a59c1f224aa8..2511ca7a12aa 100644 --- a/drivers/net/tulip/uli526x.c +++ b/drivers/net/tulip/uli526x.c | |||
@@ -434,10 +434,6 @@ static int uli526x_open(struct net_device *dev) | |||
434 | 434 | ||
435 | ULI526X_DBUG(0, "uli526x_open", 0); | 435 | ULI526X_DBUG(0, "uli526x_open", 0); |
436 | 436 | ||
437 | ret = request_irq(dev->irq, &uli526x_interrupt, IRQF_SHARED, dev->name, dev); | ||
438 | if (ret) | ||
439 | return ret; | ||
440 | |||
441 | /* system variable init */ | 437 | /* system variable init */ |
442 | db->cr6_data = CR6_DEFAULT | uli526x_cr6_user_set; | 438 | db->cr6_data = CR6_DEFAULT | uli526x_cr6_user_set; |
443 | db->tx_packet_cnt = 0; | 439 | db->tx_packet_cnt = 0; |
@@ -456,6 +452,10 @@ static int uli526x_open(struct net_device *dev) | |||
456 | /* Initialize ULI526X board */ | 452 | /* Initialize ULI526X board */ |
457 | uli526x_init(dev); | 453 | uli526x_init(dev); |
458 | 454 | ||
455 | ret = request_irq(dev->irq, &uli526x_interrupt, IRQF_SHARED, dev->name, dev); | ||
456 | if (ret) | ||
457 | return ret; | ||
458 | |||
459 | /* Active System Interface */ | 459 | /* Active System Interface */ |
460 | netif_wake_queue(dev); | 460 | netif_wake_queue(dev); |
461 | 461 | ||
@@ -1368,6 +1368,12 @@ static void update_cr6(u32 cr6_data, unsigned long ioaddr) | |||
1368 | * This setup frame initialize ULI526X address filter mode | 1368 | * This setup frame initialize ULI526X address filter mode |
1369 | */ | 1369 | */ |
1370 | 1370 | ||
1371 | #ifdef __BIG_ENDIAN | ||
1372 | #define FLT_SHIFT 16 | ||
1373 | #else | ||
1374 | #define FLT_SHIFT 0 | ||
1375 | #endif | ||
1376 | |||
1371 | static void send_filter_frame(struct net_device *dev, int mc_cnt) | 1377 | static void send_filter_frame(struct net_device *dev, int mc_cnt) |
1372 | { | 1378 | { |
1373 | struct uli526x_board_info *db = netdev_priv(dev); | 1379 | struct uli526x_board_info *db = netdev_priv(dev); |
@@ -1384,27 +1390,27 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt) | |||
1384 | 1390 | ||
1385 | /* Node address */ | 1391 | /* Node address */ |
1386 | addrptr = (u16 *) dev->dev_addr; | 1392 | addrptr = (u16 *) dev->dev_addr; |
1387 | *suptr++ = addrptr[0]; | 1393 | *suptr++ = addrptr[0] << FLT_SHIFT; |
1388 | *suptr++ = addrptr[1]; | 1394 | *suptr++ = addrptr[1] << FLT_SHIFT; |
1389 | *suptr++ = addrptr[2]; | 1395 | *suptr++ = addrptr[2] << FLT_SHIFT; |
1390 | 1396 | ||
1391 | /* broadcast address */ | 1397 | /* broadcast address */ |
1392 | *suptr++ = 0xffff; | 1398 | *suptr++ = 0xffff << FLT_SHIFT; |
1393 | *suptr++ = 0xffff; | 1399 | *suptr++ = 0xffff << FLT_SHIFT; |
1394 | *suptr++ = 0xffff; | 1400 | *suptr++ = 0xffff << FLT_SHIFT; |
1395 | 1401 | ||
1396 | /* fit the multicast address */ | 1402 | /* fit the multicast address */ |
1397 | for (mcptr = dev->mc_list, i = 0; i < mc_cnt; i++, mcptr = mcptr->next) { | 1403 | for (mcptr = dev->mc_list, i = 0; i < mc_cnt; i++, mcptr = mcptr->next) { |
1398 | addrptr = (u16 *) mcptr->dmi_addr; | 1404 | addrptr = (u16 *) mcptr->dmi_addr; |
1399 | *suptr++ = addrptr[0]; | 1405 | *suptr++ = addrptr[0] << FLT_SHIFT; |
1400 | *suptr++ = addrptr[1]; | 1406 | *suptr++ = addrptr[1] << FLT_SHIFT; |
1401 | *suptr++ = addrptr[2]; | 1407 | *suptr++ = addrptr[2] << FLT_SHIFT; |
1402 | } | 1408 | } |
1403 | 1409 | ||
1404 | for (; i<14; i++) { | 1410 | for (; i<14; i++) { |
1405 | *suptr++ = 0xffff; | 1411 | *suptr++ = 0xffff << FLT_SHIFT; |
1406 | *suptr++ = 0xffff; | 1412 | *suptr++ = 0xffff << FLT_SHIFT; |
1407 | *suptr++ = 0xffff; | 1413 | *suptr++ = 0xffff << FLT_SHIFT; |
1408 | } | 1414 | } |
1409 | 1415 | ||
1410 | /* prepare the setup frame */ | 1416 | /* prepare the setup frame */ |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index 281ce3d39532..ca0bdac07a78 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
@@ -62,7 +62,6 @@ | |||
62 | #endif /* UGETH_VERBOSE_DEBUG */ | 62 | #endif /* UGETH_VERBOSE_DEBUG */ |
63 | #define UGETH_MSG_DEFAULT (NETIF_MSG_IFUP << 1 ) - 1 | 63 | #define UGETH_MSG_DEFAULT (NETIF_MSG_IFUP << 1 ) - 1 |
64 | 64 | ||
65 | void uec_set_ethtool_ops(struct net_device *netdev); | ||
66 | 65 | ||
67 | static DEFINE_SPINLOCK(ugeth_lock); | 66 | static DEFINE_SPINLOCK(ugeth_lock); |
68 | 67 | ||
@@ -216,7 +215,8 @@ static struct list_head *dequeue(struct list_head *lh) | |||
216 | } | 215 | } |
217 | } | 216 | } |
218 | 217 | ||
219 | static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, u8 *bd) | 218 | static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, |
219 | u8 __iomem *bd) | ||
220 | { | 220 | { |
221 | struct sk_buff *skb = NULL; | 221 | struct sk_buff *skb = NULL; |
222 | 222 | ||
@@ -236,21 +236,22 @@ static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, u8 *bd) | |||
236 | 236 | ||
237 | skb->dev = ugeth->dev; | 237 | skb->dev = ugeth->dev; |
238 | 238 | ||
239 | out_be32(&((struct qe_bd *)bd)->buf, | 239 | out_be32(&((struct qe_bd __iomem *)bd)->buf, |
240 | dma_map_single(NULL, | 240 | dma_map_single(NULL, |
241 | skb->data, | 241 | skb->data, |
242 | ugeth->ug_info->uf_info.max_rx_buf_length + | 242 | ugeth->ug_info->uf_info.max_rx_buf_length + |
243 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, | 243 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, |
244 | DMA_FROM_DEVICE)); | 244 | DMA_FROM_DEVICE)); |
245 | 245 | ||
246 | out_be32((u32 *)bd, (R_E | R_I | (in_be32((u32 *)bd) & R_W))); | 246 | out_be32((u32 __iomem *)bd, |
247 | (R_E | R_I | (in_be32((u32 __iomem*)bd) & R_W))); | ||
247 | 248 | ||
248 | return skb; | 249 | return skb; |
249 | } | 250 | } |
250 | 251 | ||
251 | static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ) | 252 | static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ) |
252 | { | 253 | { |
253 | u8 *bd; | 254 | u8 __iomem *bd; |
254 | u32 bd_status; | 255 | u32 bd_status; |
255 | struct sk_buff *skb; | 256 | struct sk_buff *skb; |
256 | int i; | 257 | int i; |
@@ -259,7 +260,7 @@ static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ) | |||
259 | i = 0; | 260 | i = 0; |
260 | 261 | ||
261 | do { | 262 | do { |
262 | bd_status = in_be32((u32*)bd); | 263 | bd_status = in_be32((u32 __iomem *)bd); |
263 | skb = get_new_skb(ugeth, bd); | 264 | skb = get_new_skb(ugeth, bd); |
264 | 265 | ||
265 | if (!skb) /* If can not allocate data buffer, | 266 | if (!skb) /* If can not allocate data buffer, |
@@ -277,7 +278,7 @@ static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ) | |||
277 | } | 278 | } |
278 | 279 | ||
279 | static int fill_init_enet_entries(struct ucc_geth_private *ugeth, | 280 | static int fill_init_enet_entries(struct ucc_geth_private *ugeth, |
280 | volatile u32 *p_start, | 281 | u32 *p_start, |
281 | u8 num_entries, | 282 | u8 num_entries, |
282 | u32 thread_size, | 283 | u32 thread_size, |
283 | u32 thread_alignment, | 284 | u32 thread_alignment, |
@@ -316,7 +317,7 @@ static int fill_init_enet_entries(struct ucc_geth_private *ugeth, | |||
316 | } | 317 | } |
317 | 318 | ||
318 | static int return_init_enet_entries(struct ucc_geth_private *ugeth, | 319 | static int return_init_enet_entries(struct ucc_geth_private *ugeth, |
319 | volatile u32 *p_start, | 320 | u32 *p_start, |
320 | u8 num_entries, | 321 | u8 num_entries, |
321 | enum qe_risc_allocation risc, | 322 | enum qe_risc_allocation risc, |
322 | int skip_page_for_first_entry) | 323 | int skip_page_for_first_entry) |
@@ -326,21 +327,22 @@ static int return_init_enet_entries(struct ucc_geth_private *ugeth, | |||
326 | int snum; | 327 | int snum; |
327 | 328 | ||
328 | for (i = 0; i < num_entries; i++) { | 329 | for (i = 0; i < num_entries; i++) { |
330 | u32 val = *p_start; | ||
331 | |||
329 | /* Check that this entry was actually valid -- | 332 | /* Check that this entry was actually valid -- |
330 | needed in case failed in allocations */ | 333 | needed in case failed in allocations */ |
331 | if ((*p_start & ENET_INIT_PARAM_RISC_MASK) == risc) { | 334 | if ((val & ENET_INIT_PARAM_RISC_MASK) == risc) { |
332 | snum = | 335 | snum = |
333 | (u32) (*p_start & ENET_INIT_PARAM_SNUM_MASK) >> | 336 | (u32) (val & ENET_INIT_PARAM_SNUM_MASK) >> |
334 | ENET_INIT_PARAM_SNUM_SHIFT; | 337 | ENET_INIT_PARAM_SNUM_SHIFT; |
335 | qe_put_snum((u8) snum); | 338 | qe_put_snum((u8) snum); |
336 | if (!((i == 0) && skip_page_for_first_entry)) { | 339 | if (!((i == 0) && skip_page_for_first_entry)) { |
337 | /* First entry of Rx does not have page */ | 340 | /* First entry of Rx does not have page */ |
338 | init_enet_offset = | 341 | init_enet_offset = |
339 | (in_be32(p_start) & | 342 | (val & ENET_INIT_PARAM_PTR_MASK); |
340 | ENET_INIT_PARAM_PTR_MASK); | ||
341 | qe_muram_free(init_enet_offset); | 343 | qe_muram_free(init_enet_offset); |
342 | } | 344 | } |
343 | *(p_start++) = 0; /* Just for cosmetics */ | 345 | *p_start++ = 0; |
344 | } | 346 | } |
345 | } | 347 | } |
346 | 348 | ||
@@ -349,7 +351,7 @@ static int return_init_enet_entries(struct ucc_geth_private *ugeth, | |||
349 | 351 | ||
350 | #ifdef DEBUG | 352 | #ifdef DEBUG |
351 | static int dump_init_enet_entries(struct ucc_geth_private *ugeth, | 353 | static int dump_init_enet_entries(struct ucc_geth_private *ugeth, |
352 | volatile u32 *p_start, | 354 | u32 __iomem *p_start, |
353 | u8 num_entries, | 355 | u8 num_entries, |
354 | u32 thread_size, | 356 | u32 thread_size, |
355 | enum qe_risc_allocation risc, | 357 | enum qe_risc_allocation risc, |
@@ -360,11 +362,13 @@ static int dump_init_enet_entries(struct ucc_geth_private *ugeth, | |||
360 | int snum; | 362 | int snum; |
361 | 363 | ||
362 | for (i = 0; i < num_entries; i++) { | 364 | for (i = 0; i < num_entries; i++) { |
365 | u32 val = in_be32(p_start); | ||
366 | |||
363 | /* Check that this entry was actually valid -- | 367 | /* Check that this entry was actually valid -- |
364 | needed in case failed in allocations */ | 368 | needed in case failed in allocations */ |
365 | if ((*p_start & ENET_INIT_PARAM_RISC_MASK) == risc) { | 369 | if ((val & ENET_INIT_PARAM_RISC_MASK) == risc) { |
366 | snum = | 370 | snum = |
367 | (u32) (*p_start & ENET_INIT_PARAM_SNUM_MASK) >> | 371 | (u32) (val & ENET_INIT_PARAM_SNUM_MASK) >> |
368 | ENET_INIT_PARAM_SNUM_SHIFT; | 372 | ENET_INIT_PARAM_SNUM_SHIFT; |
369 | qe_put_snum((u8) snum); | 373 | qe_put_snum((u8) snum); |
370 | if (!((i == 0) && skip_page_for_first_entry)) { | 374 | if (!((i == 0) && skip_page_for_first_entry)) { |
@@ -440,7 +444,7 @@ static int hw_add_addr_in_paddr(struct ucc_geth_private *ugeth, | |||
440 | 444 | ||
441 | static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num) | 445 | static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num) |
442 | { | 446 | { |
443 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; | 447 | struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt; |
444 | 448 | ||
445 | if (!(paddr_num < NUM_OF_PADDRS)) { | 449 | if (!(paddr_num < NUM_OF_PADDRS)) { |
446 | ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__); | 450 | ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__); |
@@ -448,7 +452,7 @@ static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num) | |||
448 | } | 452 | } |
449 | 453 | ||
450 | p_82xx_addr_filt = | 454 | p_82xx_addr_filt = |
451 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> | 455 | (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth->p_rx_glbl_pram-> |
452 | addressfiltering; | 456 | addressfiltering; |
453 | 457 | ||
454 | /* Writing address ff.ff.ff.ff.ff.ff disables address | 458 | /* Writing address ff.ff.ff.ff.ff.ff disables address |
@@ -463,11 +467,11 @@ static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num) | |||
463 | static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth, | 467 | static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth, |
464 | u8 *p_enet_addr) | 468 | u8 *p_enet_addr) |
465 | { | 469 | { |
466 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; | 470 | struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt; |
467 | u32 cecr_subblock; | 471 | u32 cecr_subblock; |
468 | 472 | ||
469 | p_82xx_addr_filt = | 473 | p_82xx_addr_filt = |
470 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> | 474 | (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth->p_rx_glbl_pram-> |
471 | addressfiltering; | 475 | addressfiltering; |
472 | 476 | ||
473 | cecr_subblock = | 477 | cecr_subblock = |
@@ -487,7 +491,7 @@ static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth, | |||
487 | static void magic_packet_detection_enable(struct ucc_geth_private *ugeth) | 491 | static void magic_packet_detection_enable(struct ucc_geth_private *ugeth) |
488 | { | 492 | { |
489 | struct ucc_fast_private *uccf; | 493 | struct ucc_fast_private *uccf; |
490 | struct ucc_geth *ug_regs; | 494 | struct ucc_geth __iomem *ug_regs; |
491 | u32 maccfg2, uccm; | 495 | u32 maccfg2, uccm; |
492 | 496 | ||
493 | uccf = ugeth->uccf; | 497 | uccf = ugeth->uccf; |
@@ -507,7 +511,7 @@ static void magic_packet_detection_enable(struct ucc_geth_private *ugeth) | |||
507 | static void magic_packet_detection_disable(struct ucc_geth_private *ugeth) | 511 | static void magic_packet_detection_disable(struct ucc_geth_private *ugeth) |
508 | { | 512 | { |
509 | struct ucc_fast_private *uccf; | 513 | struct ucc_fast_private *uccf; |
510 | struct ucc_geth *ug_regs; | 514 | struct ucc_geth __iomem *ug_regs; |
511 | u32 maccfg2, uccm; | 515 | u32 maccfg2, uccm; |
512 | 516 | ||
513 | uccf = ugeth->uccf; | 517 | uccf = ugeth->uccf; |
@@ -538,13 +542,13 @@ static void get_statistics(struct ucc_geth_private *ugeth, | |||
538 | rx_firmware_statistics, | 542 | rx_firmware_statistics, |
539 | struct ucc_geth_hardware_statistics *hardware_statistics) | 543 | struct ucc_geth_hardware_statistics *hardware_statistics) |
540 | { | 544 | { |
541 | struct ucc_fast *uf_regs; | 545 | struct ucc_fast __iomem *uf_regs; |
542 | struct ucc_geth *ug_regs; | 546 | struct ucc_geth __iomem *ug_regs; |
543 | struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram; | 547 | struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram; |
544 | struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram; | 548 | struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram; |
545 | 549 | ||
546 | ug_regs = ugeth->ug_regs; | 550 | ug_regs = ugeth->ug_regs; |
547 | uf_regs = (struct ucc_fast *) ug_regs; | 551 | uf_regs = (struct ucc_fast __iomem *) ug_regs; |
548 | p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram; | 552 | p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram; |
549 | p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram; | 553 | p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram; |
550 | 554 | ||
@@ -1132,9 +1136,9 @@ static void dump_regs(struct ucc_geth_private *ugeth) | |||
1132 | } | 1136 | } |
1133 | #endif /* DEBUG */ | 1137 | #endif /* DEBUG */ |
1134 | 1138 | ||
1135 | static void init_default_reg_vals(volatile u32 *upsmr_register, | 1139 | static void init_default_reg_vals(u32 __iomem *upsmr_register, |
1136 | volatile u32 *maccfg1_register, | 1140 | u32 __iomem *maccfg1_register, |
1137 | volatile u32 *maccfg2_register) | 1141 | u32 __iomem *maccfg2_register) |
1138 | { | 1142 | { |
1139 | out_be32(upsmr_register, UCC_GETH_UPSMR_INIT); | 1143 | out_be32(upsmr_register, UCC_GETH_UPSMR_INIT); |
1140 | out_be32(maccfg1_register, UCC_GETH_MACCFG1_INIT); | 1144 | out_be32(maccfg1_register, UCC_GETH_MACCFG1_INIT); |
@@ -1148,7 +1152,7 @@ static int init_half_duplex_params(int alt_beb, | |||
1148 | u8 alt_beb_truncation, | 1152 | u8 alt_beb_truncation, |
1149 | u8 max_retransmissions, | 1153 | u8 max_retransmissions, |
1150 | u8 collision_window, | 1154 | u8 collision_window, |
1151 | volatile u32 *hafdup_register) | 1155 | u32 __iomem *hafdup_register) |
1152 | { | 1156 | { |
1153 | u32 value = 0; | 1157 | u32 value = 0; |
1154 | 1158 | ||
@@ -1180,7 +1184,7 @@ static int init_inter_frame_gap_params(u8 non_btb_cs_ipg, | |||
1180 | u8 non_btb_ipg, | 1184 | u8 non_btb_ipg, |
1181 | u8 min_ifg, | 1185 | u8 min_ifg, |
1182 | u8 btb_ipg, | 1186 | u8 btb_ipg, |
1183 | volatile u32 *ipgifg_register) | 1187 | u32 __iomem *ipgifg_register) |
1184 | { | 1188 | { |
1185 | u32 value = 0; | 1189 | u32 value = 0; |
1186 | 1190 | ||
@@ -1215,9 +1219,9 @@ int init_flow_control_params(u32 automatic_flow_control_mode, | |||
1215 | int tx_flow_control_enable, | 1219 | int tx_flow_control_enable, |
1216 | u16 pause_period, | 1220 | u16 pause_period, |
1217 | u16 extension_field, | 1221 | u16 extension_field, |
1218 | volatile u32 *upsmr_register, | 1222 | u32 __iomem *upsmr_register, |
1219 | volatile u32 *uempr_register, | 1223 | u32 __iomem *uempr_register, |
1220 | volatile u32 *maccfg1_register) | 1224 | u32 __iomem *maccfg1_register) |
1221 | { | 1225 | { |
1222 | u32 value = 0; | 1226 | u32 value = 0; |
1223 | 1227 | ||
@@ -1243,8 +1247,8 @@ int init_flow_control_params(u32 automatic_flow_control_mode, | |||
1243 | 1247 | ||
1244 | static int init_hw_statistics_gathering_mode(int enable_hardware_statistics, | 1248 | static int init_hw_statistics_gathering_mode(int enable_hardware_statistics, |
1245 | int auto_zero_hardware_statistics, | 1249 | int auto_zero_hardware_statistics, |
1246 | volatile u32 *upsmr_register, | 1250 | u32 __iomem *upsmr_register, |
1247 | volatile u16 *uescr_register) | 1251 | u16 __iomem *uescr_register) |
1248 | { | 1252 | { |
1249 | u32 upsmr_value = 0; | 1253 | u32 upsmr_value = 0; |
1250 | u16 uescr_value = 0; | 1254 | u16 uescr_value = 0; |
@@ -1270,12 +1274,12 @@ static int init_hw_statistics_gathering_mode(int enable_hardware_statistics, | |||
1270 | static int init_firmware_statistics_gathering_mode(int | 1274 | static int init_firmware_statistics_gathering_mode(int |
1271 | enable_tx_firmware_statistics, | 1275 | enable_tx_firmware_statistics, |
1272 | int enable_rx_firmware_statistics, | 1276 | int enable_rx_firmware_statistics, |
1273 | volatile u32 *tx_rmon_base_ptr, | 1277 | u32 __iomem *tx_rmon_base_ptr, |
1274 | u32 tx_firmware_statistics_structure_address, | 1278 | u32 tx_firmware_statistics_structure_address, |
1275 | volatile u32 *rx_rmon_base_ptr, | 1279 | u32 __iomem *rx_rmon_base_ptr, |
1276 | u32 rx_firmware_statistics_structure_address, | 1280 | u32 rx_firmware_statistics_structure_address, |
1277 | volatile u16 *temoder_register, | 1281 | u16 __iomem *temoder_register, |
1278 | volatile u32 *remoder_register) | 1282 | u32 __iomem *remoder_register) |
1279 | { | 1283 | { |
1280 | /* Note: this function does not check if */ | 1284 | /* Note: this function does not check if */ |
1281 | /* the parameters it receives are NULL */ | 1285 | /* the parameters it receives are NULL */ |
@@ -1307,8 +1311,8 @@ static int init_mac_station_addr_regs(u8 address_byte_0, | |||
1307 | u8 address_byte_3, | 1311 | u8 address_byte_3, |
1308 | u8 address_byte_4, | 1312 | u8 address_byte_4, |
1309 | u8 address_byte_5, | 1313 | u8 address_byte_5, |
1310 | volatile u32 *macstnaddr1_register, | 1314 | u32 __iomem *macstnaddr1_register, |
1311 | volatile u32 *macstnaddr2_register) | 1315 | u32 __iomem *macstnaddr2_register) |
1312 | { | 1316 | { |
1313 | u32 value = 0; | 1317 | u32 value = 0; |
1314 | 1318 | ||
@@ -1344,7 +1348,7 @@ static int init_mac_station_addr_regs(u8 address_byte_0, | |||
1344 | } | 1348 | } |
1345 | 1349 | ||
1346 | static int init_check_frame_length_mode(int length_check, | 1350 | static int init_check_frame_length_mode(int length_check, |
1347 | volatile u32 *maccfg2_register) | 1351 | u32 __iomem *maccfg2_register) |
1348 | { | 1352 | { |
1349 | u32 value = 0; | 1353 | u32 value = 0; |
1350 | 1354 | ||
@@ -1360,7 +1364,7 @@ static int init_check_frame_length_mode(int length_check, | |||
1360 | } | 1364 | } |
1361 | 1365 | ||
1362 | static int init_preamble_length(u8 preamble_length, | 1366 | static int init_preamble_length(u8 preamble_length, |
1363 | volatile u32 *maccfg2_register) | 1367 | u32 __iomem *maccfg2_register) |
1364 | { | 1368 | { |
1365 | u32 value = 0; | 1369 | u32 value = 0; |
1366 | 1370 | ||
@@ -1376,7 +1380,7 @@ static int init_preamble_length(u8 preamble_length, | |||
1376 | 1380 | ||
1377 | static int init_rx_parameters(int reject_broadcast, | 1381 | static int init_rx_parameters(int reject_broadcast, |
1378 | int receive_short_frames, | 1382 | int receive_short_frames, |
1379 | int promiscuous, volatile u32 *upsmr_register) | 1383 | int promiscuous, u32 __iomem *upsmr_register) |
1380 | { | 1384 | { |
1381 | u32 value = 0; | 1385 | u32 value = 0; |
1382 | 1386 | ||
@@ -1403,7 +1407,7 @@ static int init_rx_parameters(int reject_broadcast, | |||
1403 | } | 1407 | } |
1404 | 1408 | ||
1405 | static int init_max_rx_buff_len(u16 max_rx_buf_len, | 1409 | static int init_max_rx_buff_len(u16 max_rx_buf_len, |
1406 | volatile u16 *mrblr_register) | 1410 | u16 __iomem *mrblr_register) |
1407 | { | 1411 | { |
1408 | /* max_rx_buf_len value must be a multiple of 128 */ | 1412 | /* max_rx_buf_len value must be a multiple of 128 */ |
1409 | if ((max_rx_buf_len == 0) | 1413 | if ((max_rx_buf_len == 0) |
@@ -1415,8 +1419,8 @@ static int init_max_rx_buff_len(u16 max_rx_buf_len, | |||
1415 | } | 1419 | } |
1416 | 1420 | ||
1417 | static int init_min_frame_len(u16 min_frame_length, | 1421 | static int init_min_frame_len(u16 min_frame_length, |
1418 | volatile u16 *minflr_register, | 1422 | u16 __iomem *minflr_register, |
1419 | volatile u16 *mrblr_register) | 1423 | u16 __iomem *mrblr_register) |
1420 | { | 1424 | { |
1421 | u16 mrblr_value = 0; | 1425 | u16 mrblr_value = 0; |
1422 | 1426 | ||
@@ -1431,8 +1435,8 @@ static int init_min_frame_len(u16 min_frame_length, | |||
1431 | static int adjust_enet_interface(struct ucc_geth_private *ugeth) | 1435 | static int adjust_enet_interface(struct ucc_geth_private *ugeth) |
1432 | { | 1436 | { |
1433 | struct ucc_geth_info *ug_info; | 1437 | struct ucc_geth_info *ug_info; |
1434 | struct ucc_geth *ug_regs; | 1438 | struct ucc_geth __iomem *ug_regs; |
1435 | struct ucc_fast *uf_regs; | 1439 | struct ucc_fast __iomem *uf_regs; |
1436 | int ret_val; | 1440 | int ret_val; |
1437 | u32 upsmr, maccfg2, tbiBaseAddress; | 1441 | u32 upsmr, maccfg2, tbiBaseAddress; |
1438 | u16 value; | 1442 | u16 value; |
@@ -1517,8 +1521,8 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth) | |||
1517 | static void adjust_link(struct net_device *dev) | 1521 | static void adjust_link(struct net_device *dev) |
1518 | { | 1522 | { |
1519 | struct ucc_geth_private *ugeth = netdev_priv(dev); | 1523 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
1520 | struct ucc_geth *ug_regs; | 1524 | struct ucc_geth __iomem *ug_regs; |
1521 | struct ucc_fast *uf_regs; | 1525 | struct ucc_fast __iomem *uf_regs; |
1522 | struct phy_device *phydev = ugeth->phydev; | 1526 | struct phy_device *phydev = ugeth->phydev; |
1523 | unsigned long flags; | 1527 | unsigned long flags; |
1524 | int new_state = 0; | 1528 | int new_state = 0; |
@@ -1678,9 +1682,9 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth) | |||
1678 | uccf = ugeth->uccf; | 1682 | uccf = ugeth->uccf; |
1679 | 1683 | ||
1680 | /* Clear acknowledge bit */ | 1684 | /* Clear acknowledge bit */ |
1681 | temp = ugeth->p_rx_glbl_pram->rxgstpack; | 1685 | temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack); |
1682 | temp &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX; | 1686 | temp &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX; |
1683 | ugeth->p_rx_glbl_pram->rxgstpack = temp; | 1687 | out_8(&ugeth->p_rx_glbl_pram->rxgstpack, temp); |
1684 | 1688 | ||
1685 | /* Keep issuing command and checking acknowledge bit until | 1689 | /* Keep issuing command and checking acknowledge bit until |
1686 | it is asserted, according to spec */ | 1690 | it is asserted, according to spec */ |
@@ -1692,7 +1696,7 @@ static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth) | |||
1692 | qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, | 1696 | qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock, |
1693 | QE_CR_PROTOCOL_ETHERNET, 0); | 1697 | QE_CR_PROTOCOL_ETHERNET, 0); |
1694 | 1698 | ||
1695 | temp = ugeth->p_rx_glbl_pram->rxgstpack; | 1699 | temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack); |
1696 | } while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX)); | 1700 | } while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX)); |
1697 | 1701 | ||
1698 | uccf->stopped_rx = 1; | 1702 | uccf->stopped_rx = 1; |
@@ -1991,19 +1995,20 @@ static int ugeth_82xx_filtering_clear_all_addr_in_hash(struct ucc_geth_private * | |||
1991 | enum enet_addr_type | 1995 | enum enet_addr_type |
1992 | enet_addr_type) | 1996 | enet_addr_type) |
1993 | { | 1997 | { |
1994 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; | 1998 | struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt; |
1995 | struct ucc_fast_private *uccf; | 1999 | struct ucc_fast_private *uccf; |
1996 | enum comm_dir comm_dir; | 2000 | enum comm_dir comm_dir; |
1997 | struct list_head *p_lh; | 2001 | struct list_head *p_lh; |
1998 | u16 i, num; | 2002 | u16 i, num; |
1999 | u32 *addr_h, *addr_l; | 2003 | u32 __iomem *addr_h; |
2004 | u32 __iomem *addr_l; | ||
2000 | u8 *p_counter; | 2005 | u8 *p_counter; |
2001 | 2006 | ||
2002 | uccf = ugeth->uccf; | 2007 | uccf = ugeth->uccf; |
2003 | 2008 | ||
2004 | p_82xx_addr_filt = | 2009 | p_82xx_addr_filt = |
2005 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram-> | 2010 | (struct ucc_geth_82xx_address_filtering_pram __iomem *) |
2006 | addressfiltering; | 2011 | ugeth->p_rx_glbl_pram->addressfiltering; |
2007 | 2012 | ||
2008 | if (enet_addr_type == ENET_ADDR_TYPE_GROUP) { | 2013 | if (enet_addr_type == ENET_ADDR_TYPE_GROUP) { |
2009 | addr_h = &(p_82xx_addr_filt->gaddr_h); | 2014 | addr_h = &(p_82xx_addr_filt->gaddr_h); |
@@ -2079,7 +2084,7 @@ static int ugeth_82xx_filtering_clear_addr_in_paddr(struct ucc_geth_private *uge | |||
2079 | static void ucc_geth_memclean(struct ucc_geth_private *ugeth) | 2084 | static void ucc_geth_memclean(struct ucc_geth_private *ugeth) |
2080 | { | 2085 | { |
2081 | u16 i, j; | 2086 | u16 i, j; |
2082 | u8 *bd; | 2087 | u8 __iomem *bd; |
2083 | 2088 | ||
2084 | if (!ugeth) | 2089 | if (!ugeth) |
2085 | return; | 2090 | return; |
@@ -2154,8 +2159,8 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth) | |||
2154 | for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) { | 2159 | for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) { |
2155 | if (ugeth->tx_skbuff[i][j]) { | 2160 | if (ugeth->tx_skbuff[i][j]) { |
2156 | dma_unmap_single(NULL, | 2161 | dma_unmap_single(NULL, |
2157 | ((struct qe_bd *)bd)->buf, | 2162 | in_be32(&((struct qe_bd __iomem *)bd)->buf), |
2158 | (in_be32((u32 *)bd) & | 2163 | (in_be32((u32 __iomem *)bd) & |
2159 | BD_LENGTH_MASK), | 2164 | BD_LENGTH_MASK), |
2160 | DMA_TO_DEVICE); | 2165 | DMA_TO_DEVICE); |
2161 | dev_kfree_skb_any(ugeth->tx_skbuff[i][j]); | 2166 | dev_kfree_skb_any(ugeth->tx_skbuff[i][j]); |
@@ -2182,7 +2187,7 @@ static void ucc_geth_memclean(struct ucc_geth_private *ugeth) | |||
2182 | for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) { | 2187 | for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) { |
2183 | if (ugeth->rx_skbuff[i][j]) { | 2188 | if (ugeth->rx_skbuff[i][j]) { |
2184 | dma_unmap_single(NULL, | 2189 | dma_unmap_single(NULL, |
2185 | ((struct qe_bd *)bd)->buf, | 2190 | in_be32(&((struct qe_bd __iomem *)bd)->buf), |
2186 | ugeth->ug_info-> | 2191 | ugeth->ug_info-> |
2187 | uf_info.max_rx_buf_length + | 2192 | uf_info.max_rx_buf_length + |
2188 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, | 2193 | UCC_GETH_RX_DATA_BUF_ALIGNMENT, |
@@ -2218,8 +2223,8 @@ static void ucc_geth_set_multi(struct net_device *dev) | |||
2218 | { | 2223 | { |
2219 | struct ucc_geth_private *ugeth; | 2224 | struct ucc_geth_private *ugeth; |
2220 | struct dev_mc_list *dmi; | 2225 | struct dev_mc_list *dmi; |
2221 | struct ucc_fast *uf_regs; | 2226 | struct ucc_fast __iomem *uf_regs; |
2222 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; | 2227 | struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt; |
2223 | int i; | 2228 | int i; |
2224 | 2229 | ||
2225 | ugeth = netdev_priv(dev); | 2230 | ugeth = netdev_priv(dev); |
@@ -2228,14 +2233,14 @@ static void ucc_geth_set_multi(struct net_device *dev) | |||
2228 | 2233 | ||
2229 | if (dev->flags & IFF_PROMISC) { | 2234 | if (dev->flags & IFF_PROMISC) { |
2230 | 2235 | ||
2231 | uf_regs->upsmr |= UPSMR_PRO; | 2236 | out_be32(&uf_regs->upsmr, in_be32(&uf_regs->upsmr) | UPSMR_PRO); |
2232 | 2237 | ||
2233 | } else { | 2238 | } else { |
2234 | 2239 | ||
2235 | uf_regs->upsmr &= ~UPSMR_PRO; | 2240 | out_be32(&uf_regs->upsmr, in_be32(&uf_regs->upsmr)&~UPSMR_PRO); |
2236 | 2241 | ||
2237 | p_82xx_addr_filt = | 2242 | p_82xx_addr_filt = |
2238 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth-> | 2243 | (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth-> |
2239 | p_rx_glbl_pram->addressfiltering; | 2244 | p_rx_glbl_pram->addressfiltering; |
2240 | 2245 | ||
2241 | if (dev->flags & IFF_ALLMULTI) { | 2246 | if (dev->flags & IFF_ALLMULTI) { |
@@ -2270,7 +2275,7 @@ static void ucc_geth_set_multi(struct net_device *dev) | |||
2270 | 2275 | ||
2271 | static void ucc_geth_stop(struct ucc_geth_private *ugeth) | 2276 | static void ucc_geth_stop(struct ucc_geth_private *ugeth) |
2272 | { | 2277 | { |
2273 | struct ucc_geth *ug_regs = ugeth->ug_regs; | 2278 | struct ucc_geth __iomem *ug_regs = ugeth->ug_regs; |
2274 | struct phy_device *phydev = ugeth->phydev; | 2279 | struct phy_device *phydev = ugeth->phydev; |
2275 | u32 tempval; | 2280 | u32 tempval; |
2276 | 2281 | ||
@@ -2419,20 +2424,20 @@ static int ucc_struct_init(struct ucc_geth_private *ugeth) | |||
2419 | return -ENOMEM; | 2424 | return -ENOMEM; |
2420 | } | 2425 | } |
2421 | 2426 | ||
2422 | ugeth->ug_regs = (struct ucc_geth *) ioremap(uf_info->regs, sizeof(struct ucc_geth)); | 2427 | ugeth->ug_regs = (struct ucc_geth __iomem *) ioremap(uf_info->regs, sizeof(struct ucc_geth)); |
2423 | 2428 | ||
2424 | return 0; | 2429 | return 0; |
2425 | } | 2430 | } |
2426 | 2431 | ||
2427 | static int ucc_geth_startup(struct ucc_geth_private *ugeth) | 2432 | static int ucc_geth_startup(struct ucc_geth_private *ugeth) |
2428 | { | 2433 | { |
2429 | struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt; | 2434 | struct ucc_geth_82xx_address_filtering_pram __iomem *p_82xx_addr_filt; |
2430 | struct ucc_geth_init_pram *p_init_enet_pram; | 2435 | struct ucc_geth_init_pram __iomem *p_init_enet_pram; |
2431 | struct ucc_fast_private *uccf; | 2436 | struct ucc_fast_private *uccf; |
2432 | struct ucc_geth_info *ug_info; | 2437 | struct ucc_geth_info *ug_info; |
2433 | struct ucc_fast_info *uf_info; | 2438 | struct ucc_fast_info *uf_info; |
2434 | struct ucc_fast *uf_regs; | 2439 | struct ucc_fast __iomem *uf_regs; |
2435 | struct ucc_geth *ug_regs; | 2440 | struct ucc_geth __iomem *ug_regs; |
2436 | int ret_val = -EINVAL; | 2441 | int ret_val = -EINVAL; |
2437 | u32 remoder = UCC_GETH_REMODER_INIT; | 2442 | u32 remoder = UCC_GETH_REMODER_INIT; |
2438 | u32 init_enet_pram_offset, cecr_subblock, command, maccfg1; | 2443 | u32 init_enet_pram_offset, cecr_subblock, command, maccfg1; |
@@ -2440,7 +2445,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2440 | u16 temoder = UCC_GETH_TEMODER_INIT; | 2445 | u16 temoder = UCC_GETH_TEMODER_INIT; |
2441 | u16 test; | 2446 | u16 test; |
2442 | u8 function_code = 0; | 2447 | u8 function_code = 0; |
2443 | u8 *bd, *endOfRing; | 2448 | u8 __iomem *bd; |
2449 | u8 __iomem *endOfRing; | ||
2444 | u8 numThreadsRxNumerical, numThreadsTxNumerical; | 2450 | u8 numThreadsRxNumerical, numThreadsTxNumerical; |
2445 | 2451 | ||
2446 | ugeth_vdbg("%s: IN", __FUNCTION__); | 2452 | ugeth_vdbg("%s: IN", __FUNCTION__); |
@@ -2602,11 +2608,11 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2602 | if (UCC_GETH_TX_BD_RING_ALIGNMENT > 4) | 2608 | if (UCC_GETH_TX_BD_RING_ALIGNMENT > 4) |
2603 | align = UCC_GETH_TX_BD_RING_ALIGNMENT; | 2609 | align = UCC_GETH_TX_BD_RING_ALIGNMENT; |
2604 | ugeth->tx_bd_ring_offset[j] = | 2610 | ugeth->tx_bd_ring_offset[j] = |
2605 | kmalloc((u32) (length + align), GFP_KERNEL); | 2611 | (u32) kmalloc((u32) (length + align), GFP_KERNEL); |
2606 | 2612 | ||
2607 | if (ugeth->tx_bd_ring_offset[j] != 0) | 2613 | if (ugeth->tx_bd_ring_offset[j] != 0) |
2608 | ugeth->p_tx_bd_ring[j] = | 2614 | ugeth->p_tx_bd_ring[j] = |
2609 | (void*)((ugeth->tx_bd_ring_offset[j] + | 2615 | (u8 __iomem *)((ugeth->tx_bd_ring_offset[j] + |
2610 | align) & ~(align - 1)); | 2616 | align) & ~(align - 1)); |
2611 | } else if (uf_info->bd_mem_part == MEM_PART_MURAM) { | 2617 | } else if (uf_info->bd_mem_part == MEM_PART_MURAM) { |
2612 | ugeth->tx_bd_ring_offset[j] = | 2618 | ugeth->tx_bd_ring_offset[j] = |
@@ -2614,7 +2620,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2614 | UCC_GETH_TX_BD_RING_ALIGNMENT); | 2620 | UCC_GETH_TX_BD_RING_ALIGNMENT); |
2615 | if (!IS_ERR_VALUE(ugeth->tx_bd_ring_offset[j])) | 2621 | if (!IS_ERR_VALUE(ugeth->tx_bd_ring_offset[j])) |
2616 | ugeth->p_tx_bd_ring[j] = | 2622 | ugeth->p_tx_bd_ring[j] = |
2617 | (u8 *) qe_muram_addr(ugeth-> | 2623 | (u8 __iomem *) qe_muram_addr(ugeth-> |
2618 | tx_bd_ring_offset[j]); | 2624 | tx_bd_ring_offset[j]); |
2619 | } | 2625 | } |
2620 | if (!ugeth->p_tx_bd_ring[j]) { | 2626 | if (!ugeth->p_tx_bd_ring[j]) { |
@@ -2626,8 +2632,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2626 | return -ENOMEM; | 2632 | return -ENOMEM; |
2627 | } | 2633 | } |
2628 | /* Zero unused end of bd ring, according to spec */ | 2634 | /* Zero unused end of bd ring, according to spec */ |
2629 | memset(ugeth->p_tx_bd_ring[j] + | 2635 | memset_io((void __iomem *)(ugeth->p_tx_bd_ring[j] + |
2630 | ug_info->bdRingLenTx[j] * sizeof(struct qe_bd), 0, | 2636 | ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)), 0, |
2631 | length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)); | 2637 | length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)); |
2632 | } | 2638 | } |
2633 | 2639 | ||
@@ -2639,10 +2645,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2639 | if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4) | 2645 | if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4) |
2640 | align = UCC_GETH_RX_BD_RING_ALIGNMENT; | 2646 | align = UCC_GETH_RX_BD_RING_ALIGNMENT; |
2641 | ugeth->rx_bd_ring_offset[j] = | 2647 | ugeth->rx_bd_ring_offset[j] = |
2642 | kmalloc((u32) (length + align), GFP_KERNEL); | 2648 | (u32) kmalloc((u32) (length + align), GFP_KERNEL); |
2643 | if (ugeth->rx_bd_ring_offset[j] != 0) | 2649 | if (ugeth->rx_bd_ring_offset[j] != 0) |
2644 | ugeth->p_rx_bd_ring[j] = | 2650 | ugeth->p_rx_bd_ring[j] = |
2645 | (void*)((ugeth->rx_bd_ring_offset[j] + | 2651 | (u8 __iomem *)((ugeth->rx_bd_ring_offset[j] + |
2646 | align) & ~(align - 1)); | 2652 | align) & ~(align - 1)); |
2647 | } else if (uf_info->bd_mem_part == MEM_PART_MURAM) { | 2653 | } else if (uf_info->bd_mem_part == MEM_PART_MURAM) { |
2648 | ugeth->rx_bd_ring_offset[j] = | 2654 | ugeth->rx_bd_ring_offset[j] = |
@@ -2650,7 +2656,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2650 | UCC_GETH_RX_BD_RING_ALIGNMENT); | 2656 | UCC_GETH_RX_BD_RING_ALIGNMENT); |
2651 | if (!IS_ERR_VALUE(ugeth->rx_bd_ring_offset[j])) | 2657 | if (!IS_ERR_VALUE(ugeth->rx_bd_ring_offset[j])) |
2652 | ugeth->p_rx_bd_ring[j] = | 2658 | ugeth->p_rx_bd_ring[j] = |
2653 | (u8 *) qe_muram_addr(ugeth-> | 2659 | (u8 __iomem *) qe_muram_addr(ugeth-> |
2654 | rx_bd_ring_offset[j]); | 2660 | rx_bd_ring_offset[j]); |
2655 | } | 2661 | } |
2656 | if (!ugeth->p_rx_bd_ring[j]) { | 2662 | if (!ugeth->p_rx_bd_ring[j]) { |
@@ -2685,14 +2691,14 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2685 | bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j]; | 2691 | bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j]; |
2686 | for (i = 0; i < ug_info->bdRingLenTx[j]; i++) { | 2692 | for (i = 0; i < ug_info->bdRingLenTx[j]; i++) { |
2687 | /* clear bd buffer */ | 2693 | /* clear bd buffer */ |
2688 | out_be32(&((struct qe_bd *)bd)->buf, 0); | 2694 | out_be32(&((struct qe_bd __iomem *)bd)->buf, 0); |
2689 | /* set bd status and length */ | 2695 | /* set bd status and length */ |
2690 | out_be32((u32 *)bd, 0); | 2696 | out_be32((u32 __iomem *)bd, 0); |
2691 | bd += sizeof(struct qe_bd); | 2697 | bd += sizeof(struct qe_bd); |
2692 | } | 2698 | } |
2693 | bd -= sizeof(struct qe_bd); | 2699 | bd -= sizeof(struct qe_bd); |
2694 | /* set bd status and length */ | 2700 | /* set bd status and length */ |
2695 | out_be32((u32 *)bd, T_W); /* for last BD set Wrap bit */ | 2701 | out_be32((u32 __iomem *)bd, T_W); /* for last BD set Wrap bit */ |
2696 | } | 2702 | } |
2697 | 2703 | ||
2698 | /* Init Rx bds */ | 2704 | /* Init Rx bds */ |
@@ -2717,14 +2723,14 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2717 | bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j]; | 2723 | bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j]; |
2718 | for (i = 0; i < ug_info->bdRingLenRx[j]; i++) { | 2724 | for (i = 0; i < ug_info->bdRingLenRx[j]; i++) { |
2719 | /* set bd status and length */ | 2725 | /* set bd status and length */ |
2720 | out_be32((u32 *)bd, R_I); | 2726 | out_be32((u32 __iomem *)bd, R_I); |
2721 | /* clear bd buffer */ | 2727 | /* clear bd buffer */ |
2722 | out_be32(&((struct qe_bd *)bd)->buf, 0); | 2728 | out_be32(&((struct qe_bd __iomem *)bd)->buf, 0); |
2723 | bd += sizeof(struct qe_bd); | 2729 | bd += sizeof(struct qe_bd); |
2724 | } | 2730 | } |
2725 | bd -= sizeof(struct qe_bd); | 2731 | bd -= sizeof(struct qe_bd); |
2726 | /* set bd status and length */ | 2732 | /* set bd status and length */ |
2727 | out_be32((u32 *)bd, R_W); /* for last BD set Wrap bit */ | 2733 | out_be32((u32 __iomem *)bd, R_W); /* for last BD set Wrap bit */ |
2728 | } | 2734 | } |
2729 | 2735 | ||
2730 | /* | 2736 | /* |
@@ -2744,10 +2750,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2744 | return -ENOMEM; | 2750 | return -ENOMEM; |
2745 | } | 2751 | } |
2746 | ugeth->p_tx_glbl_pram = | 2752 | ugeth->p_tx_glbl_pram = |
2747 | (struct ucc_geth_tx_global_pram *) qe_muram_addr(ugeth-> | 2753 | (struct ucc_geth_tx_global_pram __iomem *) qe_muram_addr(ugeth-> |
2748 | tx_glbl_pram_offset); | 2754 | tx_glbl_pram_offset); |
2749 | /* Zero out p_tx_glbl_pram */ | 2755 | /* Zero out p_tx_glbl_pram */ |
2750 | memset(ugeth->p_tx_glbl_pram, 0, sizeof(struct ucc_geth_tx_global_pram)); | 2756 | memset_io((void __iomem *)ugeth->p_tx_glbl_pram, 0, sizeof(struct ucc_geth_tx_global_pram)); |
2751 | 2757 | ||
2752 | /* Fill global PRAM */ | 2758 | /* Fill global PRAM */ |
2753 | 2759 | ||
@@ -2768,7 +2774,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2768 | } | 2774 | } |
2769 | 2775 | ||
2770 | ugeth->p_thread_data_tx = | 2776 | ugeth->p_thread_data_tx = |
2771 | (struct ucc_geth_thread_data_tx *) qe_muram_addr(ugeth-> | 2777 | (struct ucc_geth_thread_data_tx __iomem *) qe_muram_addr(ugeth-> |
2772 | thread_dat_tx_offset); | 2778 | thread_dat_tx_offset); |
2773 | out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset); | 2779 | out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset); |
2774 | 2780 | ||
@@ -2779,7 +2785,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2779 | 2785 | ||
2780 | /* iphoffset */ | 2786 | /* iphoffset */ |
2781 | for (i = 0; i < TX_IP_OFFSET_ENTRY_MAX; i++) | 2787 | for (i = 0; i < TX_IP_OFFSET_ENTRY_MAX; i++) |
2782 | ugeth->p_tx_glbl_pram->iphoffset[i] = ug_info->iphoffset[i]; | 2788 | out_8(&ugeth->p_tx_glbl_pram->iphoffset[i], |
2789 | ug_info->iphoffset[i]); | ||
2783 | 2790 | ||
2784 | /* SQPTR */ | 2791 | /* SQPTR */ |
2785 | /* Size varies with number of Tx queues */ | 2792 | /* Size varies with number of Tx queues */ |
@@ -2797,7 +2804,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2797 | } | 2804 | } |
2798 | 2805 | ||
2799 | ugeth->p_send_q_mem_reg = | 2806 | ugeth->p_send_q_mem_reg = |
2800 | (struct ucc_geth_send_queue_mem_region *) qe_muram_addr(ugeth-> | 2807 | (struct ucc_geth_send_queue_mem_region __iomem *) qe_muram_addr(ugeth-> |
2801 | send_q_mem_reg_offset); | 2808 | send_q_mem_reg_offset); |
2802 | out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset); | 2809 | out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset); |
2803 | 2810 | ||
@@ -2841,25 +2848,26 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2841 | } | 2848 | } |
2842 | 2849 | ||
2843 | ugeth->p_scheduler = | 2850 | ugeth->p_scheduler = |
2844 | (struct ucc_geth_scheduler *) qe_muram_addr(ugeth-> | 2851 | (struct ucc_geth_scheduler __iomem *) qe_muram_addr(ugeth-> |
2845 | scheduler_offset); | 2852 | scheduler_offset); |
2846 | out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer, | 2853 | out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer, |
2847 | ugeth->scheduler_offset); | 2854 | ugeth->scheduler_offset); |
2848 | /* Zero out p_scheduler */ | 2855 | /* Zero out p_scheduler */ |
2849 | memset(ugeth->p_scheduler, 0, sizeof(struct ucc_geth_scheduler)); | 2856 | memset_io((void __iomem *)ugeth->p_scheduler, 0, sizeof(struct ucc_geth_scheduler)); |
2850 | 2857 | ||
2851 | /* Set values in scheduler */ | 2858 | /* Set values in scheduler */ |
2852 | out_be32(&ugeth->p_scheduler->mblinterval, | 2859 | out_be32(&ugeth->p_scheduler->mblinterval, |
2853 | ug_info->mblinterval); | 2860 | ug_info->mblinterval); |
2854 | out_be16(&ugeth->p_scheduler->nortsrbytetime, | 2861 | out_be16(&ugeth->p_scheduler->nortsrbytetime, |
2855 | ug_info->nortsrbytetime); | 2862 | ug_info->nortsrbytetime); |
2856 | ugeth->p_scheduler->fracsiz = ug_info->fracsiz; | 2863 | out_8(&ugeth->p_scheduler->fracsiz, ug_info->fracsiz); |
2857 | ugeth->p_scheduler->strictpriorityq = ug_info->strictpriorityq; | 2864 | out_8(&ugeth->p_scheduler->strictpriorityq, |
2858 | ugeth->p_scheduler->txasap = ug_info->txasap; | 2865 | ug_info->strictpriorityq); |
2859 | ugeth->p_scheduler->extrabw = ug_info->extrabw; | 2866 | out_8(&ugeth->p_scheduler->txasap, ug_info->txasap); |
2867 | out_8(&ugeth->p_scheduler->extrabw, ug_info->extrabw); | ||
2860 | for (i = 0; i < NUM_TX_QUEUES; i++) | 2868 | for (i = 0; i < NUM_TX_QUEUES; i++) |
2861 | ugeth->p_scheduler->weightfactor[i] = | 2869 | out_8(&ugeth->p_scheduler->weightfactor[i], |
2862 | ug_info->weightfactor[i]; | 2870 | ug_info->weightfactor[i]); |
2863 | 2871 | ||
2864 | /* Set pointers to cpucount registers in scheduler */ | 2872 | /* Set pointers to cpucount registers in scheduler */ |
2865 | ugeth->p_cpucount[0] = &(ugeth->p_scheduler->cpucount0); | 2873 | ugeth->p_cpucount[0] = &(ugeth->p_scheduler->cpucount0); |
@@ -2890,10 +2898,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2890 | return -ENOMEM; | 2898 | return -ENOMEM; |
2891 | } | 2899 | } |
2892 | ugeth->p_tx_fw_statistics_pram = | 2900 | ugeth->p_tx_fw_statistics_pram = |
2893 | (struct ucc_geth_tx_firmware_statistics_pram *) | 2901 | (struct ucc_geth_tx_firmware_statistics_pram __iomem *) |
2894 | qe_muram_addr(ugeth->tx_fw_statistics_pram_offset); | 2902 | qe_muram_addr(ugeth->tx_fw_statistics_pram_offset); |
2895 | /* Zero out p_tx_fw_statistics_pram */ | 2903 | /* Zero out p_tx_fw_statistics_pram */ |
2896 | memset(ugeth->p_tx_fw_statistics_pram, | 2904 | memset_io((void __iomem *)ugeth->p_tx_fw_statistics_pram, |
2897 | 0, sizeof(struct ucc_geth_tx_firmware_statistics_pram)); | 2905 | 0, sizeof(struct ucc_geth_tx_firmware_statistics_pram)); |
2898 | } | 2906 | } |
2899 | 2907 | ||
@@ -2930,10 +2938,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2930 | return -ENOMEM; | 2938 | return -ENOMEM; |
2931 | } | 2939 | } |
2932 | ugeth->p_rx_glbl_pram = | 2940 | ugeth->p_rx_glbl_pram = |
2933 | (struct ucc_geth_rx_global_pram *) qe_muram_addr(ugeth-> | 2941 | (struct ucc_geth_rx_global_pram __iomem *) qe_muram_addr(ugeth-> |
2934 | rx_glbl_pram_offset); | 2942 | rx_glbl_pram_offset); |
2935 | /* Zero out p_rx_glbl_pram */ | 2943 | /* Zero out p_rx_glbl_pram */ |
2936 | memset(ugeth->p_rx_glbl_pram, 0, sizeof(struct ucc_geth_rx_global_pram)); | 2944 | memset_io((void __iomem *)ugeth->p_rx_glbl_pram, 0, sizeof(struct ucc_geth_rx_global_pram)); |
2937 | 2945 | ||
2938 | /* Fill global PRAM */ | 2946 | /* Fill global PRAM */ |
2939 | 2947 | ||
@@ -2953,7 +2961,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2953 | } | 2961 | } |
2954 | 2962 | ||
2955 | ugeth->p_thread_data_rx = | 2963 | ugeth->p_thread_data_rx = |
2956 | (struct ucc_geth_thread_data_rx *) qe_muram_addr(ugeth-> | 2964 | (struct ucc_geth_thread_data_rx __iomem *) qe_muram_addr(ugeth-> |
2957 | thread_dat_rx_offset); | 2965 | thread_dat_rx_offset); |
2958 | out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset); | 2966 | out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset); |
2959 | 2967 | ||
@@ -2976,10 +2984,10 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
2976 | return -ENOMEM; | 2984 | return -ENOMEM; |
2977 | } | 2985 | } |
2978 | ugeth->p_rx_fw_statistics_pram = | 2986 | ugeth->p_rx_fw_statistics_pram = |
2979 | (struct ucc_geth_rx_firmware_statistics_pram *) | 2987 | (struct ucc_geth_rx_firmware_statistics_pram __iomem *) |
2980 | qe_muram_addr(ugeth->rx_fw_statistics_pram_offset); | 2988 | qe_muram_addr(ugeth->rx_fw_statistics_pram_offset); |
2981 | /* Zero out p_rx_fw_statistics_pram */ | 2989 | /* Zero out p_rx_fw_statistics_pram */ |
2982 | memset(ugeth->p_rx_fw_statistics_pram, 0, | 2990 | memset_io((void __iomem *)ugeth->p_rx_fw_statistics_pram, 0, |
2983 | sizeof(struct ucc_geth_rx_firmware_statistics_pram)); | 2991 | sizeof(struct ucc_geth_rx_firmware_statistics_pram)); |
2984 | } | 2992 | } |
2985 | 2993 | ||
@@ -3000,7 +3008,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3000 | } | 3008 | } |
3001 | 3009 | ||
3002 | ugeth->p_rx_irq_coalescing_tbl = | 3010 | ugeth->p_rx_irq_coalescing_tbl = |
3003 | (struct ucc_geth_rx_interrupt_coalescing_table *) | 3011 | (struct ucc_geth_rx_interrupt_coalescing_table __iomem *) |
3004 | qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset); | 3012 | qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset); |
3005 | out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr, | 3013 | out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr, |
3006 | ugeth->rx_irq_coalescing_tbl_offset); | 3014 | ugeth->rx_irq_coalescing_tbl_offset); |
@@ -3069,11 +3077,11 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3069 | } | 3077 | } |
3070 | 3078 | ||
3071 | ugeth->p_rx_bd_qs_tbl = | 3079 | ugeth->p_rx_bd_qs_tbl = |
3072 | (struct ucc_geth_rx_bd_queues_entry *) qe_muram_addr(ugeth-> | 3080 | (struct ucc_geth_rx_bd_queues_entry __iomem *) qe_muram_addr(ugeth-> |
3073 | rx_bd_qs_tbl_offset); | 3081 | rx_bd_qs_tbl_offset); |
3074 | out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset); | 3082 | out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset); |
3075 | /* Zero out p_rx_bd_qs_tbl */ | 3083 | /* Zero out p_rx_bd_qs_tbl */ |
3076 | memset(ugeth->p_rx_bd_qs_tbl, | 3084 | memset_io((void __iomem *)ugeth->p_rx_bd_qs_tbl, |
3077 | 0, | 3085 | 0, |
3078 | ug_info->numQueuesRx * (sizeof(struct ucc_geth_rx_bd_queues_entry) + | 3086 | ug_info->numQueuesRx * (sizeof(struct ucc_geth_rx_bd_queues_entry) + |
3079 | sizeof(struct ucc_geth_rx_prefetched_bds))); | 3087 | sizeof(struct ucc_geth_rx_prefetched_bds))); |
@@ -3133,7 +3141,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3133 | &ugeth->p_rx_glbl_pram->remoder); | 3141 | &ugeth->p_rx_glbl_pram->remoder); |
3134 | 3142 | ||
3135 | /* function code register */ | 3143 | /* function code register */ |
3136 | ugeth->p_rx_glbl_pram->rstate = function_code; | 3144 | out_8(&ugeth->p_rx_glbl_pram->rstate, function_code); |
3137 | 3145 | ||
3138 | /* initialize extended filtering */ | 3146 | /* initialize extended filtering */ |
3139 | if (ug_info->rxExtendedFiltering) { | 3147 | if (ug_info->rxExtendedFiltering) { |
@@ -3160,7 +3168,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3160 | } | 3168 | } |
3161 | 3169 | ||
3162 | ugeth->p_exf_glbl_param = | 3170 | ugeth->p_exf_glbl_param = |
3163 | (struct ucc_geth_exf_global_pram *) qe_muram_addr(ugeth-> | 3171 | (struct ucc_geth_exf_global_pram __iomem *) qe_muram_addr(ugeth-> |
3164 | exf_glbl_param_offset); | 3172 | exf_glbl_param_offset); |
3165 | out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam, | 3173 | out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam, |
3166 | ugeth->exf_glbl_param_offset); | 3174 | ugeth->exf_glbl_param_offset); |
@@ -3175,7 +3183,7 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3175 | ugeth_82xx_filtering_clear_addr_in_paddr(ugeth, (u8) j); | 3183 | ugeth_82xx_filtering_clear_addr_in_paddr(ugeth, (u8) j); |
3176 | 3184 | ||
3177 | p_82xx_addr_filt = | 3185 | p_82xx_addr_filt = |
3178 | (struct ucc_geth_82xx_address_filtering_pram *) ugeth-> | 3186 | (struct ucc_geth_82xx_address_filtering_pram __iomem *) ugeth-> |
3179 | p_rx_glbl_pram->addressfiltering; | 3187 | p_rx_glbl_pram->addressfiltering; |
3180 | 3188 | ||
3181 | ugeth_82xx_filtering_clear_all_addr_in_hash(ugeth, | 3189 | ugeth_82xx_filtering_clear_all_addr_in_hash(ugeth, |
@@ -3307,17 +3315,21 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth) | |||
3307 | return -ENOMEM; | 3315 | return -ENOMEM; |
3308 | } | 3316 | } |
3309 | p_init_enet_pram = | 3317 | p_init_enet_pram = |
3310 | (struct ucc_geth_init_pram *) qe_muram_addr(init_enet_pram_offset); | 3318 | (struct ucc_geth_init_pram __iomem *) qe_muram_addr(init_enet_pram_offset); |
3311 | 3319 | ||
3312 | /* Copy shadow InitEnet command parameter structure into PRAM */ | 3320 | /* Copy shadow InitEnet command parameter structure into PRAM */ |
3313 | p_init_enet_pram->resinit1 = ugeth->p_init_enet_param_shadow->resinit1; | 3321 | out_8(&p_init_enet_pram->resinit1, |
3314 | p_init_enet_pram->resinit2 = ugeth->p_init_enet_param_shadow->resinit2; | 3322 | ugeth->p_init_enet_param_shadow->resinit1); |
3315 | p_init_enet_pram->resinit3 = ugeth->p_init_enet_param_shadow->resinit3; | 3323 | out_8(&p_init_enet_pram->resinit2, |
3316 | p_init_enet_pram->resinit4 = ugeth->p_init_enet_param_shadow->resinit4; | 3324 | ugeth->p_init_enet_param_shadow->resinit2); |
3325 | out_8(&p_init_enet_pram->resinit3, | ||
3326 | ugeth->p_init_enet_param_shadow->resinit3); | ||
3327 | out_8(&p_init_enet_pram->resinit4, | ||
3328 | ugeth->p_init_enet_param_shadow->resinit4); | ||
3317 | out_be16(&p_init_enet_pram->resinit5, | 3329 | out_be16(&p_init_enet_pram->resinit5, |
3318 | ugeth->p_init_enet_param_shadow->resinit5); | 3330 | ugeth->p_init_enet_param_shadow->resinit5); |
3319 | p_init_enet_pram->largestexternallookupkeysize = | 3331 | out_8(&p_init_enet_pram->largestexternallookupkeysize, |
3320 | ugeth->p_init_enet_param_shadow->largestexternallookupkeysize; | 3332 | ugeth->p_init_enet_param_shadow->largestexternallookupkeysize); |
3321 | out_be32(&p_init_enet_pram->rgftgfrxglobal, | 3333 | out_be32(&p_init_enet_pram->rgftgfrxglobal, |
3322 | ugeth->p_init_enet_param_shadow->rgftgfrxglobal); | 3334 | ugeth->p_init_enet_param_shadow->rgftgfrxglobal); |
3323 | for (i = 0; i < ENET_INIT_PARAM_MAX_ENTRIES_RX; i++) | 3335 | for (i = 0; i < ENET_INIT_PARAM_MAX_ENTRIES_RX; i++) |
@@ -3371,7 +3383,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3371 | #ifdef CONFIG_UGETH_TX_ON_DEMAND | 3383 | #ifdef CONFIG_UGETH_TX_ON_DEMAND |
3372 | struct ucc_fast_private *uccf; | 3384 | struct ucc_fast_private *uccf; |
3373 | #endif | 3385 | #endif |
3374 | u8 *bd; /* BD pointer */ | 3386 | u8 __iomem *bd; /* BD pointer */ |
3375 | u32 bd_status; | 3387 | u32 bd_status; |
3376 | u8 txQ = 0; | 3388 | u8 txQ = 0; |
3377 | 3389 | ||
@@ -3383,7 +3395,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3383 | 3395 | ||
3384 | /* Start from the next BD that should be filled */ | 3396 | /* Start from the next BD that should be filled */ |
3385 | bd = ugeth->txBd[txQ]; | 3397 | bd = ugeth->txBd[txQ]; |
3386 | bd_status = in_be32((u32 *)bd); | 3398 | bd_status = in_be32((u32 __iomem *)bd); |
3387 | /* Save the skb pointer so we can free it later */ | 3399 | /* Save the skb pointer so we can free it later */ |
3388 | ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb; | 3400 | ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb; |
3389 | 3401 | ||
@@ -3393,7 +3405,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3393 | 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); | 3405 | 1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]); |
3394 | 3406 | ||
3395 | /* set up the buffer descriptor */ | 3407 | /* set up the buffer descriptor */ |
3396 | out_be32(&((struct qe_bd *)bd)->buf, | 3408 | out_be32(&((struct qe_bd __iomem *)bd)->buf, |
3397 | dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE)); | 3409 | dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE)); |
3398 | 3410 | ||
3399 | /* printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); */ | 3411 | /* printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); */ |
@@ -3401,7 +3413,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3401 | bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len; | 3413 | bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len; |
3402 | 3414 | ||
3403 | /* set bd status and length */ | 3415 | /* set bd status and length */ |
3404 | out_be32((u32 *)bd, bd_status); | 3416 | out_be32((u32 __iomem *)bd, bd_status); |
3405 | 3417 | ||
3406 | dev->trans_start = jiffies; | 3418 | dev->trans_start = jiffies; |
3407 | 3419 | ||
@@ -3441,7 +3453,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
3441 | static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit) | 3453 | static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit) |
3442 | { | 3454 | { |
3443 | struct sk_buff *skb; | 3455 | struct sk_buff *skb; |
3444 | u8 *bd; | 3456 | u8 __iomem *bd; |
3445 | u16 length, howmany = 0; | 3457 | u16 length, howmany = 0; |
3446 | u32 bd_status; | 3458 | u32 bd_status; |
3447 | u8 *bdBuffer; | 3459 | u8 *bdBuffer; |
@@ -3454,11 +3466,11 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit | |||
3454 | /* collect received buffers */ | 3466 | /* collect received buffers */ |
3455 | bd = ugeth->rxBd[rxQ]; | 3467 | bd = ugeth->rxBd[rxQ]; |
3456 | 3468 | ||
3457 | bd_status = in_be32((u32 *)bd); | 3469 | bd_status = in_be32((u32 __iomem *)bd); |
3458 | 3470 | ||
3459 | /* while there are received buffers and BD is full (~R_E) */ | 3471 | /* while there are received buffers and BD is full (~R_E) */ |
3460 | while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { | 3472 | while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) { |
3461 | bdBuffer = (u8 *) in_be32(&((struct qe_bd *)bd)->buf); | 3473 | bdBuffer = (u8 *) in_be32(&((struct qe_bd __iomem *)bd)->buf); |
3462 | length = (u16) ((bd_status & BD_LENGTH_MASK) - 4); | 3474 | length = (u16) ((bd_status & BD_LENGTH_MASK) - 4); |
3463 | skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]]; | 3475 | skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]]; |
3464 | 3476 | ||
@@ -3516,7 +3528,7 @@ static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit | |||
3516 | else | 3528 | else |
3517 | bd += sizeof(struct qe_bd); | 3529 | bd += sizeof(struct qe_bd); |
3518 | 3530 | ||
3519 | bd_status = in_be32((u32 *)bd); | 3531 | bd_status = in_be32((u32 __iomem *)bd); |
3520 | } | 3532 | } |
3521 | 3533 | ||
3522 | ugeth->rxBd[rxQ] = bd; | 3534 | ugeth->rxBd[rxQ] = bd; |
@@ -3527,11 +3539,11 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) | |||
3527 | { | 3539 | { |
3528 | /* Start from the next BD that should be filled */ | 3540 | /* Start from the next BD that should be filled */ |
3529 | struct ucc_geth_private *ugeth = netdev_priv(dev); | 3541 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
3530 | u8 *bd; /* BD pointer */ | 3542 | u8 __iomem *bd; /* BD pointer */ |
3531 | u32 bd_status; | 3543 | u32 bd_status; |
3532 | 3544 | ||
3533 | bd = ugeth->confBd[txQ]; | 3545 | bd = ugeth->confBd[txQ]; |
3534 | bd_status = in_be32((u32 *)bd); | 3546 | bd_status = in_be32((u32 __iomem *)bd); |
3535 | 3547 | ||
3536 | /* Normal processing. */ | 3548 | /* Normal processing. */ |
3537 | while ((bd_status & T_R) == 0) { | 3549 | while ((bd_status & T_R) == 0) { |
@@ -3561,7 +3573,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ) | |||
3561 | bd += sizeof(struct qe_bd); | 3573 | bd += sizeof(struct qe_bd); |
3562 | else | 3574 | else |
3563 | bd = ugeth->p_tx_bd_ring[txQ]; | 3575 | bd = ugeth->p_tx_bd_ring[txQ]; |
3564 | bd_status = in_be32((u32 *)bd); | 3576 | bd_status = in_be32((u32 __iomem *)bd); |
3565 | } | 3577 | } |
3566 | ugeth->confBd[txQ] = bd; | 3578 | ugeth->confBd[txQ] = bd; |
3567 | return 0; | 3579 | return 0; |
@@ -3910,7 +3922,7 @@ static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *ma | |||
3910 | return -EINVAL; | 3922 | return -EINVAL; |
3911 | } | 3923 | } |
3912 | } else { | 3924 | } else { |
3913 | prop = of_get_property(np, "rx-clock", NULL); | 3925 | prop = of_get_property(np, "tx-clock", NULL); |
3914 | if (!prop) { | 3926 | if (!prop) { |
3915 | printk(KERN_ERR | 3927 | printk(KERN_ERR |
3916 | "ucc_geth: mising tx-clock-name property\n"); | 3928 | "ucc_geth: mising tx-clock-name property\n"); |
diff --git a/drivers/net/ucc_geth.h b/drivers/net/ucc_geth.h index 9f8b7580a3a4..abc0e2242634 100644 --- a/drivers/net/ucc_geth.h +++ b/drivers/net/ucc_geth.h | |||
@@ -700,8 +700,8 @@ struct ucc_geth_82xx_address_filtering_pram { | |||
700 | u32 iaddr_l; /* individual address filter, low */ | 700 | u32 iaddr_l; /* individual address filter, low */ |
701 | u32 gaddr_h; /* group address filter, high */ | 701 | u32 gaddr_h; /* group address filter, high */ |
702 | u32 gaddr_l; /* group address filter, low */ | 702 | u32 gaddr_l; /* group address filter, low */ |
703 | struct ucc_geth_82xx_enet_address taddr; | 703 | struct ucc_geth_82xx_enet_address __iomem taddr; |
704 | struct ucc_geth_82xx_enet_address paddr[NUM_OF_PADDRS]; | 704 | struct ucc_geth_82xx_enet_address __iomem paddr[NUM_OF_PADDRS]; |
705 | u8 res0[0x40 - 0x38]; | 705 | u8 res0[0x40 - 0x38]; |
706 | } __attribute__ ((packed)); | 706 | } __attribute__ ((packed)); |
707 | 707 | ||
@@ -1186,40 +1186,40 @@ struct ucc_geth_private { | |||
1186 | struct ucc_fast_private *uccf; | 1186 | struct ucc_fast_private *uccf; |
1187 | struct net_device *dev; | 1187 | struct net_device *dev; |
1188 | struct napi_struct napi; | 1188 | struct napi_struct napi; |
1189 | struct ucc_geth *ug_regs; | 1189 | struct ucc_geth __iomem *ug_regs; |
1190 | struct ucc_geth_init_pram *p_init_enet_param_shadow; | 1190 | struct ucc_geth_init_pram *p_init_enet_param_shadow; |
1191 | struct ucc_geth_exf_global_pram *p_exf_glbl_param; | 1191 | struct ucc_geth_exf_global_pram __iomem *p_exf_glbl_param; |
1192 | u32 exf_glbl_param_offset; | 1192 | u32 exf_glbl_param_offset; |
1193 | struct ucc_geth_rx_global_pram *p_rx_glbl_pram; | 1193 | struct ucc_geth_rx_global_pram __iomem *p_rx_glbl_pram; |
1194 | u32 rx_glbl_pram_offset; | 1194 | u32 rx_glbl_pram_offset; |
1195 | struct ucc_geth_tx_global_pram *p_tx_glbl_pram; | 1195 | struct ucc_geth_tx_global_pram __iomem *p_tx_glbl_pram; |
1196 | u32 tx_glbl_pram_offset; | 1196 | u32 tx_glbl_pram_offset; |
1197 | struct ucc_geth_send_queue_mem_region *p_send_q_mem_reg; | 1197 | struct ucc_geth_send_queue_mem_region __iomem *p_send_q_mem_reg; |
1198 | u32 send_q_mem_reg_offset; | 1198 | u32 send_q_mem_reg_offset; |
1199 | struct ucc_geth_thread_data_tx *p_thread_data_tx; | 1199 | struct ucc_geth_thread_data_tx __iomem *p_thread_data_tx; |
1200 | u32 thread_dat_tx_offset; | 1200 | u32 thread_dat_tx_offset; |
1201 | struct ucc_geth_thread_data_rx *p_thread_data_rx; | 1201 | struct ucc_geth_thread_data_rx __iomem *p_thread_data_rx; |
1202 | u32 thread_dat_rx_offset; | 1202 | u32 thread_dat_rx_offset; |
1203 | struct ucc_geth_scheduler *p_scheduler; | 1203 | struct ucc_geth_scheduler __iomem *p_scheduler; |
1204 | u32 scheduler_offset; | 1204 | u32 scheduler_offset; |
1205 | struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram; | 1205 | struct ucc_geth_tx_firmware_statistics_pram __iomem *p_tx_fw_statistics_pram; |
1206 | u32 tx_fw_statistics_pram_offset; | 1206 | u32 tx_fw_statistics_pram_offset; |
1207 | struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram; | 1207 | struct ucc_geth_rx_firmware_statistics_pram __iomem *p_rx_fw_statistics_pram; |
1208 | u32 rx_fw_statistics_pram_offset; | 1208 | u32 rx_fw_statistics_pram_offset; |
1209 | struct ucc_geth_rx_interrupt_coalescing_table *p_rx_irq_coalescing_tbl; | 1209 | struct ucc_geth_rx_interrupt_coalescing_table __iomem *p_rx_irq_coalescing_tbl; |
1210 | u32 rx_irq_coalescing_tbl_offset; | 1210 | u32 rx_irq_coalescing_tbl_offset; |
1211 | struct ucc_geth_rx_bd_queues_entry *p_rx_bd_qs_tbl; | 1211 | struct ucc_geth_rx_bd_queues_entry __iomem *p_rx_bd_qs_tbl; |
1212 | u32 rx_bd_qs_tbl_offset; | 1212 | u32 rx_bd_qs_tbl_offset; |
1213 | u8 *p_tx_bd_ring[NUM_TX_QUEUES]; | 1213 | u8 __iomem *p_tx_bd_ring[NUM_TX_QUEUES]; |
1214 | u32 tx_bd_ring_offset[NUM_TX_QUEUES]; | 1214 | u32 tx_bd_ring_offset[NUM_TX_QUEUES]; |
1215 | u8 *p_rx_bd_ring[NUM_RX_QUEUES]; | 1215 | u8 __iomem *p_rx_bd_ring[NUM_RX_QUEUES]; |
1216 | u32 rx_bd_ring_offset[NUM_RX_QUEUES]; | 1216 | u32 rx_bd_ring_offset[NUM_RX_QUEUES]; |
1217 | u8 *confBd[NUM_TX_QUEUES]; | 1217 | u8 __iomem *confBd[NUM_TX_QUEUES]; |
1218 | u8 *txBd[NUM_TX_QUEUES]; | 1218 | u8 __iomem *txBd[NUM_TX_QUEUES]; |
1219 | u8 *rxBd[NUM_RX_QUEUES]; | 1219 | u8 __iomem *rxBd[NUM_RX_QUEUES]; |
1220 | int badFrame[NUM_RX_QUEUES]; | 1220 | int badFrame[NUM_RX_QUEUES]; |
1221 | u16 cpucount[NUM_TX_QUEUES]; | 1221 | u16 cpucount[NUM_TX_QUEUES]; |
1222 | volatile u16 *p_cpucount[NUM_TX_QUEUES]; | 1222 | u16 __iomem *p_cpucount[NUM_TX_QUEUES]; |
1223 | int indAddrRegUsed[NUM_OF_PADDRS]; | 1223 | int indAddrRegUsed[NUM_OF_PADDRS]; |
1224 | u8 paddr[NUM_OF_PADDRS][ENET_NUM_OCTETS_PER_ADDRESS]; /* ethernet address */ | 1224 | u8 paddr[NUM_OF_PADDRS][ENET_NUM_OCTETS_PER_ADDRESS]; /* ethernet address */ |
1225 | u8 numGroupAddrInHash; | 1225 | u8 numGroupAddrInHash; |
@@ -1251,4 +1251,12 @@ struct ucc_geth_private { | |||
1251 | int oldlink; | 1251 | int oldlink; |
1252 | }; | 1252 | }; |
1253 | 1253 | ||
1254 | void uec_set_ethtool_ops(struct net_device *netdev); | ||
1255 | int init_flow_control_params(u32 automatic_flow_control_mode, | ||
1256 | int rx_flow_control_enable, int tx_flow_control_enable, | ||
1257 | u16 pause_period, u16 extension_field, | ||
1258 | u32 __iomem *upsmr_register, u32 __iomem *uempr_register, | ||
1259 | u32 __iomem *maccfg1_register); | ||
1260 | |||
1261 | |||
1254 | #endif /* __UCC_GETH_H__ */ | 1262 | #endif /* __UCC_GETH_H__ */ |
diff --git a/drivers/net/ucc_geth_ethtool.c b/drivers/net/ucc_geth_ethtool.c index 33200038a14d..5f176f2b1c17 100644 --- a/drivers/net/ucc_geth_ethtool.c +++ b/drivers/net/ucc_geth_ethtool.c | |||
@@ -108,12 +108,6 @@ static char rx_fw_stat_gstrings[][ETH_GSTRING_LEN] = { | |||
108 | #define UEC_TX_FW_STATS_LEN ARRAY_SIZE(tx_fw_stat_gstrings) | 108 | #define UEC_TX_FW_STATS_LEN ARRAY_SIZE(tx_fw_stat_gstrings) |
109 | #define UEC_RX_FW_STATS_LEN ARRAY_SIZE(rx_fw_stat_gstrings) | 109 | #define UEC_RX_FW_STATS_LEN ARRAY_SIZE(rx_fw_stat_gstrings) |
110 | 110 | ||
111 | extern int init_flow_control_params(u32 automatic_flow_control_mode, | ||
112 | int rx_flow_control_enable, | ||
113 | int tx_flow_control_enable, u16 pause_period, | ||
114 | u16 extension_field, volatile u32 *upsmr_register, | ||
115 | volatile u32 *uempr_register, volatile u32 *maccfg1_register); | ||
116 | |||
117 | static int | 111 | static int |
118 | uec_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) | 112 | uec_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd) |
119 | { | 113 | { |
diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c index 2af490781005..940474736922 100644 --- a/drivers/net/ucc_geth_mii.c +++ b/drivers/net/ucc_geth_mii.c | |||
@@ -104,7 +104,7 @@ int uec_mdio_read(struct mii_bus *bus, int mii_id, int regnum) | |||
104 | } | 104 | } |
105 | 105 | ||
106 | /* Reset the MIIM registers, and wait for the bus to free */ | 106 | /* Reset the MIIM registers, and wait for the bus to free */ |
107 | int uec_mdio_reset(struct mii_bus *bus) | 107 | static int uec_mdio_reset(struct mii_bus *bus) |
108 | { | 108 | { |
109 | struct ucc_mii_mng __iomem *regs = (void __iomem *)bus->priv; | 109 | struct ucc_mii_mng __iomem *regs = (void __iomem *)bus->priv; |
110 | unsigned int timeout = PHY_INIT_TIMEOUT; | 110 | unsigned int timeout = PHY_INIT_TIMEOUT; |
@@ -240,7 +240,7 @@ reg_map_fail: | |||
240 | return err; | 240 | return err; |
241 | } | 241 | } |
242 | 242 | ||
243 | int uec_mdio_remove(struct of_device *ofdev) | 243 | static int uec_mdio_remove(struct of_device *ofdev) |
244 | { | 244 | { |
245 | struct device *device = &ofdev->dev; | 245 | struct device *device = &ofdev->dev; |
246 | struct mii_bus *bus = dev_get_drvdata(device); | 246 | struct mii_bus *bus = dev_get_drvdata(device); |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 6f245cfb6624..dc6f097062df 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -1381,6 +1381,10 @@ static const struct usb_device_id products [] = { | |||
1381 | USB_DEVICE (0x0411, 0x003d), | 1381 | USB_DEVICE (0x0411, 0x003d), |
1382 | .driver_info = (unsigned long) &ax8817x_info, | 1382 | .driver_info = (unsigned long) &ax8817x_info, |
1383 | }, { | 1383 | }, { |
1384 | // Buffalo LUA-U2-GT 10/100/1000 | ||
1385 | USB_DEVICE (0x0411, 0x006e), | ||
1386 | .driver_info = (unsigned long) &ax88178_info, | ||
1387 | }, { | ||
1384 | // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter" | 1388 | // Sitecom LN-029 "USB 2.0 10/100 Ethernet adapter" |
1385 | USB_DEVICE (0x6189, 0x182d), | 1389 | USB_DEVICE (0x6189, 0x182d), |
1386 | .driver_info = (unsigned long) &ax8817x_info, | 1390 | .driver_info = (unsigned long) &ax8817x_info, |
diff --git a/drivers/net/wan/Kconfig b/drivers/net/wan/Kconfig index 8005dd16fb4e..d5140aed7b79 100644 --- a/drivers/net/wan/Kconfig +++ b/drivers/net/wan/Kconfig | |||
@@ -150,11 +150,9 @@ config HDLC_FR | |||
150 | 150 | ||
151 | config HDLC_PPP | 151 | config HDLC_PPP |
152 | tristate "Synchronous Point-to-Point Protocol (PPP) support" | 152 | tristate "Synchronous Point-to-Point Protocol (PPP) support" |
153 | depends on HDLC && BROKEN | 153 | depends on HDLC |
154 | help | 154 | help |
155 | Generic HDLC driver supporting PPP over WAN connections. | 155 | Generic HDLC driver supporting PPP over WAN connections. |
156 | This module is currently broken and will cause a kernel panic | ||
157 | when a device configured in PPP mode is activated. | ||
158 | 156 | ||
159 | It will be replaced by new PPP implementation in Linux 2.6.26. | 157 | It will be replaced by new PPP implementation in Linux 2.6.26. |
160 | 158 | ||
diff --git a/drivers/net/wan/cosa.c b/drivers/net/wan/cosa.c index 45ddfc9763cc..b0fce1387eaf 100644 --- a/drivers/net/wan/cosa.c +++ b/drivers/net/wan/cosa.c | |||
@@ -629,7 +629,7 @@ static void sppp_channel_init(struct channel_data *chan) | |||
629 | d->base_addr = chan->cosa->datareg; | 629 | d->base_addr = chan->cosa->datareg; |
630 | d->irq = chan->cosa->irq; | 630 | d->irq = chan->cosa->irq; |
631 | d->dma = chan->cosa->dma; | 631 | d->dma = chan->cosa->dma; |
632 | d->priv = chan; | 632 | d->ml_priv = chan; |
633 | sppp_attach(&chan->pppdev); | 633 | sppp_attach(&chan->pppdev); |
634 | if (register_netdev(d)) { | 634 | if (register_netdev(d)) { |
635 | printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); | 635 | printk(KERN_WARNING "%s: register_netdev failed.\n", d->name); |
@@ -650,7 +650,7 @@ static void sppp_channel_delete(struct channel_data *chan) | |||
650 | 650 | ||
651 | static int cosa_sppp_open(struct net_device *d) | 651 | static int cosa_sppp_open(struct net_device *d) |
652 | { | 652 | { |
653 | struct channel_data *chan = d->priv; | 653 | struct channel_data *chan = d->ml_priv; |
654 | int err; | 654 | int err; |
655 | unsigned long flags; | 655 | unsigned long flags; |
656 | 656 | ||
@@ -690,7 +690,7 @@ static int cosa_sppp_open(struct net_device *d) | |||
690 | 690 | ||
691 | static int cosa_sppp_tx(struct sk_buff *skb, struct net_device *dev) | 691 | static int cosa_sppp_tx(struct sk_buff *skb, struct net_device *dev) |
692 | { | 692 | { |
693 | struct channel_data *chan = dev->priv; | 693 | struct channel_data *chan = dev->ml_priv; |
694 | 694 | ||
695 | netif_stop_queue(dev); | 695 | netif_stop_queue(dev); |
696 | 696 | ||
@@ -701,7 +701,7 @@ static int cosa_sppp_tx(struct sk_buff *skb, struct net_device *dev) | |||
701 | 701 | ||
702 | static void cosa_sppp_timeout(struct net_device *dev) | 702 | static void cosa_sppp_timeout(struct net_device *dev) |
703 | { | 703 | { |
704 | struct channel_data *chan = dev->priv; | 704 | struct channel_data *chan = dev->ml_priv; |
705 | 705 | ||
706 | if (test_bit(RXBIT, &chan->cosa->rxtx)) { | 706 | if (test_bit(RXBIT, &chan->cosa->rxtx)) { |
707 | chan->stats.rx_errors++; | 707 | chan->stats.rx_errors++; |
@@ -720,7 +720,7 @@ static void cosa_sppp_timeout(struct net_device *dev) | |||
720 | 720 | ||
721 | static int cosa_sppp_close(struct net_device *d) | 721 | static int cosa_sppp_close(struct net_device *d) |
722 | { | 722 | { |
723 | struct channel_data *chan = d->priv; | 723 | struct channel_data *chan = d->ml_priv; |
724 | unsigned long flags; | 724 | unsigned long flags; |
725 | 725 | ||
726 | netif_stop_queue(d); | 726 | netif_stop_queue(d); |
@@ -800,7 +800,7 @@ static int sppp_tx_done(struct channel_data *chan, int size) | |||
800 | 800 | ||
801 | static struct net_device_stats *cosa_net_stats(struct net_device *dev) | 801 | static struct net_device_stats *cosa_net_stats(struct net_device *dev) |
802 | { | 802 | { |
803 | struct channel_data *chan = dev->priv; | 803 | struct channel_data *chan = dev->ml_priv; |
804 | return &chan->stats; | 804 | return &chan->stats; |
805 | } | 805 | } |
806 | 806 | ||
@@ -1217,7 +1217,7 @@ static int cosa_sppp_ioctl(struct net_device *dev, struct ifreq *ifr, | |||
1217 | int cmd) | 1217 | int cmd) |
1218 | { | 1218 | { |
1219 | int rv; | 1219 | int rv; |
1220 | struct channel_data *chan = dev->priv; | 1220 | struct channel_data *chan = dev->ml_priv; |
1221 | rv = cosa_ioctl_common(chan->cosa, chan, cmd, (unsigned long)ifr->ifr_data); | 1221 | rv = cosa_ioctl_common(chan->cosa, chan, cmd, (unsigned long)ifr->ifr_data); |
1222 | if (rv == -ENOIOCTLCMD) { | 1222 | if (rv == -ENOIOCTLCMD) { |
1223 | return sppp_do_ioctl(dev, ifr, cmd); | 1223 | return sppp_do_ioctl(dev, ifr, cmd); |
diff --git a/drivers/net/wan/hdlc_ppp.c b/drivers/net/wan/hdlc_ppp.c index 10396d9686f4..00308337928e 100644 --- a/drivers/net/wan/hdlc_ppp.c +++ b/drivers/net/wan/hdlc_ppp.c | |||
@@ -45,7 +45,7 @@ static int ppp_open(struct net_device *dev) | |||
45 | int (*old_ioctl)(struct net_device *, struct ifreq *, int); | 45 | int (*old_ioctl)(struct net_device *, struct ifreq *, int); |
46 | int result; | 46 | int result; |
47 | 47 | ||
48 | dev->priv = &state(hdlc)->syncppp_ptr; | 48 | dev->ml_priv = &state(hdlc)->syncppp_ptr; |
49 | state(hdlc)->syncppp_ptr = &state(hdlc)->pppdev; | 49 | state(hdlc)->syncppp_ptr = &state(hdlc)->pppdev; |
50 | state(hdlc)->pppdev.dev = dev; | 50 | state(hdlc)->pppdev.dev = dev; |
51 | 51 | ||
diff --git a/drivers/net/wan/hostess_sv11.c b/drivers/net/wan/hostess_sv11.c index 83dbc924fcb5..f3065d3473fd 100644 --- a/drivers/net/wan/hostess_sv11.c +++ b/drivers/net/wan/hostess_sv11.c | |||
@@ -75,7 +75,7 @@ static void hostess_input(struct z8530_channel *c, struct sk_buff *skb) | |||
75 | 75 | ||
76 | static int hostess_open(struct net_device *d) | 76 | static int hostess_open(struct net_device *d) |
77 | { | 77 | { |
78 | struct sv11_device *sv11=d->priv; | 78 | struct sv11_device *sv11=d->ml_priv; |
79 | int err = -1; | 79 | int err = -1; |
80 | 80 | ||
81 | /* | 81 | /* |
@@ -128,7 +128,7 @@ static int hostess_open(struct net_device *d) | |||
128 | 128 | ||
129 | static int hostess_close(struct net_device *d) | 129 | static int hostess_close(struct net_device *d) |
130 | { | 130 | { |
131 | struct sv11_device *sv11=d->priv; | 131 | struct sv11_device *sv11=d->ml_priv; |
132 | /* | 132 | /* |
133 | * Discard new frames | 133 | * Discard new frames |
134 | */ | 134 | */ |
@@ -159,14 +159,14 @@ static int hostess_close(struct net_device *d) | |||
159 | 159 | ||
160 | static int hostess_ioctl(struct net_device *d, struct ifreq *ifr, int cmd) | 160 | static int hostess_ioctl(struct net_device *d, struct ifreq *ifr, int cmd) |
161 | { | 161 | { |
162 | /* struct sv11_device *sv11=d->priv; | 162 | /* struct sv11_device *sv11=d->ml_priv; |
163 | z8530_ioctl(d,&sv11->sync.chanA,ifr,cmd) */ | 163 | z8530_ioctl(d,&sv11->sync.chanA,ifr,cmd) */ |
164 | return sppp_do_ioctl(d, ifr,cmd); | 164 | return sppp_do_ioctl(d, ifr,cmd); |
165 | } | 165 | } |
166 | 166 | ||
167 | static struct net_device_stats *hostess_get_stats(struct net_device *d) | 167 | static struct net_device_stats *hostess_get_stats(struct net_device *d) |
168 | { | 168 | { |
169 | struct sv11_device *sv11=d->priv; | 169 | struct sv11_device *sv11=d->ml_priv; |
170 | if(sv11) | 170 | if(sv11) |
171 | return z8530_get_stats(&sv11->sync.chanA); | 171 | return z8530_get_stats(&sv11->sync.chanA); |
172 | else | 172 | else |
@@ -179,7 +179,7 @@ static struct net_device_stats *hostess_get_stats(struct net_device *d) | |||
179 | 179 | ||
180 | static int hostess_queue_xmit(struct sk_buff *skb, struct net_device *d) | 180 | static int hostess_queue_xmit(struct sk_buff *skb, struct net_device *d) |
181 | { | 181 | { |
182 | struct sv11_device *sv11=d->priv; | 182 | struct sv11_device *sv11=d->ml_priv; |
183 | return z8530_queue_xmit(&sv11->sync.chanA, skb); | 183 | return z8530_queue_xmit(&sv11->sync.chanA, skb); |
184 | } | 184 | } |
185 | 185 | ||
@@ -325,6 +325,7 @@ static struct sv11_device *sv11_init(int iobase, int irq) | |||
325 | /* | 325 | /* |
326 | * Initialise the PPP components | 326 | * Initialise the PPP components |
327 | */ | 327 | */ |
328 | d->ml_priv = sv; | ||
328 | sppp_attach(&sv->netdev); | 329 | sppp_attach(&sv->netdev); |
329 | 330 | ||
330 | /* | 331 | /* |
@@ -333,7 +334,6 @@ static struct sv11_device *sv11_init(int iobase, int irq) | |||
333 | 334 | ||
334 | d->base_addr = iobase; | 335 | d->base_addr = iobase; |
335 | d->irq = irq; | 336 | d->irq = irq; |
336 | d->priv = sv; | ||
337 | 337 | ||
338 | if(register_netdev(d)) | 338 | if(register_netdev(d)) |
339 | { | 339 | { |
diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c index b5860b97a93e..24fd613466b7 100644 --- a/drivers/net/wan/lapbether.c +++ b/drivers/net/wan/lapbether.c | |||
@@ -459,6 +459,7 @@ static void __exit lapbeth_cleanup_driver(void) | |||
459 | list_for_each_safe(entry, tmp, &lapbeth_devices) { | 459 | list_for_each_safe(entry, tmp, &lapbeth_devices) { |
460 | lapbeth = list_entry(entry, struct lapbethdev, node); | 460 | lapbeth = list_entry(entry, struct lapbethdev, node); |
461 | 461 | ||
462 | dev_put(lapbeth->ethdev); | ||
462 | unregister_netdevice(lapbeth->axdev); | 463 | unregister_netdevice(lapbeth->axdev); |
463 | } | 464 | } |
464 | rtnl_unlock(); | 465 | rtnl_unlock(); |
diff --git a/drivers/net/wan/lmc/lmc_main.c b/drivers/net/wan/lmc/lmc_main.c index 6635ecef36e5..62133cee446a 100644 --- a/drivers/net/wan/lmc/lmc_main.c +++ b/drivers/net/wan/lmc/lmc_main.c | |||
@@ -891,6 +891,7 @@ static int __devinit lmc_init_one(struct pci_dev *pdev, | |||
891 | 891 | ||
892 | /* Initialize the sppp layer */ | 892 | /* Initialize the sppp layer */ |
893 | /* An ioctl can cause a subsequent detach for raw frame interface */ | 893 | /* An ioctl can cause a subsequent detach for raw frame interface */ |
894 | dev->ml_priv = sc; | ||
894 | sc->if_type = LMC_PPP; | 895 | sc->if_type = LMC_PPP; |
895 | sc->check = 0xBEAFCAFE; | 896 | sc->check = 0xBEAFCAFE; |
896 | dev->base_addr = pci_resource_start(pdev, 0); | 897 | dev->base_addr = pci_resource_start(pdev, 0); |
diff --git a/drivers/net/wan/sealevel.c b/drivers/net/wan/sealevel.c index 11276bf3149f..44a89df1b8bf 100644 --- a/drivers/net/wan/sealevel.c +++ b/drivers/net/wan/sealevel.c | |||
@@ -241,6 +241,7 @@ static inline struct slvl_device *slvl_alloc(int iobase, int irq) | |||
241 | return NULL; | 241 | return NULL; |
242 | 242 | ||
243 | sv = d->priv; | 243 | sv = d->priv; |
244 | d->ml_priv = sv; | ||
244 | sv->if_ptr = &sv->pppdev; | 245 | sv->if_ptr = &sv->pppdev; |
245 | sv->pppdev.dev = d; | 246 | sv->pppdev.dev = d; |
246 | d->base_addr = iobase; | 247 | d->base_addr = iobase; |
diff --git a/drivers/net/wireless/iwlwifi/Kconfig b/drivers/net/wireless/iwlwifi/Kconfig index cc0006900b30..995dd537083f 100644 --- a/drivers/net/wireless/iwlwifi/Kconfig +++ b/drivers/net/wireless/iwlwifi/Kconfig | |||
@@ -1,6 +1,5 @@ | |||
1 | config IWLWIFI | 1 | config IWLWIFI |
2 | bool | 2 | tristate |
3 | default n | ||
4 | 3 | ||
5 | config IWLCORE | 4 | config IWLCORE |
6 | tristate "Intel Wireless Wifi Core" | 5 | tristate "Intel Wireless Wifi Core" |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 8464397f7816..9df48b33f0ca 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -666,7 +666,7 @@ static void iwl3945_rx_reply_rx(struct iwl3945_priv *priv, | |||
666 | rx_status.flag = 0; | 666 | rx_status.flag = 0; |
667 | rx_status.mactime = le64_to_cpu(rx_end->timestamp); | 667 | rx_status.mactime = le64_to_cpu(rx_end->timestamp); |
668 | rx_status.freq = | 668 | rx_status.freq = |
669 | ieee80211_frequency_to_channel(le16_to_cpu(rx_hdr->channel)); | 669 | ieee80211_channel_to_frequency(le16_to_cpu(rx_hdr->channel)); |
670 | rx_status.band = (rx_hdr->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? | 670 | rx_status.band = (rx_hdr->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? |
671 | IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; | 671 | IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; |
672 | 672 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index 67356d9a0c59..24dee00b0e85 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
@@ -168,8 +168,8 @@ struct iwl4965_lq_sta { | |||
168 | struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; | 168 | struct dentry *rs_sta_dbgfs_tx_agg_tid_en_file; |
169 | #endif | 169 | #endif |
170 | u32 dbg_fixed_rate; | 170 | u32 dbg_fixed_rate; |
171 | struct iwl_priv *drv; | ||
172 | #endif | 171 | #endif |
172 | struct iwl_priv *drv; | ||
173 | }; | 173 | }; |
174 | 174 | ||
175 | static void rs_rate_scale_perform(struct iwl_priv *priv, | 175 | static void rs_rate_scale_perform(struct iwl_priv *priv, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 9546582e983f..5d675e39bab8 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -3128,7 +3128,7 @@ static void iwl4965_rx_reply_rx(struct iwl_priv *priv, | |||
3128 | 3128 | ||
3129 | rx_status.mactime = le64_to_cpu(rx_start->timestamp); | 3129 | rx_status.mactime = le64_to_cpu(rx_start->timestamp); |
3130 | rx_status.freq = | 3130 | rx_status.freq = |
3131 | ieee80211_frequency_to_channel(le16_to_cpu(rx_start->channel)); | 3131 | ieee80211_channel_to_frequency(le16_to_cpu(rx_start->channel)); |
3132 | rx_status.band = (rx_start->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? | 3132 | rx_status.band = (rx_start->phy_flags & RX_RES_PHY_FLAGS_BAND_24_MSK) ? |
3133 | IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; | 3133 | IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ; |
3134 | rx_status.rate_idx = | 3134 | rx_status.rate_idx = |
diff --git a/drivers/net/wireless/prism54/islpci_dev.c b/drivers/net/wireless/prism54/islpci_dev.c index 04c2638d75ad..9196825ed1b5 100644 --- a/drivers/net/wireless/prism54/islpci_dev.c +++ b/drivers/net/wireless/prism54/islpci_dev.c | |||
@@ -388,8 +388,15 @@ islpci_open(struct net_device *ndev) | |||
388 | 388 | ||
389 | netif_start_queue(ndev); | 389 | netif_start_queue(ndev); |
390 | 390 | ||
391 | /* Turn off carrier unless we know we have associated */ | 391 | /* Turn off carrier if in STA or Ad-hoc mode. It will be turned on |
392 | netif_carrier_off(ndev); | 392 | * once the firmware receives a trap of being associated |
393 | * (GEN_OID_LINKSTATE). In other modes (AP or WDS or monitor) we | ||
394 | * should just leave the carrier on as its expected the firmware | ||
395 | * won't send us a trigger. */ | ||
396 | if (priv->iw_mode == IW_MODE_INFRA || priv->iw_mode == IW_MODE_ADHOC) | ||
397 | netif_carrier_off(ndev); | ||
398 | else | ||
399 | netif_carrier_on(ndev); | ||
393 | 400 | ||
394 | return 0; | 401 | return 0; |
395 | } | 402 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 9929b15e28ba..61510c519351 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1028,8 +1028,10 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) | |||
1028 | * Initialize the device. | 1028 | * Initialize the device. |
1029 | */ | 1029 | */ |
1030 | status = rt2x00dev->ops->lib->initialize(rt2x00dev); | 1030 | status = rt2x00dev->ops->lib->initialize(rt2x00dev); |
1031 | if (status) | 1031 | if (status) { |
1032 | goto exit; | 1032 | rt2x00queue_uninitialize(rt2x00dev); |
1033 | return status; | ||
1034 | } | ||
1033 | 1035 | ||
1034 | __set_bit(DEVICE_INITIALIZED, &rt2x00dev->flags); | 1036 | __set_bit(DEVICE_INITIALIZED, &rt2x00dev->flags); |
1035 | 1037 | ||
@@ -1039,11 +1041,6 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) | |||
1039 | rt2x00rfkill_register(rt2x00dev); | 1041 | rt2x00rfkill_register(rt2x00dev); |
1040 | 1042 | ||
1041 | return 0; | 1043 | return 0; |
1042 | |||
1043 | exit: | ||
1044 | rt2x00lib_uninitialize(rt2x00dev); | ||
1045 | |||
1046 | return status; | ||
1047 | } | 1044 | } |
1048 | 1045 | ||
1049 | int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) | 1046 | int rt2x00lib_start(struct rt2x00_dev *rt2x00dev) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 9e5d94e44c5c..c17078eac197 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -314,13 +314,14 @@ int rt2x00pci_initialize(struct rt2x00_dev *rt2x00dev) | |||
314 | if (status) { | 314 | if (status) { |
315 | ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n", | 315 | ERROR(rt2x00dev, "IRQ %d allocation failed (error %d).\n", |
316 | pci_dev->irq, status); | 316 | pci_dev->irq, status); |
317 | return status; | 317 | goto exit; |
318 | } | 318 | } |
319 | 319 | ||
320 | return 0; | 320 | return 0; |
321 | 321 | ||
322 | exit: | 322 | exit: |
323 | rt2x00pci_uninitialize(rt2x00dev); | 323 | queue_for_each(rt2x00dev, queue) |
324 | rt2x00pci_free_queue_dma(rt2x00dev, queue); | ||
324 | 325 | ||
325 | return status; | 326 | return status; |
326 | } | 327 | } |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index 98af4d26583d..b64f2f5d0d53 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -2362,6 +2362,7 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2362 | { | 2362 | { |
2363 | struct rt2x00_dev *rt2x00dev = hw->priv; | 2363 | struct rt2x00_dev *rt2x00dev = hw->priv; |
2364 | struct rt2x00_intf *intf = vif_to_intf(control->vif); | 2364 | struct rt2x00_intf *intf = vif_to_intf(control->vif); |
2365 | struct queue_entry_priv_pci_tx *priv_tx; | ||
2365 | struct skb_frame_desc *skbdesc; | 2366 | struct skb_frame_desc *skbdesc; |
2366 | unsigned int beacon_base; | 2367 | unsigned int beacon_base; |
2367 | u32 reg; | 2368 | u32 reg; |
@@ -2369,21 +2370,8 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2369 | if (unlikely(!intf->beacon)) | 2370 | if (unlikely(!intf->beacon)) |
2370 | return -ENOBUFS; | 2371 | return -ENOBUFS; |
2371 | 2372 | ||
2372 | /* | 2373 | priv_tx = intf->beacon->priv_data; |
2373 | * We need to append the descriptor in front of the | 2374 | memset(priv_tx->desc, 0, intf->beacon->queue->desc_size); |
2374 | * beacon frame. | ||
2375 | */ | ||
2376 | if (skb_headroom(skb) < intf->beacon->queue->desc_size) { | ||
2377 | if (pskb_expand_head(skb, intf->beacon->queue->desc_size, | ||
2378 | 0, GFP_ATOMIC)) | ||
2379 | return -ENOMEM; | ||
2380 | } | ||
2381 | |||
2382 | /* | ||
2383 | * Add the descriptor in front of the skb. | ||
2384 | */ | ||
2385 | skb_push(skb, intf->beacon->queue->desc_size); | ||
2386 | memset(skb->data, 0, intf->beacon->queue->desc_size); | ||
2387 | 2375 | ||
2388 | /* | 2376 | /* |
2389 | * Fill in skb descriptor | 2377 | * Fill in skb descriptor |
@@ -2391,9 +2379,9 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2391 | skbdesc = get_skb_frame_desc(skb); | 2379 | skbdesc = get_skb_frame_desc(skb); |
2392 | memset(skbdesc, 0, sizeof(*skbdesc)); | 2380 | memset(skbdesc, 0, sizeof(*skbdesc)); |
2393 | skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED; | 2381 | skbdesc->flags |= FRAME_DESC_DRIVER_GENERATED; |
2394 | skbdesc->data = skb->data + intf->beacon->queue->desc_size; | 2382 | skbdesc->data = skb->data; |
2395 | skbdesc->data_len = skb->len - intf->beacon->queue->desc_size; | 2383 | skbdesc->data_len = skb->len; |
2396 | skbdesc->desc = skb->data; | 2384 | skbdesc->desc = priv_tx->desc; |
2397 | skbdesc->desc_len = intf->beacon->queue->desc_size; | 2385 | skbdesc->desc_len = intf->beacon->queue->desc_size; |
2398 | skbdesc->entry = intf->beacon; | 2386 | skbdesc->entry = intf->beacon; |
2399 | 2387 | ||
@@ -2414,7 +2402,10 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2414 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | 2402 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); |
2415 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); | 2403 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); |
2416 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, | 2404 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, |
2417 | skb->data, skb->len); | 2405 | skbdesc->desc, skbdesc->desc_len); |
2406 | rt2x00pci_register_multiwrite(rt2x00dev, | ||
2407 | beacon_base + skbdesc->desc_len, | ||
2408 | skbdesc->data, skbdesc->data_len); | ||
2418 | rt61pci_kick_tx_queue(rt2x00dev, QID_BEACON); | 2409 | rt61pci_kick_tx_queue(rt2x00dev, QID_BEACON); |
2419 | 2410 | ||
2420 | return 0; | 2411 | return 0; |
@@ -2479,7 +2470,7 @@ static const struct data_queue_desc rt61pci_queue_tx = { | |||
2479 | 2470 | ||
2480 | static const struct data_queue_desc rt61pci_queue_bcn = { | 2471 | static const struct data_queue_desc rt61pci_queue_bcn = { |
2481 | .entry_num = 4 * BEACON_ENTRIES, | 2472 | .entry_num = 4 * BEACON_ENTRIES, |
2482 | .data_size = MGMT_FRAME_SIZE, | 2473 | .data_size = 0, /* No DMA required for beacons */ |
2483 | .desc_size = TXINFO_SIZE, | 2474 | .desc_size = TXINFO_SIZE, |
2484 | .priv_size = sizeof(struct queue_entry_priv_pci_tx), | 2475 | .priv_size = sizeof(struct queue_entry_priv_pci_tx), |
2485 | }; | 2476 | }; |
diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c index 5dd23c93497d..883af891ebfb 100644 --- a/drivers/net/wireless/strip.c +++ b/drivers/net/wireless/strip.c | |||
@@ -2611,7 +2611,7 @@ static int strip_open(struct tty_struct *tty) | |||
2611 | * We need a write method. | 2611 | * We need a write method. |
2612 | */ | 2612 | */ |
2613 | 2613 | ||
2614 | if (tty->ops->write == NULL) | 2614 | if (tty->ops->write == NULL || tty->ops->set_termios == NULL) |
2615 | return -EOPNOTSUPP; | 2615 | return -EOPNOTSUPP; |
2616 | 2616 | ||
2617 | /* | 2617 | /* |
diff --git a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c index 03384a43186b..49ae97003952 100644 --- a/drivers/net/wireless/wavelan.c +++ b/drivers/net/wireless/wavelan.c | |||
@@ -908,9 +908,9 @@ static void wv_psa_show(psa_t * p) | |||
908 | p->psa_call_code[3], p->psa_call_code[4], p->psa_call_code[5], | 908 | p->psa_call_code[3], p->psa_call_code[4], p->psa_call_code[5], |
909 | p->psa_call_code[6], p->psa_call_code[7]); | 909 | p->psa_call_code[6], p->psa_call_code[7]); |
910 | #ifdef DEBUG_SHOW_UNUSED | 910 | #ifdef DEBUG_SHOW_UNUSED |
911 | printk(KERN_DEBUG "psa_reserved[]: %02X:%02X:%02X:%02X\n", | 911 | printk(KERN_DEBUG "psa_reserved[]: %02X:%02X\n", |
912 | p->psa_reserved[0], | 912 | p->psa_reserved[0], |
913 | p->psa_reserved[1], p->psa_reserved[2], p->psa_reserved[3]); | 913 | p->psa_reserved[1]); |
914 | #endif /* DEBUG_SHOW_UNUSED */ | 914 | #endif /* DEBUG_SHOW_UNUSED */ |
915 | printk(KERN_DEBUG "psa_conf_status: %d, ", p->psa_conf_status); | 915 | printk(KERN_DEBUG "psa_conf_status: %d, ", p->psa_conf_status); |
916 | printk("psa_crc: 0x%02x%02x, ", p->psa_crc[0], p->psa_crc[1]); | 916 | printk("psa_crc: 0x%02x%02x, ", p->psa_crc[0], p->psa_crc[1]); |
diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index baf74015751c..b584c0ecc62d 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c | |||
@@ -1074,11 +1074,9 @@ wv_psa_show(psa_t * p) | |||
1074 | p->psa_call_code[6], | 1074 | p->psa_call_code[6], |
1075 | p->psa_call_code[7]); | 1075 | p->psa_call_code[7]); |
1076 | #ifdef DEBUG_SHOW_UNUSED | 1076 | #ifdef DEBUG_SHOW_UNUSED |
1077 | printk(KERN_DEBUG "psa_reserved[]: %02X:%02X:%02X:%02X\n", | 1077 | printk(KERN_DEBUG "psa_reserved[]: %02X:%02X\n", |
1078 | p->psa_reserved[0], | 1078 | p->psa_reserved[0], |
1079 | p->psa_reserved[1], | 1079 | p->psa_reserved[1]); |
1080 | p->psa_reserved[2], | ||
1081 | p->psa_reserved[3]); | ||
1082 | #endif /* DEBUG_SHOW_UNUSED */ | 1080 | #endif /* DEBUG_SHOW_UNUSED */ |
1083 | printk(KERN_DEBUG "psa_conf_status: %d, ", p->psa_conf_status); | 1081 | printk(KERN_DEBUG "psa_conf_status: %d, ", p->psa_conf_status); |
1084 | printk("psa_crc: 0x%02x%02x, ", p->psa_crc[0], p->psa_crc[1]); | 1082 | printk("psa_crc: 0x%02x%02x, ", p->psa_crc[0], p->psa_crc[1]); |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 5316074f39f0..12e24f04dddf 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -889,9 +889,13 @@ static void tx_urb_complete(struct urb *urb) | |||
889 | } | 889 | } |
890 | free_urb: | 890 | free_urb: |
891 | skb = (struct sk_buff *)urb->context; | 891 | skb = (struct sk_buff *)urb->context; |
892 | zd_mac_tx_to_dev(skb, urb->status); | 892 | /* |
893 | * grab 'usb' pointer before handing off the skb (since | ||
894 | * it might be freed by zd_mac_tx_to_dev or mac80211) | ||
895 | */ | ||
893 | cb = (struct zd_tx_skb_control_block *)skb->cb; | 896 | cb = (struct zd_tx_skb_control_block *)skb->cb; |
894 | usb = &zd_hw_mac(cb->hw)->chip.usb; | 897 | usb = &zd_hw_mac(cb->hw)->chip.usb; |
898 | zd_mac_tx_to_dev(skb, urb->status); | ||
895 | free_tx_urb(usb, urb); | 899 | free_tx_urb(usb, urb); |
896 | tx_dec_submitted_urbs(usb); | 900 | tx_dec_submitted_urbs(usb); |
897 | return; | 901 | return; |
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c index efcbf4b4579f..2450b3a393ff 100644 --- a/drivers/oprofile/cpu_buffer.c +++ b/drivers/oprofile/cpu_buffer.c | |||
@@ -27,7 +27,7 @@ | |||
27 | #include "buffer_sync.h" | 27 | #include "buffer_sync.h" |
28 | #include "oprof.h" | 28 | #include "oprof.h" |
29 | 29 | ||
30 | DEFINE_PER_CPU_SHARED_ALIGNED(struct oprofile_cpu_buffer, cpu_buffer); | 30 | DEFINE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); |
31 | 31 | ||
32 | static void wq_sync_buffer(struct work_struct *work); | 32 | static void wq_sync_buffer(struct work_struct *work); |
33 | 33 | ||
diff --git a/drivers/oprofile/cpu_buffer.h b/drivers/oprofile/cpu_buffer.h index 13588174311d..c3e366b52261 100644 --- a/drivers/oprofile/cpu_buffer.h +++ b/drivers/oprofile/cpu_buffer.h | |||
@@ -46,7 +46,7 @@ struct oprofile_cpu_buffer { | |||
46 | unsigned long sample_invalid_eip; | 46 | unsigned long sample_invalid_eip; |
47 | int cpu; | 47 | int cpu; |
48 | struct delayed_work work; | 48 | struct delayed_work work; |
49 | } ____cacheline_aligned; | 49 | }; |
50 | 50 | ||
51 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); | 51 | DECLARE_PER_CPU(struct oprofile_cpu_buffer, cpu_buffer); |
52 | 52 | ||
diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c index 1fd8bb765702..66c0fd21894b 100644 --- a/drivers/pci/intel-iommu.c +++ b/drivers/pci/intel-iommu.c | |||
@@ -49,7 +49,7 @@ | |||
49 | 49 | ||
50 | #define DEFAULT_DOMAIN_ADDRESS_WIDTH 48 | 50 | #define DEFAULT_DOMAIN_ADDRESS_WIDTH 48 |
51 | 51 | ||
52 | #define DMAR_OPERATION_TIMEOUT (HZ*60) /* 1m */ | 52 | #define DMAR_OPERATION_TIMEOUT ((cycles_t) tsc_khz*10*1000) /* 10sec */ |
53 | 53 | ||
54 | #define DOMAIN_MAX_ADDR(gaw) ((((u64)1) << gaw) - 1) | 54 | #define DOMAIN_MAX_ADDR(gaw) ((((u64)1) << gaw) - 1) |
55 | 55 | ||
@@ -490,12 +490,12 @@ static int iommu_alloc_root_entry(struct intel_iommu *iommu) | |||
490 | 490 | ||
491 | #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \ | 491 | #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \ |
492 | {\ | 492 | {\ |
493 | unsigned long start_time = jiffies;\ | 493 | cycles_t start_time = get_cycles();\ |
494 | while (1) {\ | 494 | while (1) {\ |
495 | sts = op (iommu->reg + offset);\ | 495 | sts = op (iommu->reg + offset);\ |
496 | if (cond)\ | 496 | if (cond)\ |
497 | break;\ | 497 | break;\ |
498 | if (time_after(jiffies, start_time + DMAR_OPERATION_TIMEOUT))\ | 498 | if (DMAR_OPERATION_TIMEOUT < (get_cycles() - start_time))\ |
499 | panic("DMAR hardware is malfunctioning\n");\ | 499 | panic("DMAR hardware is malfunctioning\n");\ |
500 | cpu_relax();\ | 500 | cpu_relax();\ |
501 | }\ | 501 | }\ |
diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 72f7476930c8..9d6fc8e6285d 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c | |||
@@ -19,8 +19,31 @@ | |||
19 | #include <linux/pci-acpi.h> | 19 | #include <linux/pci-acpi.h> |
20 | #include "pci.h" | 20 | #include "pci.h" |
21 | 21 | ||
22 | static u32 ctrlset_buf[3] = {0, 0, 0}; | 22 | struct acpi_osc_data { |
23 | static u32 global_ctrlsets = 0; | 23 | acpi_handle handle; |
24 | u32 ctrlset_buf[3]; | ||
25 | u32 global_ctrlsets; | ||
26 | struct list_head sibiling; | ||
27 | }; | ||
28 | static LIST_HEAD(acpi_osc_data_list); | ||
29 | |||
30 | static struct acpi_osc_data *acpi_get_osc_data(acpi_handle handle) | ||
31 | { | ||
32 | struct acpi_osc_data *data; | ||
33 | |||
34 | list_for_each_entry(data, &acpi_osc_data_list, sibiling) { | ||
35 | if (data->handle == handle) | ||
36 | return data; | ||
37 | } | ||
38 | data = kzalloc(sizeof(*data), GFP_KERNEL); | ||
39 | if (!data) | ||
40 | return NULL; | ||
41 | INIT_LIST_HEAD(&data->sibiling); | ||
42 | data->handle = handle; | ||
43 | list_add_tail(&data->sibiling, &acpi_osc_data_list); | ||
44 | return data; | ||
45 | } | ||
46 | |||
24 | static u8 OSC_UUID[16] = {0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40, 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66}; | 47 | static u8 OSC_UUID[16] = {0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40, 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66}; |
25 | 48 | ||
26 | static acpi_status | 49 | static acpi_status |
@@ -37,8 +60,27 @@ acpi_query_osc ( | |||
37 | union acpi_object *out_obj; | 60 | union acpi_object *out_obj; |
38 | u32 osc_dw0; | 61 | u32 osc_dw0; |
39 | acpi_status *ret_status = (acpi_status *)retval; | 62 | acpi_status *ret_status = (acpi_status *)retval; |
63 | struct acpi_osc_data *osc_data; | ||
64 | u32 flags = (unsigned long)context, temp; | ||
65 | acpi_handle tmp; | ||
66 | |||
67 | status = acpi_get_handle(handle, "_OSC", &tmp); | ||
68 | if (ACPI_FAILURE(status)) | ||
69 | return status; | ||
70 | |||
71 | osc_data = acpi_get_osc_data(handle); | ||
72 | if (!osc_data) { | ||
73 | printk(KERN_ERR "acpi osc data array is full\n"); | ||
74 | return AE_ERROR; | ||
75 | } | ||
76 | |||
77 | osc_data->ctrlset_buf[OSC_SUPPORT_TYPE] |= (flags & OSC_SUPPORT_MASKS); | ||
78 | |||
79 | /* do _OSC query for all possible controls */ | ||
80 | temp = osc_data->ctrlset_buf[OSC_CONTROL_TYPE]; | ||
81 | osc_data->ctrlset_buf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE; | ||
82 | osc_data->ctrlset_buf[OSC_CONTROL_TYPE] = OSC_CONTROL_MASKS; | ||
40 | 83 | ||
41 | |||
42 | /* Setting up input parameters */ | 84 | /* Setting up input parameters */ |
43 | input.count = 4; | 85 | input.count = 4; |
44 | input.pointer = in_params; | 86 | input.pointer = in_params; |
@@ -51,13 +93,11 @@ acpi_query_osc ( | |||
51 | in_params[2].integer.value = 3; | 93 | in_params[2].integer.value = 3; |
52 | in_params[3].type = ACPI_TYPE_BUFFER; | 94 | in_params[3].type = ACPI_TYPE_BUFFER; |
53 | in_params[3].buffer.length = 12; | 95 | in_params[3].buffer.length = 12; |
54 | in_params[3].buffer.pointer = (u8 *)context; | 96 | in_params[3].buffer.pointer = (u8 *)osc_data->ctrlset_buf; |
55 | 97 | ||
56 | status = acpi_evaluate_object(handle, "_OSC", &input, &output); | 98 | status = acpi_evaluate_object(handle, "_OSC", &input, &output); |
57 | if (ACPI_FAILURE (status)) { | 99 | if (ACPI_FAILURE(status)) |
58 | *ret_status = status; | 100 | goto out_nofree; |
59 | return status; | ||
60 | } | ||
61 | out_obj = output.pointer; | 101 | out_obj = output.pointer; |
62 | 102 | ||
63 | if (out_obj->type != ACPI_TYPE_BUFFER) { | 103 | if (out_obj->type != ACPI_TYPE_BUFFER) { |
@@ -76,7 +116,8 @@ acpi_query_osc ( | |||
76 | printk(KERN_DEBUG "_OSC invalid revision\n"); | 116 | printk(KERN_DEBUG "_OSC invalid revision\n"); |
77 | if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) { | 117 | if (osc_dw0 & OSC_CAPABILITIES_MASK_ERROR) { |
78 | /* Update Global Control Set */ | 118 | /* Update Global Control Set */ |
79 | global_ctrlsets = *((u32 *)(out_obj->buffer.pointer+8)); | 119 | osc_data->global_ctrlsets = |
120 | *((u32 *)(out_obj->buffer.pointer + 8)); | ||
80 | status = AE_OK; | 121 | status = AE_OK; |
81 | goto query_osc_out; | 122 | goto query_osc_out; |
82 | } | 123 | } |
@@ -85,12 +126,21 @@ acpi_query_osc ( | |||
85 | } | 126 | } |
86 | 127 | ||
87 | /* Update Global Control Set */ | 128 | /* Update Global Control Set */ |
88 | global_ctrlsets = *((u32 *)(out_obj->buffer.pointer + 8)); | 129 | osc_data->global_ctrlsets = *((u32 *)(out_obj->buffer.pointer + 8)); |
89 | status = AE_OK; | 130 | status = AE_OK; |
90 | 131 | ||
91 | query_osc_out: | 132 | query_osc_out: |
92 | kfree(output.pointer); | 133 | kfree(output.pointer); |
134 | out_nofree: | ||
93 | *ret_status = status; | 135 | *ret_status = status; |
136 | |||
137 | osc_data->ctrlset_buf[OSC_QUERY_TYPE] = !OSC_QUERY_ENABLE; | ||
138 | osc_data->ctrlset_buf[OSC_CONTROL_TYPE] = temp; | ||
139 | if (ACPI_FAILURE(status)) { | ||
140 | /* no osc support at all */ | ||
141 | osc_data->ctrlset_buf[OSC_SUPPORT_TYPE] = 0; | ||
142 | } | ||
143 | |||
94 | return status; | 144 | return status; |
95 | } | 145 | } |
96 | 146 | ||
@@ -165,28 +215,15 @@ run_osc_out: | |||
165 | **/ | 215 | **/ |
166 | acpi_status __pci_osc_support_set(u32 flags, const char *hid) | 216 | acpi_status __pci_osc_support_set(u32 flags, const char *hid) |
167 | { | 217 | { |
168 | u32 temp; | 218 | acpi_status retval = AE_NOT_FOUND; |
169 | acpi_status retval; | ||
170 | 219 | ||
171 | if (!(flags & OSC_SUPPORT_MASKS)) { | 220 | if (!(flags & OSC_SUPPORT_MASKS)) { |
172 | return AE_TYPE; | 221 | return AE_TYPE; |
173 | } | 222 | } |
174 | ctrlset_buf[OSC_SUPPORT_TYPE] |= (flags & OSC_SUPPORT_MASKS); | ||
175 | |||
176 | /* do _OSC query for all possible controls */ | ||
177 | temp = ctrlset_buf[OSC_CONTROL_TYPE]; | ||
178 | ctrlset_buf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE; | ||
179 | ctrlset_buf[OSC_CONTROL_TYPE] = OSC_CONTROL_MASKS; | ||
180 | acpi_get_devices(hid, | 223 | acpi_get_devices(hid, |
181 | acpi_query_osc, | 224 | acpi_query_osc, |
182 | ctrlset_buf, | 225 | (void *)(unsigned long)flags, |
183 | (void **) &retval ); | 226 | (void **) &retval ); |
184 | ctrlset_buf[OSC_QUERY_TYPE] = !OSC_QUERY_ENABLE; | ||
185 | ctrlset_buf[OSC_CONTROL_TYPE] = temp; | ||
186 | if (ACPI_FAILURE(retval)) { | ||
187 | /* no osc support at all */ | ||
188 | ctrlset_buf[OSC_SUPPORT_TYPE] = 0; | ||
189 | } | ||
190 | return AE_OK; | 227 | return AE_OK; |
191 | } | 228 | } |
192 | 229 | ||
@@ -201,19 +238,31 @@ acpi_status pci_osc_control_set(acpi_handle handle, u32 flags) | |||
201 | { | 238 | { |
202 | acpi_status status; | 239 | acpi_status status; |
203 | u32 ctrlset; | 240 | u32 ctrlset; |
241 | acpi_handle tmp; | ||
242 | struct acpi_osc_data *osc_data; | ||
243 | |||
244 | status = acpi_get_handle(handle, "_OSC", &tmp); | ||
245 | if (ACPI_FAILURE(status)) | ||
246 | return status; | ||
247 | |||
248 | osc_data = acpi_get_osc_data(handle); | ||
249 | if (!osc_data) { | ||
250 | printk(KERN_ERR "acpi osc data array is full\n"); | ||
251 | return AE_ERROR; | ||
252 | } | ||
204 | 253 | ||
205 | ctrlset = (flags & OSC_CONTROL_MASKS); | 254 | ctrlset = (flags & OSC_CONTROL_MASKS); |
206 | if (!ctrlset) { | 255 | if (!ctrlset) { |
207 | return AE_TYPE; | 256 | return AE_TYPE; |
208 | } | 257 | } |
209 | if (ctrlset_buf[OSC_SUPPORT_TYPE] && | 258 | if (osc_data->ctrlset_buf[OSC_SUPPORT_TYPE] && |
210 | ((global_ctrlsets & ctrlset) != ctrlset)) { | 259 | ((osc_data->global_ctrlsets & ctrlset) != ctrlset)) { |
211 | return AE_SUPPORT; | 260 | return AE_SUPPORT; |
212 | } | 261 | } |
213 | ctrlset_buf[OSC_CONTROL_TYPE] |= ctrlset; | 262 | osc_data->ctrlset_buf[OSC_CONTROL_TYPE] |= ctrlset; |
214 | status = acpi_run_osc(handle, ctrlset_buf); | 263 | status = acpi_run_osc(handle, osc_data->ctrlset_buf); |
215 | if (ACPI_FAILURE (status)) { | 264 | if (ACPI_FAILURE (status)) { |
216 | ctrlset_buf[OSC_CONTROL_TYPE] &= ~ctrlset; | 265 | osc_data->ctrlset_buf[OSC_CONTROL_TYPE] &= ~ctrlset; |
217 | } | 266 | } |
218 | 267 | ||
219 | return status; | 268 | return status; |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 4a55bf380957..3706ce7972dd 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -842,13 +842,25 @@ static void set_pcie_port_type(struct pci_dev *pdev) | |||
842 | * reading the dword at 0x100 which must either be 0 or a valid extended | 842 | * reading the dword at 0x100 which must either be 0 or a valid extended |
843 | * capability header. | 843 | * capability header. |
844 | */ | 844 | */ |
845 | int pci_cfg_space_size_ext(struct pci_dev *dev, unsigned check_exp_pcix) | 845 | int pci_cfg_space_size_ext(struct pci_dev *dev) |
846 | { | 846 | { |
847 | int pos; | ||
848 | u32 status; | 847 | u32 status; |
849 | 848 | ||
850 | if (!check_exp_pcix) | 849 | if (pci_read_config_dword(dev, 256, &status) != PCIBIOS_SUCCESSFUL) |
851 | goto skip; | 850 | goto fail; |
851 | if (status == 0xffffffff) | ||
852 | goto fail; | ||
853 | |||
854 | return PCI_CFG_SPACE_EXP_SIZE; | ||
855 | |||
856 | fail: | ||
857 | return PCI_CFG_SPACE_SIZE; | ||
858 | } | ||
859 | |||
860 | int pci_cfg_space_size(struct pci_dev *dev) | ||
861 | { | ||
862 | int pos; | ||
863 | u32 status; | ||
852 | 864 | ||
853 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | 865 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); |
854 | if (!pos) { | 866 | if (!pos) { |
@@ -861,23 +873,12 @@ int pci_cfg_space_size_ext(struct pci_dev *dev, unsigned check_exp_pcix) | |||
861 | goto fail; | 873 | goto fail; |
862 | } | 874 | } |
863 | 875 | ||
864 | skip: | 876 | return pci_cfg_space_size_ext(dev); |
865 | if (pci_read_config_dword(dev, 256, &status) != PCIBIOS_SUCCESSFUL) | ||
866 | goto fail; | ||
867 | if (status == 0xffffffff) | ||
868 | goto fail; | ||
869 | |||
870 | return PCI_CFG_SPACE_EXP_SIZE; | ||
871 | 877 | ||
872 | fail: | 878 | fail: |
873 | return PCI_CFG_SPACE_SIZE; | 879 | return PCI_CFG_SPACE_SIZE; |
874 | } | 880 | } |
875 | 881 | ||
876 | int pci_cfg_space_size(struct pci_dev *dev) | ||
877 | { | ||
878 | return pci_cfg_space_size_ext(dev, 1); | ||
879 | } | ||
880 | |||
881 | static void pci_release_bus_bridge_dev(struct device *dev) | 882 | static void pci_release_bus_bridge_dev(struct device *dev) |
882 | { | 883 | { |
883 | kfree(dev); | 884 | kfree(dev); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index afd914ebe215..f2d9c770f51a 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1826,6 +1826,7 @@ static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev) | |||
1826 | } | 1826 | } |
1827 | } | 1827 | } |
1828 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk); | 1828 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, nv_msi_ht_cap_quirk); |
1829 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_ANY_ID, nv_msi_ht_cap_quirk); | ||
1829 | 1830 | ||
1830 | static void __devinit quirk_msi_intx_disable_bug(struct pci_dev *dev) | 1831 | static void __devinit quirk_msi_intx_disable_bug(struct pci_dev *dev) |
1831 | { | 1832 | { |
diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h index 4fe7c58f57e9..886dac823ed6 100644 --- a/drivers/pnp/base.h +++ b/drivers/pnp/base.h | |||
@@ -19,6 +19,7 @@ void pnp_remove_card(struct pnp_card *card); | |||
19 | int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev); | 19 | int pnp_add_card_device(struct pnp_card *card, struct pnp_dev *dev); |
20 | void pnp_remove_card_device(struct pnp_dev *dev); | 20 | void pnp_remove_card_device(struct pnp_dev *dev); |
21 | 21 | ||
22 | struct pnp_option *pnp_build_option(int priority); | ||
22 | struct pnp_option *pnp_register_independent_option(struct pnp_dev *dev); | 23 | struct pnp_option *pnp_register_independent_option(struct pnp_dev *dev); |
23 | struct pnp_option *pnp_register_dependent_option(struct pnp_dev *dev, | 24 | struct pnp_option *pnp_register_dependent_option(struct pnp_dev *dev, |
24 | int priority); | 25 | int priority); |
diff --git a/drivers/pnp/interface.c b/drivers/pnp/interface.c index 5d9301de1778..5695a79f3a52 100644 --- a/drivers/pnp/interface.c +++ b/drivers/pnp/interface.c | |||
@@ -424,7 +424,7 @@ pnp_set_current_resources(struct device *dmdev, struct device_attribute *attr, | |||
424 | start = simple_strtoul(buf, &buf, 0); | 424 | start = simple_strtoul(buf, &buf, 0); |
425 | pnp_res = pnp_add_irq_resource(dev, start, 0); | 425 | pnp_res = pnp_add_irq_resource(dev, start, 0); |
426 | if (pnp_res) | 426 | if (pnp_res) |
427 | nirq++; | 427 | pnp_res->index = nirq++; |
428 | continue; | 428 | continue; |
429 | } | 429 | } |
430 | if (!strnicmp(buf, "dma", 3)) { | 430 | if (!strnicmp(buf, "dma", 3)) { |
diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index d049a2279fea..ffdb12a59c40 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c | |||
@@ -111,6 +111,113 @@ static void quirk_sb16audio_resources(struct pnp_dev *dev) | |||
111 | dev_info(&dev->dev, "SB audio device quirk - increased port range\n"); | 111 | dev_info(&dev->dev, "SB audio device quirk - increased port range\n"); |
112 | } | 112 | } |
113 | 113 | ||
114 | static struct pnp_option *quirk_isapnp_mpu_options(struct pnp_dev *dev) | ||
115 | { | ||
116 | struct pnp_option *head = NULL; | ||
117 | struct pnp_option *prev = NULL; | ||
118 | struct pnp_option *res; | ||
119 | |||
120 | /* | ||
121 | * Build a functional IRQ-less variant of each MPU option. | ||
122 | */ | ||
123 | |||
124 | for (res = dev->dependent; res; res = res->next) { | ||
125 | struct pnp_option *curr; | ||
126 | struct pnp_port *port; | ||
127 | struct pnp_port *copy; | ||
128 | |||
129 | port = res->port; | ||
130 | if (!port || !res->irq) | ||
131 | continue; | ||
132 | |||
133 | copy = pnp_alloc(sizeof *copy); | ||
134 | if (!copy) | ||
135 | break; | ||
136 | |||
137 | copy->min = port->min; | ||
138 | copy->max = port->max; | ||
139 | copy->align = port->align; | ||
140 | copy->size = port->size; | ||
141 | copy->flags = port->flags; | ||
142 | |||
143 | curr = pnp_build_option(PNP_RES_PRIORITY_FUNCTIONAL); | ||
144 | if (!curr) { | ||
145 | kfree(copy); | ||
146 | break; | ||
147 | } | ||
148 | curr->port = copy; | ||
149 | |||
150 | if (prev) | ||
151 | prev->next = curr; | ||
152 | else | ||
153 | head = curr; | ||
154 | prev = curr; | ||
155 | } | ||
156 | if (head) | ||
157 | dev_info(&dev->dev, "adding IRQ-less MPU options\n"); | ||
158 | |||
159 | return head; | ||
160 | } | ||
161 | |||
162 | static void quirk_ad1815_mpu_resources(struct pnp_dev *dev) | ||
163 | { | ||
164 | struct pnp_option *res; | ||
165 | struct pnp_irq *irq; | ||
166 | |||
167 | /* | ||
168 | * Distribute the independent IRQ over the dependent options | ||
169 | */ | ||
170 | |||
171 | res = dev->independent; | ||
172 | if (!res) | ||
173 | return; | ||
174 | |||
175 | irq = res->irq; | ||
176 | if (!irq || irq->next) | ||
177 | return; | ||
178 | |||
179 | res = dev->dependent; | ||
180 | if (!res) | ||
181 | return; | ||
182 | |||
183 | while (1) { | ||
184 | struct pnp_irq *copy; | ||
185 | |||
186 | copy = pnp_alloc(sizeof *copy); | ||
187 | if (!copy) | ||
188 | break; | ||
189 | |||
190 | memcpy(copy->map, irq->map, sizeof copy->map); | ||
191 | copy->flags = irq->flags; | ||
192 | |||
193 | copy->next = res->irq; /* Yes, this is NULL */ | ||
194 | res->irq = copy; | ||
195 | |||
196 | if (!res->next) | ||
197 | break; | ||
198 | res = res->next; | ||
199 | } | ||
200 | kfree(irq); | ||
201 | |||
202 | res->next = quirk_isapnp_mpu_options(dev); | ||
203 | |||
204 | res = dev->independent; | ||
205 | res->irq = NULL; | ||
206 | } | ||
207 | |||
208 | static void quirk_isapnp_mpu_resources(struct pnp_dev *dev) | ||
209 | { | ||
210 | struct pnp_option *res; | ||
211 | |||
212 | res = dev->dependent; | ||
213 | if (!res) | ||
214 | return; | ||
215 | |||
216 | while (res->next) | ||
217 | res = res->next; | ||
218 | |||
219 | res->next = quirk_isapnp_mpu_options(dev); | ||
220 | } | ||
114 | 221 | ||
115 | #include <linux/pci.h> | 222 | #include <linux/pci.h> |
116 | 223 | ||
@@ -205,6 +312,11 @@ static struct pnp_fixup pnp_fixups[] = { | |||
205 | {"CTL0043", quirk_sb16audio_resources}, | 312 | {"CTL0043", quirk_sb16audio_resources}, |
206 | {"CTL0044", quirk_sb16audio_resources}, | 313 | {"CTL0044", quirk_sb16audio_resources}, |
207 | {"CTL0045", quirk_sb16audio_resources}, | 314 | {"CTL0045", quirk_sb16audio_resources}, |
315 | /* Add IRQ-less MPU options */ | ||
316 | {"ADS7151", quirk_ad1815_mpu_resources}, | ||
317 | {"ADS7181", quirk_isapnp_mpu_resources}, | ||
318 | {"AZT0002", quirk_isapnp_mpu_resources}, | ||
319 | /* PnP resources that might overlap PCI BARs */ | ||
208 | {"PNP0c01", quirk_system_pci_resources}, | 320 | {"PNP0c01", quirk_system_pci_resources}, |
209 | {"PNP0c02", quirk_system_pci_resources}, | 321 | {"PNP0c02", quirk_system_pci_resources}, |
210 | {""} | 322 | {""} |
@@ -212,20 +324,16 @@ static struct pnp_fixup pnp_fixups[] = { | |||
212 | 324 | ||
213 | void pnp_fixup_device(struct pnp_dev *dev) | 325 | void pnp_fixup_device(struct pnp_dev *dev) |
214 | { | 326 | { |
215 | int i = 0; | 327 | struct pnp_fixup *f; |
216 | void (*quirk)(struct pnp_dev *); | ||
217 | |||
218 | while (*pnp_fixups[i].id) { | ||
219 | if (compare_pnp_id(dev->id, pnp_fixups[i].id)) { | ||
220 | quirk = pnp_fixups[i].quirk_function; | ||
221 | 328 | ||
329 | for (f = pnp_fixups; *f->id; f++) { | ||
330 | if (!compare_pnp_id(dev->id, f->id)) | ||
331 | continue; | ||
222 | #ifdef DEBUG | 332 | #ifdef DEBUG |
223 | dev_dbg(&dev->dev, "calling "); | 333 | dev_dbg(&dev->dev, "%s: calling ", f->id); |
224 | print_fn_descriptor_symbol("%s()\n", | 334 | print_fn_descriptor_symbol("%s\n", |
225 | (unsigned long) *quirk); | 335 | (unsigned long) f->quirk_function); |
226 | #endif | 336 | #endif |
227 | (*quirk)(dev); | 337 | f->quirk_function(dev); |
228 | } | ||
229 | i++; | ||
230 | } | 338 | } |
231 | } | 339 | } |
diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c index 2041620d5682..390b50096e30 100644 --- a/drivers/pnp/resource.c +++ b/drivers/pnp/resource.c | |||
@@ -28,7 +28,7 @@ static int pnp_reserve_mem[16] = {[0 ... 15] = -1 }; /* reserve (don't use) some | |||
28 | * option registration | 28 | * option registration |
29 | */ | 29 | */ |
30 | 30 | ||
31 | static struct pnp_option *pnp_build_option(int priority) | 31 | struct pnp_option *pnp_build_option(int priority) |
32 | { | 32 | { |
33 | struct pnp_option *option = pnp_alloc(sizeof(struct pnp_option)); | 33 | struct pnp_option *option = pnp_alloc(sizeof(struct pnp_option)); |
34 | 34 | ||
diff --git a/drivers/pnp/support.c b/drivers/pnp/support.c index 3eba85ed729c..95b076c18c07 100644 --- a/drivers/pnp/support.c +++ b/drivers/pnp/support.c | |||
@@ -45,10 +45,10 @@ void pnp_eisa_id_to_string(u32 id, char *str) | |||
45 | str[0] = 'A' + ((id >> 26) & 0x3f) - 1; | 45 | str[0] = 'A' + ((id >> 26) & 0x3f) - 1; |
46 | str[1] = 'A' + ((id >> 21) & 0x1f) - 1; | 46 | str[1] = 'A' + ((id >> 21) & 0x1f) - 1; |
47 | str[2] = 'A' + ((id >> 16) & 0x1f) - 1; | 47 | str[2] = 'A' + ((id >> 16) & 0x1f) - 1; |
48 | str[3] = hex_asc((id >> 12) & 0xf); | 48 | str[3] = hex_asc_hi(id >> 8); |
49 | str[4] = hex_asc((id >> 8) & 0xf); | 49 | str[4] = hex_asc_lo(id >> 8); |
50 | str[5] = hex_asc((id >> 4) & 0xf); | 50 | str[5] = hex_asc_hi(id); |
51 | str[6] = hex_asc((id >> 0) & 0xf); | 51 | str[6] = hex_asc_lo(id); |
52 | str[7] = '\0'; | 52 | str[7] = '\0'; |
53 | } | 53 | } |
54 | 54 | ||
diff --git a/drivers/rtc/rtc-ds1511.c b/drivers/rtc/rtc-ds1511.c index a83a40b3ebaa..0f0d27d1c4ca 100644 --- a/drivers/rtc/rtc-ds1511.c +++ b/drivers/rtc/rtc-ds1511.c | |||
@@ -184,7 +184,7 @@ ds1511_wdog_disable(void) | |||
184 | static int ds1511_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm) | 184 | static int ds1511_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm) |
185 | { | 185 | { |
186 | u8 mon, day, dow, hrs, min, sec, yrs, cen; | 186 | u8 mon, day, dow, hrs, min, sec, yrs, cen; |
187 | unsigned int flags; | 187 | unsigned long flags; |
188 | 188 | ||
189 | /* | 189 | /* |
190 | * won't have to change this for a while | 190 | * won't have to change this for a while |
@@ -247,7 +247,7 @@ static int ds1511_rtc_set_time(struct device *dev, struct rtc_time *rtc_tm) | |||
247 | static int ds1511_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) | 247 | static int ds1511_rtc_read_time(struct device *dev, struct rtc_time *rtc_tm) |
248 | { | 248 | { |
249 | unsigned int century; | 249 | unsigned int century; |
250 | unsigned int flags; | 250 | unsigned long flags; |
251 | 251 | ||
252 | spin_lock_irqsave(&ds1511_lock, flags); | 252 | spin_lock_irqsave(&ds1511_lock, flags); |
253 | rtc_disable_update(); | 253 | rtc_disable_update(); |
diff --git a/drivers/rtc/rtc-lib.c b/drivers/rtc/rtc-lib.c index ba795a4db1e9..9f996ec881ce 100644 --- a/drivers/rtc/rtc-lib.c +++ b/drivers/rtc/rtc-lib.c | |||
@@ -51,7 +51,7 @@ EXPORT_SYMBOL(rtc_year_days); | |||
51 | */ | 51 | */ |
52 | void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) | 52 | void rtc_time_to_tm(unsigned long time, struct rtc_time *tm) |
53 | { | 53 | { |
54 | register int days, month, year; | 54 | unsigned int days, month, year; |
55 | 55 | ||
56 | days = time / 86400; | 56 | days = time / 86400; |
57 | time -= days * 86400; | 57 | time -= days * 86400; |
diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index 316bfaa80872..a3e0880b38fb 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/kernel.h> | ||
18 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
19 | #include <linux/string.h> | 20 | #include <linux/string.h> |
20 | #include <linux/i2c.h> | 21 | #include <linux/i2c.h> |
@@ -803,6 +804,7 @@ static int m41t80_probe(struct i2c_client *client, | |||
803 | 804 | ||
804 | #ifdef CONFIG_RTC_DRV_M41T80_WDT | 805 | #ifdef CONFIG_RTC_DRV_M41T80_WDT |
805 | if (clientdata->features & M41T80_FEATURE_HT) { | 806 | if (clientdata->features & M41T80_FEATURE_HT) { |
807 | save_client = client; | ||
806 | rc = misc_register(&wdt_dev); | 808 | rc = misc_register(&wdt_dev); |
807 | if (rc) | 809 | if (rc) |
808 | goto exit; | 810 | goto exit; |
@@ -811,7 +813,6 @@ static int m41t80_probe(struct i2c_client *client, | |||
811 | misc_deregister(&wdt_dev); | 813 | misc_deregister(&wdt_dev); |
812 | goto exit; | 814 | goto exit; |
813 | } | 815 | } |
814 | save_client = client; | ||
815 | } | 816 | } |
816 | #endif | 817 | #endif |
817 | return 0; | 818 | return 0; |
diff --git a/drivers/rtc/rtc-s35390a.c b/drivers/rtc/rtc-s35390a.c index 29f47bacfc77..a6fa1f2f2ca6 100644 --- a/drivers/rtc/rtc-s35390a.c +++ b/drivers/rtc/rtc-s35390a.c | |||
@@ -227,7 +227,7 @@ static int s35390a_probe(struct i2c_client *client, | |||
227 | /* This chip uses multiple addresses, use dummy devices for them */ | 227 | /* This chip uses multiple addresses, use dummy devices for them */ |
228 | for (i = 1; i < 8; ++i) { | 228 | for (i = 1; i < 8; ++i) { |
229 | s35390a->client[i] = i2c_new_dummy(client->adapter, | 229 | s35390a->client[i] = i2c_new_dummy(client->adapter, |
230 | client->addr + i, "rtc-s35390a"); | 230 | client->addr + i); |
231 | if (!s35390a->client[i]) { | 231 | if (!s35390a->client[i]) { |
232 | dev_err(&client->dev, "Address %02x unavailable\n", | 232 | dev_err(&client->dev, "Address %02x unavailable\n", |
233 | client->addr + i); | 233 | client->addr + i); |
diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c index 110699bb4787..1f88e9e914ec 100644 --- a/drivers/rtc/rtc-sh.c +++ b/drivers/rtc/rtc-sh.c | |||
@@ -616,7 +616,7 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
616 | goto err_badres; | 616 | goto err_badres; |
617 | } | 617 | } |
618 | 618 | ||
619 | rtc->regbase = (void __iomem *)rtc->res->start; | 619 | rtc->regbase = ioremap_nocache(rtc->res->start, rtc->regsize); |
620 | if (unlikely(!rtc->regbase)) { | 620 | if (unlikely(!rtc->regbase)) { |
621 | ret = -EINVAL; | 621 | ret = -EINVAL; |
622 | goto err_badmap; | 622 | goto err_badmap; |
@@ -626,7 +626,7 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
626 | &sh_rtc_ops, THIS_MODULE); | 626 | &sh_rtc_ops, THIS_MODULE); |
627 | if (IS_ERR(rtc->rtc_dev)) { | 627 | if (IS_ERR(rtc->rtc_dev)) { |
628 | ret = PTR_ERR(rtc->rtc_dev); | 628 | ret = PTR_ERR(rtc->rtc_dev); |
629 | goto err_badmap; | 629 | goto err_unmap; |
630 | } | 630 | } |
631 | 631 | ||
632 | rtc->capabilities = RTC_DEF_CAPABILITIES; | 632 | rtc->capabilities = RTC_DEF_CAPABILITIES; |
@@ -653,7 +653,7 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
653 | dev_err(&pdev->dev, | 653 | dev_err(&pdev->dev, |
654 | "request period IRQ failed with %d, IRQ %d\n", ret, | 654 | "request period IRQ failed with %d, IRQ %d\n", ret, |
655 | rtc->periodic_irq); | 655 | rtc->periodic_irq); |
656 | goto err_badmap; | 656 | goto err_unmap; |
657 | } | 657 | } |
658 | 658 | ||
659 | ret = request_irq(rtc->carry_irq, sh_rtc_interrupt, IRQF_DISABLED, | 659 | ret = request_irq(rtc->carry_irq, sh_rtc_interrupt, IRQF_DISABLED, |
@@ -663,7 +663,7 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
663 | "request carry IRQ failed with %d, IRQ %d\n", ret, | 663 | "request carry IRQ failed with %d, IRQ %d\n", ret, |
664 | rtc->carry_irq); | 664 | rtc->carry_irq); |
665 | free_irq(rtc->periodic_irq, rtc); | 665 | free_irq(rtc->periodic_irq, rtc); |
666 | goto err_badmap; | 666 | goto err_unmap; |
667 | } | 667 | } |
668 | 668 | ||
669 | ret = request_irq(rtc->alarm_irq, sh_rtc_alarm, IRQF_DISABLED, | 669 | ret = request_irq(rtc->alarm_irq, sh_rtc_alarm, IRQF_DISABLED, |
@@ -674,7 +674,7 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
674 | rtc->alarm_irq); | 674 | rtc->alarm_irq); |
675 | free_irq(rtc->carry_irq, rtc); | 675 | free_irq(rtc->carry_irq, rtc); |
676 | free_irq(rtc->periodic_irq, rtc); | 676 | free_irq(rtc->periodic_irq, rtc); |
677 | goto err_badmap; | 677 | goto err_unmap; |
678 | } | 678 | } |
679 | 679 | ||
680 | tmp = readb(rtc->regbase + RCR1); | 680 | tmp = readb(rtc->regbase + RCR1); |
@@ -684,6 +684,8 @@ static int __devinit sh_rtc_probe(struct platform_device *pdev) | |||
684 | 684 | ||
685 | return 0; | 685 | return 0; |
686 | 686 | ||
687 | err_unmap: | ||
688 | iounmap(rtc->regbase); | ||
687 | err_badmap: | 689 | err_badmap: |
688 | release_resource(rtc->res); | 690 | release_resource(rtc->res); |
689 | err_badres: | 691 | err_badres: |
@@ -708,6 +710,8 @@ static int __devexit sh_rtc_remove(struct platform_device *pdev) | |||
708 | 710 | ||
709 | release_resource(rtc->res); | 711 | release_resource(rtc->res); |
710 | 712 | ||
713 | iounmap(rtc->regbase); | ||
714 | |||
711 | platform_set_drvdata(pdev, NULL); | 715 | platform_set_drvdata(pdev, NULL); |
712 | 716 | ||
713 | kfree(rtc); | 717 | kfree(rtc); |
diff --git a/drivers/s390/char/tty3270.c b/drivers/s390/char/tty3270.c index c1f2adefad41..5043150019ac 100644 --- a/drivers/s390/char/tty3270.c +++ b/drivers/s390/char/tty3270.c | |||
@@ -965,8 +965,7 @@ tty3270_write_room(struct tty_struct *tty) | |||
965 | * Insert character into the screen at the current position with the | 965 | * Insert character into the screen at the current position with the |
966 | * current color and highlight. This function does NOT do cursor movement. | 966 | * current color and highlight. This function does NOT do cursor movement. |
967 | */ | 967 | */ |
968 | static int | 968 | static void tty3270_put_character(struct tty3270 *tp, char ch) |
969 | tty3270_put_character(struct tty3270 *tp, char ch) | ||
970 | { | 969 | { |
971 | struct tty3270_line *line; | 970 | struct tty3270_line *line; |
972 | struct tty3270_cell *cell; | 971 | struct tty3270_cell *cell; |
@@ -986,7 +985,6 @@ tty3270_put_character(struct tty3270 *tp, char ch) | |||
986 | cell->character = tp->view.ascebc[(unsigned int) ch]; | 985 | cell->character = tp->view.ascebc[(unsigned int) ch]; |
987 | cell->highlight = tp->highlight; | 986 | cell->highlight = tp->highlight; |
988 | cell->f_color = tp->f_color; | 987 | cell->f_color = tp->f_color; |
989 | return 1; | ||
990 | } | 988 | } |
991 | 989 | ||
992 | /* | 990 | /* |
@@ -1612,16 +1610,15 @@ tty3270_write(struct tty_struct * tty, | |||
1612 | /* | 1610 | /* |
1613 | * Put single characters to the ttys character buffer | 1611 | * Put single characters to the ttys character buffer |
1614 | */ | 1612 | */ |
1615 | static void | 1613 | static int tty3270_put_char(struct tty_struct *tty, unsigned char ch) |
1616 | tty3270_put_char(struct tty_struct *tty, unsigned char ch) | ||
1617 | { | 1614 | { |
1618 | struct tty3270 *tp; | 1615 | struct tty3270 *tp; |
1619 | 1616 | ||
1620 | tp = tty->driver_data; | 1617 | tp = tty->driver_data; |
1621 | if (!tp) | 1618 | if (!tp || tp->char_count >= TTY3270_CHAR_BUF_SIZE) |
1622 | return; | 1619 | return 0; |
1623 | if (tp->char_count < TTY3270_CHAR_BUF_SIZE) | 1620 | tp->char_buf[tp->char_count++] = ch; |
1624 | tp->char_buf[tp->char_count++] = ch; | 1621 | return 1; |
1625 | } | 1622 | } |
1626 | 1623 | ||
1627 | /* | 1624 | /* |
diff --git a/drivers/s390/cio/blacklist.c b/drivers/s390/cio/blacklist.c index 40ef948fcb3a..9c21b8f43f9b 100644 --- a/drivers/s390/cio/blacklist.c +++ b/drivers/s390/cio/blacklist.c | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include <asm/cio.h> | 20 | #include <asm/cio.h> |
21 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
22 | #include <asm/cio.h> | ||
22 | 23 | ||
23 | #include "blacklist.h" | 24 | #include "blacklist.h" |
24 | #include "cio.h" | 25 | #include "cio.h" |
@@ -43,164 +44,169 @@ typedef enum {add, free} range_action; | |||
43 | * Function: blacklist_range | 44 | * Function: blacklist_range |
44 | * (Un-)blacklist the devices from-to | 45 | * (Un-)blacklist the devices from-to |
45 | */ | 46 | */ |
46 | static void | 47 | static int blacklist_range(range_action action, unsigned int from_ssid, |
47 | blacklist_range (range_action action, unsigned int from, unsigned int to, | 48 | unsigned int to_ssid, unsigned int from, |
48 | unsigned int ssid) | 49 | unsigned int to, int msgtrigger) |
49 | { | 50 | { |
50 | if (!to) | 51 | if ((from_ssid > to_ssid) || ((from_ssid == to_ssid) && (from > to))) { |
51 | to = from; | 52 | if (msgtrigger) |
52 | 53 | printk(KERN_WARNING "cio: Invalid cio_ignore range " | |
53 | if (from > to || to > __MAX_SUBCHANNEL || ssid > __MAX_SSID) { | 54 | "0.%x.%04x-0.%x.%04x\n", from_ssid, from, |
54 | printk (KERN_WARNING "cio: Invalid blacklist range " | 55 | to_ssid, to); |
55 | "0.%x.%04x to 0.%x.%04x, skipping\n", | 56 | return 1; |
56 | ssid, from, ssid, to); | ||
57 | return; | ||
58 | } | 57 | } |
59 | for (; from <= to; from++) { | 58 | |
59 | while ((from_ssid < to_ssid) || ((from_ssid == to_ssid) && | ||
60 | (from <= to))) { | ||
60 | if (action == add) | 61 | if (action == add) |
61 | set_bit (from, bl_dev[ssid]); | 62 | set_bit(from, bl_dev[from_ssid]); |
62 | else | 63 | else |
63 | clear_bit (from, bl_dev[ssid]); | 64 | clear_bit(from, bl_dev[from_ssid]); |
65 | from++; | ||
66 | if (from > __MAX_SUBCHANNEL) { | ||
67 | from_ssid++; | ||
68 | from = 0; | ||
69 | } | ||
64 | } | 70 | } |
71 | |||
72 | return 0; | ||
65 | } | 73 | } |
66 | 74 | ||
67 | /* | 75 | static int pure_hex(char **cp, unsigned int *val, int min_digit, |
68 | * Function: blacklist_busid | 76 | int max_digit, int max_val) |
69 | * Get devno/busid from given string. | ||
70 | * Shamelessly grabbed from dasd_devmap.c. | ||
71 | */ | ||
72 | static int | ||
73 | blacklist_busid(char **str, int *id0, int *ssid, int *devno) | ||
74 | { | 77 | { |
75 | int val, old_style; | 78 | int diff; |
76 | char *sav; | 79 | unsigned int value; |
77 | 80 | ||
78 | sav = *str; | 81 | diff = 0; |
82 | *val = 0; | ||
79 | 83 | ||
80 | /* check for leading '0x' */ | 84 | while (isxdigit(**cp) && (diff <= max_digit)) { |
81 | old_style = 0; | 85 | |
82 | if ((*str)[0] == '0' && (*str)[1] == 'x') { | 86 | if (isdigit(**cp)) |
83 | *str += 2; | 87 | value = **cp - '0'; |
84 | old_style = 1; | 88 | else |
85 | } | 89 | value = tolower(**cp) - 'a' + 10; |
86 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | 90 | *val = *val * 16 + value; |
87 | goto confused; | 91 | (*cp)++; |
88 | val = simple_strtoul(*str, str, 16); | 92 | diff++; |
89 | if (old_style || (*str)[0] != '.') { | ||
90 | *id0 = *ssid = 0; | ||
91 | if (val < 0 || val > 0xffff) | ||
92 | goto confused; | ||
93 | *devno = val; | ||
94 | if ((*str)[0] != ',' && (*str)[0] != '-' && | ||
95 | (*str)[0] != '\n' && (*str)[0] != '\0') | ||
96 | goto confused; | ||
97 | return 0; | ||
98 | } | 93 | } |
99 | /* New style x.y.z busid */ | 94 | |
100 | if (val < 0 || val > 0xff) | 95 | if ((diff < min_digit) || (diff > max_digit) || (*val > max_val)) |
101 | goto confused; | 96 | return 1; |
102 | *id0 = val; | 97 | |
103 | (*str)++; | ||
104 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | ||
105 | goto confused; | ||
106 | val = simple_strtoul(*str, str, 16); | ||
107 | if (val < 0 || val > 0xff || (*str)++[0] != '.') | ||
108 | goto confused; | ||
109 | *ssid = val; | ||
110 | if (!isxdigit((*str)[0])) /* We require at least one hex digit */ | ||
111 | goto confused; | ||
112 | val = simple_strtoul(*str, str, 16); | ||
113 | if (val < 0 || val > 0xffff) | ||
114 | goto confused; | ||
115 | *devno = val; | ||
116 | if ((*str)[0] != ',' && (*str)[0] != '-' && | ||
117 | (*str)[0] != '\n' && (*str)[0] != '\0') | ||
118 | goto confused; | ||
119 | return 0; | 98 | return 0; |
120 | confused: | ||
121 | strsep(str, ",\n"); | ||
122 | printk(KERN_WARNING "cio: Invalid cio_ignore parameter '%s'\n", sav); | ||
123 | return 1; | ||
124 | } | 99 | } |
125 | 100 | ||
126 | static int | 101 | static int parse_busid(char *str, int *cssid, int *ssid, int *devno, |
127 | blacklist_parse_parameters (char *str, range_action action) | 102 | int msgtrigger) |
128 | { | 103 | { |
129 | int from, to, from_id0, to_id0, from_ssid, to_ssid; | 104 | char *str_work; |
130 | 105 | int val, rc, ret; | |
131 | while (*str != 0 && *str != '\n') { | 106 | |
132 | range_action ra = action; | 107 | rc = 1; |
133 | while(*str == ',') | 108 | |
134 | str++; | 109 | if (*str == '\0') |
135 | if (*str == '!') { | 110 | goto out; |
136 | ra = !action; | 111 | |
137 | ++str; | 112 | /* old style */ |
113 | str_work = str; | ||
114 | val = simple_strtoul(str, &str_work, 16); | ||
115 | |||
116 | if (*str_work == '\0') { | ||
117 | if (val <= __MAX_SUBCHANNEL) { | ||
118 | *devno = val; | ||
119 | *ssid = 0; | ||
120 | *cssid = 0; | ||
121 | rc = 0; | ||
138 | } | 122 | } |
123 | goto out; | ||
124 | } | ||
139 | 125 | ||
140 | /* | 126 | /* new style */ |
141 | * Since we have to parse the proc commands and the | 127 | str_work = str; |
142 | * kernel arguments we have to check four cases | 128 | ret = pure_hex(&str_work, cssid, 1, 2, __MAX_CSSID); |
143 | */ | 129 | if (ret || (str_work[0] != '.')) |
144 | if (strncmp(str,"all,",4) == 0 || strcmp(str,"all") == 0 || | 130 | goto out; |
145 | strncmp(str,"all\n",4) == 0 || strncmp(str,"all ",4) == 0) { | 131 | str_work++; |
146 | int j; | 132 | ret = pure_hex(&str_work, ssid, 1, 1, __MAX_SSID); |
147 | 133 | if (ret || (str_work[0] != '.')) | |
148 | str += 3; | 134 | goto out; |
149 | for (j=0; j <= __MAX_SSID; j++) | 135 | str_work++; |
150 | blacklist_range(ra, 0, __MAX_SUBCHANNEL, j); | 136 | ret = pure_hex(&str_work, devno, 4, 4, __MAX_SUBCHANNEL); |
151 | } else { | 137 | if (ret || (str_work[0] != '\0')) |
152 | int rc; | 138 | goto out; |
139 | |||
140 | rc = 0; | ||
141 | out: | ||
142 | if (rc && msgtrigger) | ||
143 | printk(KERN_WARNING "cio: Invalid cio_ignore device '%s'\n", | ||
144 | str); | ||
145 | |||
146 | return rc; | ||
147 | } | ||
153 | 148 | ||
154 | rc = blacklist_busid(&str, &from_id0, | 149 | static int blacklist_parse_parameters(char *str, range_action action, |
155 | &from_ssid, &from); | 150 | int msgtrigger) |
156 | if (rc) | 151 | { |
157 | continue; | 152 | int from_cssid, to_cssid, from_ssid, to_ssid, from, to; |
158 | to = from; | 153 | int rc, totalrc; |
159 | to_id0 = from_id0; | 154 | char *parm; |
160 | to_ssid = from_ssid; | 155 | range_action ra; |
161 | if (*str == '-') { | 156 | |
162 | str++; | 157 | totalrc = 0; |
163 | rc = blacklist_busid(&str, &to_id0, | 158 | |
164 | &to_ssid, &to); | 159 | while ((parm = strsep(&str, ","))) { |
165 | if (rc) | 160 | rc = 0; |
166 | continue; | 161 | ra = action; |
167 | } | 162 | if (*parm == '!') { |
168 | if (*str == '-') { | 163 | if (ra == add) |
169 | printk(KERN_WARNING "cio: invalid cio_ignore " | 164 | ra = free; |
170 | "parameter '%s'\n", | 165 | else |
171 | strsep(&str, ",\n")); | 166 | ra = add; |
172 | continue; | 167 | parm++; |
173 | } | 168 | } |
174 | if ((from_id0 != to_id0) || | 169 | if (strcmp(parm, "all") == 0) { |
175 | (from_ssid != to_ssid)) { | 170 | from_cssid = 0; |
176 | printk(KERN_WARNING "cio: invalid cio_ignore " | 171 | from_ssid = 0; |
177 | "range %x.%x.%04x-%x.%x.%04x\n", | 172 | from = 0; |
178 | from_id0, from_ssid, from, | 173 | to_cssid = __MAX_CSSID; |
179 | to_id0, to_ssid, to); | 174 | to_ssid = __MAX_SSID; |
180 | continue; | 175 | to = __MAX_SUBCHANNEL; |
176 | } else { | ||
177 | rc = parse_busid(strsep(&parm, "-"), &from_cssid, | ||
178 | &from_ssid, &from, msgtrigger); | ||
179 | if (!rc) { | ||
180 | if (parm != NULL) | ||
181 | rc = parse_busid(parm, &to_cssid, | ||
182 | &to_ssid, &to, | ||
183 | msgtrigger); | ||
184 | else { | ||
185 | to_cssid = from_cssid; | ||
186 | to_ssid = from_ssid; | ||
187 | to = from; | ||
188 | } | ||
181 | } | 189 | } |
182 | blacklist_range (ra, from, to, to_ssid); | ||
183 | } | 190 | } |
191 | if (!rc) { | ||
192 | rc = blacklist_range(ra, from_ssid, to_ssid, from, to, | ||
193 | msgtrigger); | ||
194 | if (rc) | ||
195 | totalrc = 1; | ||
196 | } else | ||
197 | totalrc = 1; | ||
184 | } | 198 | } |
185 | return 1; | 199 | |
200 | return totalrc; | ||
186 | } | 201 | } |
187 | 202 | ||
188 | /* Parsing the commandline for blacklist parameters, e.g. to blacklist | ||
189 | * bus ids 0.0.1234, 0.0.1235 and 0.0.1236, you could use any of: | ||
190 | * - cio_ignore=1234-1236 | ||
191 | * - cio_ignore=0x1234-0x1235,1236 | ||
192 | * - cio_ignore=0x1234,1235-1236 | ||
193 | * - cio_ignore=1236 cio_ignore=1234-0x1236 | ||
194 | * - cio_ignore=1234 cio_ignore=1236 cio_ignore=0x1235 | ||
195 | * - cio_ignore=0.0.1234-0.0.1236 | ||
196 | * - cio_ignore=0.0.1234,0x1235,1236 | ||
197 | * - ... | ||
198 | */ | ||
199 | static int __init | 203 | static int __init |
200 | blacklist_setup (char *str) | 204 | blacklist_setup (char *str) |
201 | { | 205 | { |
202 | CIO_MSG_EVENT(6, "Reading blacklist parameters\n"); | 206 | CIO_MSG_EVENT(6, "Reading blacklist parameters\n"); |
203 | return blacklist_parse_parameters (str, add); | 207 | if (blacklist_parse_parameters(str, add, 1)) |
208 | return 0; | ||
209 | return 1; | ||
204 | } | 210 | } |
205 | 211 | ||
206 | __setup ("cio_ignore=", blacklist_setup); | 212 | __setup ("cio_ignore=", blacklist_setup); |
@@ -224,27 +230,23 @@ is_blacklisted (int ssid, int devno) | |||
224 | * Function: blacklist_parse_proc_parameters | 230 | * Function: blacklist_parse_proc_parameters |
225 | * parse the stuff which is piped to /proc/cio_ignore | 231 | * parse the stuff which is piped to /proc/cio_ignore |
226 | */ | 232 | */ |
227 | static void | 233 | static int blacklist_parse_proc_parameters(char *buf) |
228 | blacklist_parse_proc_parameters (char *buf) | ||
229 | { | 234 | { |
230 | if (strncmp (buf, "free ", 5) == 0) { | 235 | int rc; |
231 | blacklist_parse_parameters (buf + 5, free); | 236 | char *parm; |
232 | } else if (strncmp (buf, "add ", 4) == 0) { | 237 | |
233 | /* | 238 | parm = strsep(&buf, " "); |
234 | * We don't need to check for known devices since | 239 | |
235 | * css_probe_device will handle this correctly. | 240 | if (strcmp("free", parm) == 0) |
236 | */ | 241 | rc = blacklist_parse_parameters(buf, free, 0); |
237 | blacklist_parse_parameters (buf + 4, add); | 242 | else if (strcmp("add", parm) == 0) |
238 | } else { | 243 | rc = blacklist_parse_parameters(buf, add, 0); |
239 | printk (KERN_WARNING "cio: cio_ignore: Parse error; \n" | 244 | else |
240 | KERN_WARNING "try using 'free all|<devno-range>," | 245 | return 1; |
241 | "<devno-range>,...'\n" | ||
242 | KERN_WARNING "or 'add <devno-range>," | ||
243 | "<devno-range>,...'\n"); | ||
244 | return; | ||
245 | } | ||
246 | 246 | ||
247 | css_schedule_reprobe(); | 247 | css_schedule_reprobe(); |
248 | |||
249 | return rc; | ||
248 | } | 250 | } |
249 | 251 | ||
250 | /* Iterator struct for all devices. */ | 252 | /* Iterator struct for all devices. */ |
@@ -328,6 +330,8 @@ cio_ignore_write(struct file *file, const char __user *user_buf, | |||
328 | size_t user_len, loff_t *offset) | 330 | size_t user_len, loff_t *offset) |
329 | { | 331 | { |
330 | char *buf; | 332 | char *buf; |
333 | size_t i; | ||
334 | ssize_t rc, ret; | ||
331 | 335 | ||
332 | if (*offset) | 336 | if (*offset) |
333 | return -EINVAL; | 337 | return -EINVAL; |
@@ -336,16 +340,27 @@ cio_ignore_write(struct file *file, const char __user *user_buf, | |||
336 | buf = vmalloc (user_len + 1); /* maybe better use the stack? */ | 340 | buf = vmalloc (user_len + 1); /* maybe better use the stack? */ |
337 | if (buf == NULL) | 341 | if (buf == NULL) |
338 | return -ENOMEM; | 342 | return -ENOMEM; |
343 | memset(buf, 0, user_len + 1); | ||
344 | |||
339 | if (strncpy_from_user (buf, user_buf, user_len) < 0) { | 345 | if (strncpy_from_user (buf, user_buf, user_len) < 0) { |
340 | vfree (buf); | 346 | rc = -EFAULT; |
341 | return -EFAULT; | 347 | goto out_free; |
342 | } | 348 | } |
343 | buf[user_len] = '\0'; | ||
344 | 349 | ||
345 | blacklist_parse_proc_parameters (buf); | 350 | i = user_len - 1; |
351 | while ((i >= 0) && (isspace(buf[i]) || (buf[i] == 0))) { | ||
352 | buf[i] = '\0'; | ||
353 | i--; | ||
354 | } | ||
355 | ret = blacklist_parse_proc_parameters(buf); | ||
356 | if (ret) | ||
357 | rc = -EINVAL; | ||
358 | else | ||
359 | rc = user_len; | ||
346 | 360 | ||
361 | out_free: | ||
347 | vfree (buf); | 362 | vfree (buf); |
348 | return user_len; | 363 | return rc; |
349 | } | 364 | } |
350 | 365 | ||
351 | static const struct seq_operations cio_ignore_proc_seq_ops = { | 366 | static const struct seq_operations cio_ignore_proc_seq_ops = { |
diff --git a/drivers/s390/cio/cio.c b/drivers/s390/cio/cio.c index 08a578161306..82c6a2d45128 100644 --- a/drivers/s390/cio/cio.c +++ b/drivers/s390/cio/cio.c | |||
@@ -39,23 +39,6 @@ debug_info_t *cio_debug_msg_id; | |||
39 | debug_info_t *cio_debug_trace_id; | 39 | debug_info_t *cio_debug_trace_id; |
40 | debug_info_t *cio_debug_crw_id; | 40 | debug_info_t *cio_debug_crw_id; |
41 | 41 | ||
42 | int cio_show_msg; | ||
43 | |||
44 | static int __init | ||
45 | cio_setup (char *parm) | ||
46 | { | ||
47 | if (!strcmp (parm, "yes")) | ||
48 | cio_show_msg = 1; | ||
49 | else if (!strcmp (parm, "no")) | ||
50 | cio_show_msg = 0; | ||
51 | else | ||
52 | printk(KERN_ERR "cio: cio_setup: " | ||
53 | "invalid cio_msg parameter '%s'", parm); | ||
54 | return 1; | ||
55 | } | ||
56 | |||
57 | __setup ("cio_msg=", cio_setup); | ||
58 | |||
59 | /* | 42 | /* |
60 | * Function: cio_debug_init | 43 | * Function: cio_debug_init |
61 | * Initializes three debug logs for common I/O: | 44 | * Initializes three debug logs for common I/O: |
@@ -166,7 +149,7 @@ cio_start_handle_notoper(struct subchannel *sch, __u8 lpm) | |||
166 | 149 | ||
167 | stsch (sch->schid, &sch->schib); | 150 | stsch (sch->schid, &sch->schib); |
168 | 151 | ||
169 | CIO_MSG_EVENT(0, "cio_start: 'not oper' status for " | 152 | CIO_MSG_EVENT(2, "cio_start: 'not oper' status for " |
170 | "subchannel 0.%x.%04x!\n", sch->schid.ssid, | 153 | "subchannel 0.%x.%04x!\n", sch->schid.ssid, |
171 | sch->schid.sch_no); | 154 | sch->schid.sch_no); |
172 | sprintf(dbf_text, "no%s", sch->dev.bus_id); | 155 | sprintf(dbf_text, "no%s", sch->dev.bus_id); |
@@ -567,10 +550,9 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
567 | * ... just being curious we check for non I/O subchannels | 550 | * ... just being curious we check for non I/O subchannels |
568 | */ | 551 | */ |
569 | if (sch->st != 0) { | 552 | if (sch->st != 0) { |
570 | CIO_DEBUG(KERN_INFO, 0, | 553 | CIO_MSG_EVENT(4, "Subchannel 0.%x.%04x reports " |
571 | "Subchannel 0.%x.%04x reports " | 554 | "non-I/O subchannel type %04X\n", |
572 | "non-I/O subchannel type %04X\n", | 555 | sch->schid.ssid, sch->schid.sch_no, sch->st); |
573 | sch->schid.ssid, sch->schid.sch_no, sch->st); | ||
574 | /* We stop here for non-io subchannels. */ | 556 | /* We stop here for non-io subchannels. */ |
575 | err = sch->st; | 557 | err = sch->st; |
576 | goto out; | 558 | goto out; |
@@ -588,7 +570,7 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
588 | * This device must not be known to Linux. So we simply | 570 | * This device must not be known to Linux. So we simply |
589 | * say that there is no device and return ENODEV. | 571 | * say that there is no device and return ENODEV. |
590 | */ | 572 | */ |
591 | CIO_MSG_EVENT(4, "Blacklisted device detected " | 573 | CIO_MSG_EVENT(6, "Blacklisted device detected " |
592 | "at devno %04X, subchannel set %x\n", | 574 | "at devno %04X, subchannel set %x\n", |
593 | sch->schib.pmcw.dev, sch->schid.ssid); | 575 | sch->schib.pmcw.dev, sch->schid.ssid); |
594 | err = -ENODEV; | 576 | err = -ENODEV; |
@@ -601,12 +583,11 @@ cio_validate_subchannel (struct subchannel *sch, struct subchannel_id schid) | |||
601 | sch->lpm = sch->schib.pmcw.pam & sch->opm; | 583 | sch->lpm = sch->schib.pmcw.pam & sch->opm; |
602 | sch->isc = 3; | 584 | sch->isc = 3; |
603 | 585 | ||
604 | CIO_DEBUG(KERN_INFO, 0, | 586 | CIO_MSG_EVENT(6, "Detected device %04x on subchannel 0.%x.%04X " |
605 | "Detected device %04x on subchannel 0.%x.%04X" | 587 | "- PIM = %02X, PAM = %02X, POM = %02X\n", |
606 | " - PIM = %02X, PAM = %02X, POM = %02X\n", | 588 | sch->schib.pmcw.dev, sch->schid.ssid, |
607 | sch->schib.pmcw.dev, sch->schid.ssid, | 589 | sch->schid.sch_no, sch->schib.pmcw.pim, |
608 | sch->schid.sch_no, sch->schib.pmcw.pim, | 590 | sch->schib.pmcw.pam, sch->schib.pmcw.pom); |
609 | sch->schib.pmcw.pam, sch->schib.pmcw.pom); | ||
610 | 591 | ||
611 | /* | 592 | /* |
612 | * We now have to initially ... | 593 | * We now have to initially ... |
diff --git a/drivers/s390/cio/cio.h b/drivers/s390/cio/cio.h index 3c75412904dc..6e933aebe013 100644 --- a/drivers/s390/cio/cio.h +++ b/drivers/s390/cio/cio.h | |||
@@ -118,6 +118,4 @@ extern void *cio_get_console_priv(void); | |||
118 | #define cio_get_console_priv() NULL | 118 | #define cio_get_console_priv() NULL |
119 | #endif | 119 | #endif |
120 | 120 | ||
121 | extern int cio_show_msg; | ||
122 | |||
123 | #endif | 121 | #endif |
diff --git a/drivers/s390/cio/cio_debug.h b/drivers/s390/cio/cio_debug.h index d7429ef6c666..e64e8278c42e 100644 --- a/drivers/s390/cio/cio_debug.h +++ b/drivers/s390/cio/cio_debug.h | |||
@@ -31,10 +31,4 @@ static inline void CIO_HEX_EVENT(int level, void *data, int length) | |||
31 | } | 31 | } |
32 | } | 32 | } |
33 | 33 | ||
34 | #define CIO_DEBUG(printk_level, event_level, msg...) do { \ | ||
35 | if (cio_show_msg) \ | ||
36 | printk(printk_level "cio: " msg); \ | ||
37 | CIO_MSG_EVENT(event_level, msg); \ | ||
38 | } while (0) | ||
39 | |||
40 | #endif | 34 | #endif |
diff --git a/drivers/s390/cio/css.c b/drivers/s390/cio/css.c index 595e327d2f76..a76956512b2d 100644 --- a/drivers/s390/cio/css.c +++ b/drivers/s390/cio/css.c | |||
@@ -570,7 +570,7 @@ static void reprobe_all(struct work_struct *unused) | |||
570 | { | 570 | { |
571 | int ret; | 571 | int ret; |
572 | 572 | ||
573 | CIO_MSG_EVENT(2, "reprobe start\n"); | 573 | CIO_MSG_EVENT(4, "reprobe start\n"); |
574 | 574 | ||
575 | need_reprobe = 0; | 575 | need_reprobe = 0; |
576 | /* Make sure initial subchannel scan is done. */ | 576 | /* Make sure initial subchannel scan is done. */ |
@@ -578,7 +578,7 @@ static void reprobe_all(struct work_struct *unused) | |||
578 | atomic_read(&ccw_device_init_count) == 0); | 578 | atomic_read(&ccw_device_init_count) == 0); |
579 | ret = for_each_subchannel_staged(NULL, reprobe_subchannel, NULL); | 579 | ret = for_each_subchannel_staged(NULL, reprobe_subchannel, NULL); |
580 | 580 | ||
581 | CIO_MSG_EVENT(2, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, | 581 | CIO_MSG_EVENT(4, "reprobe done (rc=%d, need_reprobe=%d)\n", ret, |
582 | need_reprobe); | 582 | need_reprobe); |
583 | } | 583 | } |
584 | 584 | ||
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index abfd601d237a..e22813db74a2 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -341,7 +341,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) | |||
341 | rc = device_schedule_callback(&cdev->dev, | 341 | rc = device_schedule_callback(&cdev->dev, |
342 | ccw_device_remove_orphan_cb); | 342 | ccw_device_remove_orphan_cb); |
343 | if (rc) | 343 | if (rc) |
344 | CIO_MSG_EVENT(2, "Couldn't unregister orphan " | 344 | CIO_MSG_EVENT(0, "Couldn't unregister orphan " |
345 | "0.%x.%04x\n", | 345 | "0.%x.%04x\n", |
346 | cdev->private->dev_id.ssid, | 346 | cdev->private->dev_id.ssid, |
347 | cdev->private->dev_id.devno); | 347 | cdev->private->dev_id.devno); |
@@ -351,7 +351,7 @@ ccw_device_remove_disconnected(struct ccw_device *cdev) | |||
351 | rc = device_schedule_callback(cdev->dev.parent, | 351 | rc = device_schedule_callback(cdev->dev.parent, |
352 | ccw_device_remove_sch_cb); | 352 | ccw_device_remove_sch_cb); |
353 | if (rc) | 353 | if (rc) |
354 | CIO_MSG_EVENT(2, "Couldn't unregister disconnected device " | 354 | CIO_MSG_EVENT(0, "Couldn't unregister disconnected device " |
355 | "0.%x.%04x\n", | 355 | "0.%x.%04x\n", |
356 | cdev->private->dev_id.ssid, | 356 | cdev->private->dev_id.ssid, |
357 | cdev->private->dev_id.devno); | 357 | cdev->private->dev_id.devno); |
@@ -397,7 +397,7 @@ int ccw_device_set_offline(struct ccw_device *cdev) | |||
397 | if (ret == 0) | 397 | if (ret == 0) |
398 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 398 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
399 | else { | 399 | else { |
400 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | 400 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
401 | "device 0.%x.%04x\n", | 401 | "device 0.%x.%04x\n", |
402 | ret, cdev->private->dev_id.ssid, | 402 | ret, cdev->private->dev_id.ssid, |
403 | cdev->private->dev_id.devno); | 403 | cdev->private->dev_id.devno); |
@@ -433,7 +433,7 @@ int ccw_device_set_online(struct ccw_device *cdev) | |||
433 | if (ret == 0) | 433 | if (ret == 0) |
434 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 434 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
435 | else { | 435 | else { |
436 | CIO_MSG_EVENT(2, "ccw_device_online returned %d, " | 436 | CIO_MSG_EVENT(0, "ccw_device_online returned %d, " |
437 | "device 0.%x.%04x\n", | 437 | "device 0.%x.%04x\n", |
438 | ret, cdev->private->dev_id.ssid, | 438 | ret, cdev->private->dev_id.ssid, |
439 | cdev->private->dev_id.devno); | 439 | cdev->private->dev_id.devno); |
@@ -451,7 +451,7 @@ int ccw_device_set_online(struct ccw_device *cdev) | |||
451 | if (ret == 0) | 451 | if (ret == 0) |
452 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); | 452 | wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); |
453 | else | 453 | else |
454 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | 454 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
455 | "device 0.%x.%04x\n", | 455 | "device 0.%x.%04x\n", |
456 | ret, cdev->private->dev_id.ssid, | 456 | ret, cdev->private->dev_id.ssid, |
457 | cdev->private->dev_id.devno); | 457 | cdev->private->dev_id.devno); |
@@ -803,7 +803,7 @@ static void sch_attach_disconnected_device(struct subchannel *sch, | |||
803 | other_sch = to_subchannel(get_device(cdev->dev.parent)); | 803 | other_sch = to_subchannel(get_device(cdev->dev.parent)); |
804 | ret = device_move(&cdev->dev, &sch->dev); | 804 | ret = device_move(&cdev->dev, &sch->dev); |
805 | if (ret) { | 805 | if (ret) { |
806 | CIO_MSG_EVENT(2, "Moving disconnected device 0.%x.%04x failed " | 806 | CIO_MSG_EVENT(0, "Moving disconnected device 0.%x.%04x failed " |
807 | "(ret=%d)!\n", cdev->private->dev_id.ssid, | 807 | "(ret=%d)!\n", cdev->private->dev_id.ssid, |
808 | cdev->private->dev_id.devno, ret); | 808 | cdev->private->dev_id.devno, ret); |
809 | put_device(&other_sch->dev); | 809 | put_device(&other_sch->dev); |
@@ -933,7 +933,7 @@ io_subchannel_register(struct work_struct *work) | |||
933 | ret = device_reprobe(&cdev->dev); | 933 | ret = device_reprobe(&cdev->dev); |
934 | if (ret) | 934 | if (ret) |
935 | /* We can't do much here. */ | 935 | /* We can't do much here. */ |
936 | CIO_MSG_EVENT(2, "device_reprobe() returned" | 936 | CIO_MSG_EVENT(0, "device_reprobe() returned" |
937 | " %d for 0.%x.%04x\n", ret, | 937 | " %d for 0.%x.%04x\n", ret, |
938 | cdev->private->dev_id.ssid, | 938 | cdev->private->dev_id.ssid, |
939 | cdev->private->dev_id.devno); | 939 | cdev->private->dev_id.devno); |
@@ -1086,7 +1086,7 @@ static void ccw_device_move_to_sch(struct work_struct *work) | |||
1086 | rc = device_move(&cdev->dev, &sch->dev); | 1086 | rc = device_move(&cdev->dev, &sch->dev); |
1087 | mutex_unlock(&sch->reg_mutex); | 1087 | mutex_unlock(&sch->reg_mutex); |
1088 | if (rc) { | 1088 | if (rc) { |
1089 | CIO_MSG_EVENT(2, "Moving device 0.%x.%04x to subchannel " | 1089 | CIO_MSG_EVENT(0, "Moving device 0.%x.%04x to subchannel " |
1090 | "0.%x.%04x failed (ret=%d)!\n", | 1090 | "0.%x.%04x failed (ret=%d)!\n", |
1091 | cdev->private->dev_id.ssid, | 1091 | cdev->private->dev_id.ssid, |
1092 | cdev->private->dev_id.devno, sch->schid.ssid, | 1092 | cdev->private->dev_id.devno, sch->schid.ssid, |
@@ -1446,8 +1446,7 @@ ccw_device_remove (struct device *dev) | |||
1446 | wait_event(cdev->private->wait_q, | 1446 | wait_event(cdev->private->wait_q, |
1447 | dev_fsm_final_state(cdev)); | 1447 | dev_fsm_final_state(cdev)); |
1448 | else | 1448 | else |
1449 | //FIXME: we can't fail! | 1449 | CIO_MSG_EVENT(0, "ccw_device_offline returned %d, " |
1450 | CIO_MSG_EVENT(2, "ccw_device_offline returned %d, " | ||
1451 | "device 0.%x.%04x\n", | 1450 | "device 0.%x.%04x\n", |
1452 | ret, cdev->private->dev_id.ssid, | 1451 | ret, cdev->private->dev_id.ssid, |
1453 | cdev->private->dev_id.devno); | 1452 | cdev->private->dev_id.devno); |
@@ -1524,7 +1523,7 @@ static int recovery_check(struct device *dev, void *data) | |||
1524 | spin_lock_irq(cdev->ccwlock); | 1523 | spin_lock_irq(cdev->ccwlock); |
1525 | switch (cdev->private->state) { | 1524 | switch (cdev->private->state) { |
1526 | case DEV_STATE_DISCONNECTED: | 1525 | case DEV_STATE_DISCONNECTED: |
1527 | CIO_MSG_EVENT(3, "recovery: trigger 0.%x.%04x\n", | 1526 | CIO_MSG_EVENT(4, "recovery: trigger 0.%x.%04x\n", |
1528 | cdev->private->dev_id.ssid, | 1527 | cdev->private->dev_id.ssid, |
1529 | cdev->private->dev_id.devno); | 1528 | cdev->private->dev_id.devno); |
1530 | dev_fsm_event(cdev, DEV_EVENT_VERIFY); | 1529 | dev_fsm_event(cdev, DEV_EVENT_VERIFY); |
@@ -1554,7 +1553,7 @@ static void recovery_work_func(struct work_struct *unused) | |||
1554 | } | 1553 | } |
1555 | spin_unlock_irq(&recovery_lock); | 1554 | spin_unlock_irq(&recovery_lock); |
1556 | } else | 1555 | } else |
1557 | CIO_MSG_EVENT(2, "recovery: end\n"); | 1556 | CIO_MSG_EVENT(4, "recovery: end\n"); |
1558 | } | 1557 | } |
1559 | 1558 | ||
1560 | static DECLARE_WORK(recovery_work, recovery_work_func); | 1559 | static DECLARE_WORK(recovery_work, recovery_work_func); |
@@ -1572,7 +1571,7 @@ void ccw_device_schedule_recovery(void) | |||
1572 | { | 1571 | { |
1573 | unsigned long flags; | 1572 | unsigned long flags; |
1574 | 1573 | ||
1575 | CIO_MSG_EVENT(2, "recovery: schedule\n"); | 1574 | CIO_MSG_EVENT(4, "recovery: schedule\n"); |
1576 | spin_lock_irqsave(&recovery_lock, flags); | 1575 | spin_lock_irqsave(&recovery_lock, flags); |
1577 | if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) { | 1576 | if (!timer_pending(&recovery_timer) || (recovery_phase != 0)) { |
1578 | recovery_phase = 0; | 1577 | recovery_phase = 0; |
diff --git a/drivers/s390/cio/device_fsm.c b/drivers/s390/cio/device_fsm.c index 99403b0a97a7..e268d5a77c12 100644 --- a/drivers/s390/cio/device_fsm.c +++ b/drivers/s390/cio/device_fsm.c | |||
@@ -322,10 +322,10 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
322 | same_dev = 0; /* Keep the compiler quiet... */ | 322 | same_dev = 0; /* Keep the compiler quiet... */ |
323 | switch (state) { | 323 | switch (state) { |
324 | case DEV_STATE_NOT_OPER: | 324 | case DEV_STATE_NOT_OPER: |
325 | CIO_DEBUG(KERN_WARNING, 2, | 325 | CIO_MSG_EVENT(2, "SenseID : unknown device %04x on " |
326 | "SenseID : unknown device %04x on subchannel " | 326 | "subchannel 0.%x.%04x\n", |
327 | "0.%x.%04x\n", cdev->private->dev_id.devno, | 327 | cdev->private->dev_id.devno, |
328 | sch->schid.ssid, sch->schid.sch_no); | 328 | sch->schid.ssid, sch->schid.sch_no); |
329 | break; | 329 | break; |
330 | case DEV_STATE_OFFLINE: | 330 | case DEV_STATE_OFFLINE: |
331 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { | 331 | if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID) { |
@@ -348,20 +348,19 @@ ccw_device_recog_done(struct ccw_device *cdev, int state) | |||
348 | return; | 348 | return; |
349 | } | 349 | } |
350 | /* Issue device info message. */ | 350 | /* Issue device info message. */ |
351 | CIO_DEBUG(KERN_INFO, 2, | 351 | CIO_MSG_EVENT(4, "SenseID : device 0.%x.%04x reports: " |
352 | "SenseID : device 0.%x.%04x reports: " | 352 | "CU Type/Mod = %04X/%02X, Dev Type/Mod = " |
353 | "CU Type/Mod = %04X/%02X, Dev Type/Mod = " | 353 | "%04X/%02X\n", |
354 | "%04X/%02X\n", | 354 | cdev->private->dev_id.ssid, |
355 | cdev->private->dev_id.ssid, | 355 | cdev->private->dev_id.devno, |
356 | cdev->private->dev_id.devno, | 356 | cdev->id.cu_type, cdev->id.cu_model, |
357 | cdev->id.cu_type, cdev->id.cu_model, | 357 | cdev->id.dev_type, cdev->id.dev_model); |
358 | cdev->id.dev_type, cdev->id.dev_model); | ||
359 | break; | 358 | break; |
360 | case DEV_STATE_BOXED: | 359 | case DEV_STATE_BOXED: |
361 | CIO_DEBUG(KERN_WARNING, 2, | 360 | CIO_MSG_EVENT(0, "SenseID : boxed device %04x on " |
362 | "SenseID : boxed device %04x on subchannel " | 361 | " subchannel 0.%x.%04x\n", |
363 | "0.%x.%04x\n", cdev->private->dev_id.devno, | 362 | cdev->private->dev_id.devno, |
364 | sch->schid.ssid, sch->schid.sch_no); | 363 | sch->schid.ssid, sch->schid.sch_no); |
365 | break; | 364 | break; |
366 | } | 365 | } |
367 | cdev->private->state = state; | 366 | cdev->private->state = state; |
@@ -443,9 +442,8 @@ ccw_device_done(struct ccw_device *cdev, int state) | |||
443 | 442 | ||
444 | 443 | ||
445 | if (state == DEV_STATE_BOXED) | 444 | if (state == DEV_STATE_BOXED) |
446 | CIO_DEBUG(KERN_WARNING, 2, | 445 | CIO_MSG_EVENT(0, "Boxed device %04x on subchannel %04x\n", |
447 | "Boxed device %04x on subchannel %04x\n", | 446 | cdev->private->dev_id.devno, sch->schid.sch_no); |
448 | cdev->private->dev_id.devno, sch->schid.sch_no); | ||
449 | 447 | ||
450 | if (cdev->private->flags.donotify) { | 448 | if (cdev->private->flags.donotify) { |
451 | cdev->private->flags.donotify = 0; | 449 | cdev->private->flags.donotify = 0; |
@@ -900,7 +898,7 @@ ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event) | |||
900 | /* Basic sense hasn't started. Try again. */ | 898 | /* Basic sense hasn't started. Try again. */ |
901 | ccw_device_do_sense(cdev, irb); | 899 | ccw_device_do_sense(cdev, irb); |
902 | else { | 900 | else { |
903 | CIO_MSG_EVENT(2, "Huh? 0.%x.%04x: unsolicited " | 901 | CIO_MSG_EVENT(0, "0.%x.%04x: unsolicited " |
904 | "interrupt during w4sense...\n", | 902 | "interrupt during w4sense...\n", |
905 | cdev->private->dev_id.ssid, | 903 | cdev->private->dev_id.ssid, |
906 | cdev->private->dev_id.devno); | 904 | cdev->private->dev_id.devno); |
@@ -1169,8 +1167,10 @@ ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event) | |||
1169 | static void | 1167 | static void |
1170 | ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event) | 1168 | ccw_device_bug(struct ccw_device *cdev, enum dev_event dev_event) |
1171 | { | 1169 | { |
1172 | CIO_MSG_EVENT(0, "dev_jumptable[%i][%i] == NULL\n", | 1170 | CIO_MSG_EVENT(0, "Internal state [%i][%i] not handled for device " |
1173 | cdev->private->state, dev_event); | 1171 | "0.%x.%04x\n", cdev->private->state, dev_event, |
1172 | cdev->private->dev_id.ssid, | ||
1173 | cdev->private->dev_id.devno); | ||
1174 | BUG(); | 1174 | BUG(); |
1175 | } | 1175 | } |
1176 | 1176 | ||
diff --git a/drivers/s390/cio/device_id.c b/drivers/s390/cio/device_id.c index dc4d87f77f6c..cba7020517ed 100644 --- a/drivers/s390/cio/device_id.c +++ b/drivers/s390/cio/device_id.c | |||
@@ -214,7 +214,7 @@ ccw_device_check_sense_id(struct ccw_device *cdev) | |||
214 | * sense id information. So, for intervention required, | 214 | * sense id information. So, for intervention required, |
215 | * we use the "whack it until it talks" strategy... | 215 | * we use the "whack it until it talks" strategy... |
216 | */ | 216 | */ |
217 | CIO_MSG_EVENT(2, "SenseID : device %04x on Subchannel " | 217 | CIO_MSG_EVENT(0, "SenseID : device %04x on Subchannel " |
218 | "0.%x.%04x reports cmd reject\n", | 218 | "0.%x.%04x reports cmd reject\n", |
219 | cdev->private->dev_id.devno, sch->schid.ssid, | 219 | cdev->private->dev_id.devno, sch->schid.ssid, |
220 | sch->schid.sch_no); | 220 | sch->schid.sch_no); |
@@ -239,7 +239,7 @@ ccw_device_check_sense_id(struct ccw_device *cdev) | |||
239 | 239 | ||
240 | lpm = to_io_private(sch)->orb.lpm; | 240 | lpm = to_io_private(sch)->orb.lpm; |
241 | if ((lpm & sch->schib.pmcw.pim & sch->schib.pmcw.pam) != 0) | 241 | if ((lpm & sch->schib.pmcw.pim & sch->schib.pmcw.pam) != 0) |
242 | CIO_MSG_EVENT(2, "SenseID : path %02X for device %04x " | 242 | CIO_MSG_EVENT(4, "SenseID : path %02X for device %04x " |
243 | "on subchannel 0.%x.%04x is " | 243 | "on subchannel 0.%x.%04x is " |
244 | "'not operational'\n", lpm, | 244 | "'not operational'\n", lpm, |
245 | cdev->private->dev_id.devno, | 245 | cdev->private->dev_id.devno, |
diff --git a/drivers/s390/cio/device_pgid.c b/drivers/s390/cio/device_pgid.c index c52449a1f9fc..ba559053402e 100644 --- a/drivers/s390/cio/device_pgid.c +++ b/drivers/s390/cio/device_pgid.c | |||
@@ -79,7 +79,7 @@ __ccw_device_sense_pgid_start(struct ccw_device *cdev) | |||
79 | /* ret is 0, -EBUSY, -EACCES or -ENODEV */ | 79 | /* ret is 0, -EBUSY, -EACCES or -ENODEV */ |
80 | if (ret != -EACCES) | 80 | if (ret != -EACCES) |
81 | return ret; | 81 | return ret; |
82 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel " | 82 | CIO_MSG_EVENT(3, "SNID - Device %04x on Subchannel " |
83 | "0.%x.%04x, lpm %02X, became 'not " | 83 | "0.%x.%04x, lpm %02X, became 'not " |
84 | "operational'\n", | 84 | "operational'\n", |
85 | cdev->private->dev_id.devno, | 85 | cdev->private->dev_id.devno, |
@@ -159,7 +159,7 @@ __ccw_device_check_sense_pgid(struct ccw_device *cdev) | |||
159 | u8 lpm; | 159 | u8 lpm; |
160 | 160 | ||
161 | lpm = to_io_private(sch)->orb.lpm; | 161 | lpm = to_io_private(sch)->orb.lpm; |
162 | CIO_MSG_EVENT(2, "SNID - Device %04x on Subchannel 0.%x.%04x," | 162 | CIO_MSG_EVENT(3, "SNID - Device %04x on Subchannel 0.%x.%04x," |
163 | " lpm %02X, became 'not operational'\n", | 163 | " lpm %02X, became 'not operational'\n", |
164 | cdev->private->dev_id.devno, sch->schid.ssid, | 164 | cdev->private->dev_id.devno, sch->schid.ssid, |
165 | sch->schid.sch_no, lpm); | 165 | sch->schid.sch_no, lpm); |
@@ -275,7 +275,7 @@ __ccw_device_do_pgid(struct ccw_device *cdev, __u8 func) | |||
275 | return ret; | 275 | return ret; |
276 | } | 276 | } |
277 | /* PGID command failed on this path. */ | 277 | /* PGID command failed on this path. */ |
278 | CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel " | 278 | CIO_MSG_EVENT(3, "SPID - Device %04x on Subchannel " |
279 | "0.%x.%04x, lpm %02X, became 'not operational'\n", | 279 | "0.%x.%04x, lpm %02X, became 'not operational'\n", |
280 | cdev->private->dev_id.devno, sch->schid.ssid, | 280 | cdev->private->dev_id.devno, sch->schid.ssid, |
281 | sch->schid.sch_no, cdev->private->imask); | 281 | sch->schid.sch_no, cdev->private->imask); |
@@ -317,7 +317,7 @@ static int __ccw_device_do_nop(struct ccw_device *cdev) | |||
317 | return ret; | 317 | return ret; |
318 | } | 318 | } |
319 | /* nop command failed on this path. */ | 319 | /* nop command failed on this path. */ |
320 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel " | 320 | CIO_MSG_EVENT(3, "NOP - Device %04x on Subchannel " |
321 | "0.%x.%04x, lpm %02X, became 'not operational'\n", | 321 | "0.%x.%04x, lpm %02X, became 'not operational'\n", |
322 | cdev->private->dev_id.devno, sch->schid.ssid, | 322 | cdev->private->dev_id.devno, sch->schid.ssid, |
323 | sch->schid.sch_no, cdev->private->imask); | 323 | sch->schid.sch_no, cdev->private->imask); |
@@ -362,7 +362,7 @@ __ccw_device_check_pgid(struct ccw_device *cdev) | |||
362 | return -EAGAIN; | 362 | return -EAGAIN; |
363 | } | 363 | } |
364 | if (irb->scsw.cc == 3) { | 364 | if (irb->scsw.cc == 3) { |
365 | CIO_MSG_EVENT(2, "SPID - Device %04x on Subchannel 0.%x.%04x," | 365 | CIO_MSG_EVENT(3, "SPID - Device %04x on Subchannel 0.%x.%04x," |
366 | " lpm %02X, became 'not operational'\n", | 366 | " lpm %02X, became 'not operational'\n", |
367 | cdev->private->dev_id.devno, sch->schid.ssid, | 367 | cdev->private->dev_id.devno, sch->schid.ssid, |
368 | sch->schid.sch_no, cdev->private->imask); | 368 | sch->schid.sch_no, cdev->private->imask); |
@@ -391,7 +391,7 @@ static int __ccw_device_check_nop(struct ccw_device *cdev) | |||
391 | return -ETIME; | 391 | return -ETIME; |
392 | } | 392 | } |
393 | if (irb->scsw.cc == 3) { | 393 | if (irb->scsw.cc == 3) { |
394 | CIO_MSG_EVENT(2, "NOP - Device %04x on Subchannel 0.%x.%04x," | 394 | CIO_MSG_EVENT(3, "NOP - Device %04x on Subchannel 0.%x.%04x," |
395 | " lpm %02X, became 'not operational'\n", | 395 | " lpm %02X, became 'not operational'\n", |
396 | cdev->private->dev_id.devno, sch->schid.ssid, | 396 | cdev->private->dev_id.devno, sch->schid.ssid, |
397 | sch->schid.sch_no, cdev->private->imask); | 397 | sch->schid.sch_no, cdev->private->imask); |
diff --git a/drivers/s390/s390mach.c b/drivers/s390/s390mach.c index 4d4b54277c43..5080f343ad74 100644 --- a/drivers/s390/s390mach.c +++ b/drivers/s390/s390mach.c | |||
@@ -48,10 +48,11 @@ s390_collect_crw_info(void *param) | |||
48 | int ccode; | 48 | int ccode; |
49 | struct semaphore *sem; | 49 | struct semaphore *sem; |
50 | unsigned int chain; | 50 | unsigned int chain; |
51 | int ignore; | ||
51 | 52 | ||
52 | sem = (struct semaphore *)param; | 53 | sem = (struct semaphore *)param; |
53 | repeat: | 54 | repeat: |
54 | down_interruptible(sem); | 55 | ignore = down_interruptible(sem); |
55 | chain = 0; | 56 | chain = 0; |
56 | while (1) { | 57 | while (1) { |
57 | if (unlikely(chain > 1)) { | 58 | if (unlikely(chain > 1)) { |
diff --git a/drivers/sbus/char/bpp.c b/drivers/sbus/char/bpp.c index 4fab0c23814c..b87037ec9805 100644 --- a/drivers/sbus/char/bpp.c +++ b/drivers/sbus/char/bpp.c | |||
@@ -41,7 +41,7 @@ | |||
41 | #define BPP_DELAY 100 | 41 | #define BPP_DELAY 100 |
42 | 42 | ||
43 | static const unsigned BPP_MAJOR = LP_MAJOR; | 43 | static const unsigned BPP_MAJOR = LP_MAJOR; |
44 | static const char* dev_name = "bpp"; | 44 | static const char *bpp_dev_name = "bpp"; |
45 | 45 | ||
46 | /* When switching from compatibility to a mode where I can read, try | 46 | /* When switching from compatibility to a mode where I can read, try |
47 | the following mode first. */ | 47 | the following mode first. */ |
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index 46d7e400c8be..81ccbd7f9e34 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
@@ -1679,6 +1679,7 @@ config MAC_SCSI | |||
1679 | config SCSI_MAC_ESP | 1679 | config SCSI_MAC_ESP |
1680 | tristate "Macintosh NCR53c9[46] SCSI" | 1680 | tristate "Macintosh NCR53c9[46] SCSI" |
1681 | depends on MAC && SCSI | 1681 | depends on MAC && SCSI |
1682 | select SCSI_SPI_ATTRS | ||
1682 | help | 1683 | help |
1683 | This is the NCR 53c9x SCSI controller found on most of the 68040 | 1684 | This is the NCR 53c9x SCSI controller found on most of the 68040 |
1684 | based Macintoshes. | 1685 | based Macintoshes. |
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c index f5215fd4b73d..1dca1775f4b1 100644 --- a/drivers/scsi/aha152x.c +++ b/drivers/scsi/aha152x.c | |||
@@ -3830,7 +3830,7 @@ static int __init aha152x_init(void) | |||
3830 | iounmap(p); | 3830 | iounmap(p); |
3831 | } | 3831 | } |
3832 | if (!ok && setup_count == 0) | 3832 | if (!ok && setup_count == 0) |
3833 | return 0; | 3833 | return -ENODEV; |
3834 | 3834 | ||
3835 | printk(KERN_INFO "aha152x: BIOS test: passed, "); | 3835 | printk(KERN_INFO "aha152x: BIOS test: passed, "); |
3836 | #else | 3836 | #else |
@@ -3909,14 +3909,14 @@ static int __init aha152x_init(void) | |||
3909 | #endif | 3909 | #endif |
3910 | } | 3910 | } |
3911 | 3911 | ||
3912 | return 1; | 3912 | return 0; |
3913 | } | 3913 | } |
3914 | 3914 | ||
3915 | static void __exit aha152x_exit(void) | 3915 | static void __exit aha152x_exit(void) |
3916 | { | 3916 | { |
3917 | struct aha152x_hostdata *hd; | 3917 | struct aha152x_hostdata *hd, *tmp; |
3918 | 3918 | ||
3919 | list_for_each_entry(hd, &aha152x_host_list, host_list) { | 3919 | list_for_each_entry_safe(hd, tmp, &aha152x_host_list, host_list) { |
3920 | struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); | 3920 | struct Scsi_Host *shost = container_of((void *)hd, struct Scsi_Host, hostdata); |
3921 | 3921 | ||
3922 | aha152x_release(shost); | 3922 | aha152x_release(shost); |
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c index 0fb5bf4c43ac..8508816f303d 100644 --- a/drivers/scsi/dpt_i2o.c +++ b/drivers/scsi/dpt_i2o.c | |||
@@ -1967,45 +1967,6 @@ cleanup: | |||
1967 | return rcode; | 1967 | return rcode; |
1968 | } | 1968 | } |
1969 | 1969 | ||
1970 | |||
1971 | /* | ||
1972 | * This routine returns information about the system. This does not effect | ||
1973 | * any logic and if the info is wrong - it doesn't matter. | ||
1974 | */ | ||
1975 | |||
1976 | /* Get all the info we can not get from kernel services */ | ||
1977 | static int adpt_system_info(void __user *buffer) | ||
1978 | { | ||
1979 | sysInfo_S si; | ||
1980 | |||
1981 | memset(&si, 0, sizeof(si)); | ||
1982 | |||
1983 | si.osType = OS_LINUX; | ||
1984 | si.osMajorVersion = 0; | ||
1985 | si.osMinorVersion = 0; | ||
1986 | si.osRevision = 0; | ||
1987 | si.busType = SI_PCI_BUS; | ||
1988 | si.processorFamily = DPTI_sig.dsProcessorFamily; | ||
1989 | |||
1990 | #if defined __i386__ | ||
1991 | adpt_i386_info(&si); | ||
1992 | #elif defined (__ia64__) | ||
1993 | adpt_ia64_info(&si); | ||
1994 | #elif defined(__sparc__) | ||
1995 | adpt_sparc_info(&si); | ||
1996 | #elif defined (__alpha__) | ||
1997 | adpt_alpha_info(&si); | ||
1998 | #else | ||
1999 | si.processorType = 0xff ; | ||
2000 | #endif | ||
2001 | if(copy_to_user(buffer, &si, sizeof(si))){ | ||
2002 | printk(KERN_WARNING"dpti: Could not copy buffer TO user\n"); | ||
2003 | return -EFAULT; | ||
2004 | } | ||
2005 | |||
2006 | return 0; | ||
2007 | } | ||
2008 | |||
2009 | #if defined __ia64__ | 1970 | #if defined __ia64__ |
2010 | static void adpt_ia64_info(sysInfo_S* si) | 1971 | static void adpt_ia64_info(sysInfo_S* si) |
2011 | { | 1972 | { |
@@ -2016,7 +1977,6 @@ static void adpt_ia64_info(sysInfo_S* si) | |||
2016 | } | 1977 | } |
2017 | #endif | 1978 | #endif |
2018 | 1979 | ||
2019 | |||
2020 | #if defined __sparc__ | 1980 | #if defined __sparc__ |
2021 | static void adpt_sparc_info(sysInfo_S* si) | 1981 | static void adpt_sparc_info(sysInfo_S* si) |
2022 | { | 1982 | { |
@@ -2026,7 +1986,6 @@ static void adpt_sparc_info(sysInfo_S* si) | |||
2026 | si->processorType = PROC_ULTRASPARC; | 1986 | si->processorType = PROC_ULTRASPARC; |
2027 | } | 1987 | } |
2028 | #endif | 1988 | #endif |
2029 | |||
2030 | #if defined __alpha__ | 1989 | #if defined __alpha__ |
2031 | static void adpt_alpha_info(sysInfo_S* si) | 1990 | static void adpt_alpha_info(sysInfo_S* si) |
2032 | { | 1991 | { |
@@ -2038,7 +1997,6 @@ static void adpt_alpha_info(sysInfo_S* si) | |||
2038 | #endif | 1997 | #endif |
2039 | 1998 | ||
2040 | #if defined __i386__ | 1999 | #if defined __i386__ |
2041 | |||
2042 | static void adpt_i386_info(sysInfo_S* si) | 2000 | static void adpt_i386_info(sysInfo_S* si) |
2043 | { | 2001 | { |
2044 | // This is all the info we need for now | 2002 | // This is all the info we need for now |
@@ -2059,9 +2017,45 @@ static void adpt_i386_info(sysInfo_S* si) | |||
2059 | break; | 2017 | break; |
2060 | } | 2018 | } |
2061 | } | 2019 | } |
2020 | #endif | ||
2021 | |||
2022 | /* | ||
2023 | * This routine returns information about the system. This does not effect | ||
2024 | * any logic and if the info is wrong - it doesn't matter. | ||
2025 | */ | ||
2062 | 2026 | ||
2027 | /* Get all the info we can not get from kernel services */ | ||
2028 | static int adpt_system_info(void __user *buffer) | ||
2029 | { | ||
2030 | sysInfo_S si; | ||
2031 | |||
2032 | memset(&si, 0, sizeof(si)); | ||
2033 | |||
2034 | si.osType = OS_LINUX; | ||
2035 | si.osMajorVersion = 0; | ||
2036 | si.osMinorVersion = 0; | ||
2037 | si.osRevision = 0; | ||
2038 | si.busType = SI_PCI_BUS; | ||
2039 | si.processorFamily = DPTI_sig.dsProcessorFamily; | ||
2040 | |||
2041 | #if defined __i386__ | ||
2042 | adpt_i386_info(&si); | ||
2043 | #elif defined (__ia64__) | ||
2044 | adpt_ia64_info(&si); | ||
2045 | #elif defined(__sparc__) | ||
2046 | adpt_sparc_info(&si); | ||
2047 | #elif defined (__alpha__) | ||
2048 | adpt_alpha_info(&si); | ||
2049 | #else | ||
2050 | si.processorType = 0xff ; | ||
2063 | #endif | 2051 | #endif |
2052 | if (copy_to_user(buffer, &si, sizeof(si))){ | ||
2053 | printk(KERN_WARNING"dpti: Could not copy buffer TO user\n"); | ||
2054 | return -EFAULT; | ||
2055 | } | ||
2064 | 2056 | ||
2057 | return 0; | ||
2058 | } | ||
2065 | 2059 | ||
2066 | static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, | 2060 | static int adpt_ioctl(struct inode *inode, struct file *file, uint cmd, |
2067 | ulong arg) | 2061 | ulong arg) |
diff --git a/drivers/scsi/dpti.h b/drivers/scsi/dpti.h index 924cd5a51676..337746d46043 100644 --- a/drivers/scsi/dpti.h +++ b/drivers/scsi/dpti.h | |||
@@ -316,19 +316,6 @@ static int adpt_close(struct inode *inode, struct file *file); | |||
316 | static void adpt_delay(int millisec); | 316 | static void adpt_delay(int millisec); |
317 | #endif | 317 | #endif |
318 | 318 | ||
319 | #if defined __ia64__ | ||
320 | static void adpt_ia64_info(sysInfo_S* si); | ||
321 | #endif | ||
322 | #if defined __sparc__ | ||
323 | static void adpt_sparc_info(sysInfo_S* si); | ||
324 | #endif | ||
325 | #if defined __alpha__ | ||
326 | static void adpt_sparc_info(sysInfo_S* si); | ||
327 | #endif | ||
328 | #if defined __i386__ | ||
329 | static void adpt_i386_info(sysInfo_S* si); | ||
330 | #endif | ||
331 | |||
332 | #define PRINT_BUFFER_SIZE 512 | 319 | #define PRINT_BUFFER_SIZE 512 |
333 | 320 | ||
334 | #define HBA_FLAGS_DBG_FLAGS_MASK 0xffff0000 // Mask for debug flags | 321 | #define HBA_FLAGS_DBG_FLAGS_MASK 0xffff0000 // Mask for debug flags |
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 8e2e964af668..46771d4c81bd 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -550,7 +550,6 @@ static int __init gdth_search_isa(ulong32 bios_adr) | |||
550 | #endif /* CONFIG_ISA */ | 550 | #endif /* CONFIG_ISA */ |
551 | 551 | ||
552 | #ifdef CONFIG_PCI | 552 | #ifdef CONFIG_PCI |
553 | static bool gdth_pci_registered; | ||
554 | 553 | ||
555 | static bool gdth_search_vortex(ushort device) | 554 | static bool gdth_search_vortex(ushort device) |
556 | { | 555 | { |
@@ -3724,6 +3723,8 @@ static void gdth_log_event(gdth_evt_data *dvr, char *buffer) | |||
3724 | } | 3723 | } |
3725 | 3724 | ||
3726 | #ifdef GDTH_STATISTICS | 3725 | #ifdef GDTH_STATISTICS |
3726 | static unchar gdth_timer_running; | ||
3727 | |||
3727 | static void gdth_timeout(ulong data) | 3728 | static void gdth_timeout(ulong data) |
3728 | { | 3729 | { |
3729 | ulong32 i; | 3730 | ulong32 i; |
@@ -3731,7 +3732,10 @@ static void gdth_timeout(ulong data) | |||
3731 | gdth_ha_str *ha; | 3732 | gdth_ha_str *ha; |
3732 | ulong flags; | 3733 | ulong flags; |
3733 | 3734 | ||
3734 | BUG_ON(list_empty(&gdth_instances)); | 3735 | if(unlikely(list_empty(&gdth_instances))) { |
3736 | gdth_timer_running = 0; | ||
3737 | return; | ||
3738 | } | ||
3735 | 3739 | ||
3736 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); | 3740 | ha = list_first_entry(&gdth_instances, gdth_ha_str, list); |
3737 | spin_lock_irqsave(&ha->smp_lock, flags); | 3741 | spin_lock_irqsave(&ha->smp_lock, flags); |
@@ -3751,6 +3755,22 @@ static void gdth_timeout(ulong data) | |||
3751 | add_timer(&gdth_timer); | 3755 | add_timer(&gdth_timer); |
3752 | spin_unlock_irqrestore(&ha->smp_lock, flags); | 3756 | spin_unlock_irqrestore(&ha->smp_lock, flags); |
3753 | } | 3757 | } |
3758 | |||
3759 | static void gdth_timer_init(void) | ||
3760 | { | ||
3761 | if (gdth_timer_running) | ||
3762 | return; | ||
3763 | gdth_timer_running = 1; | ||
3764 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
3765 | gdth_timer.expires = jiffies + HZ; | ||
3766 | gdth_timer.data = 0L; | ||
3767 | gdth_timer.function = gdth_timeout; | ||
3768 | add_timer(&gdth_timer); | ||
3769 | } | ||
3770 | #else | ||
3771 | static inline void gdth_timer_init(void) | ||
3772 | { | ||
3773 | } | ||
3754 | #endif | 3774 | #endif |
3755 | 3775 | ||
3756 | static void __init internal_setup(char *str,int *ints) | 3776 | static void __init internal_setup(char *str,int *ints) |
@@ -4735,6 +4755,7 @@ static int __init gdth_isa_probe_one(ulong32 isa_bios) | |||
4735 | if (error) | 4755 | if (error) |
4736 | goto out_free_coal_stat; | 4756 | goto out_free_coal_stat; |
4737 | list_add_tail(&ha->list, &gdth_instances); | 4757 | list_add_tail(&ha->list, &gdth_instances); |
4758 | gdth_timer_init(); | ||
4738 | 4759 | ||
4739 | scsi_scan_host(shp); | 4760 | scsi_scan_host(shp); |
4740 | 4761 | ||
@@ -4865,6 +4886,7 @@ static int __init gdth_eisa_probe_one(ushort eisa_slot) | |||
4865 | if (error) | 4886 | if (error) |
4866 | goto out_free_coal_stat; | 4887 | goto out_free_coal_stat; |
4867 | list_add_tail(&ha->list, &gdth_instances); | 4888 | list_add_tail(&ha->list, &gdth_instances); |
4889 | gdth_timer_init(); | ||
4868 | 4890 | ||
4869 | scsi_scan_host(shp); | 4891 | scsi_scan_host(shp); |
4870 | 4892 | ||
@@ -5011,6 +5033,7 @@ static int gdth_pci_probe_one(gdth_pci_str *pcistr, | |||
5011 | list_add_tail(&ha->list, &gdth_instances); | 5033 | list_add_tail(&ha->list, &gdth_instances); |
5012 | 5034 | ||
5013 | pci_set_drvdata(ha->pdev, ha); | 5035 | pci_set_drvdata(ha->pdev, ha); |
5036 | gdth_timer_init(); | ||
5014 | 5037 | ||
5015 | scsi_scan_host(shp); | 5038 | scsi_scan_host(shp); |
5016 | 5039 | ||
@@ -5110,6 +5133,7 @@ static int __init gdth_init(void) | |||
5110 | /* initializations */ | 5133 | /* initializations */ |
5111 | gdth_polling = TRUE; | 5134 | gdth_polling = TRUE; |
5112 | gdth_clear_events(); | 5135 | gdth_clear_events(); |
5136 | init_timer(&gdth_timer); | ||
5113 | 5137 | ||
5114 | /* As default we do not probe for EISA or ISA controllers */ | 5138 | /* As default we do not probe for EISA or ISA controllers */ |
5115 | if (probe_eisa_isa) { | 5139 | if (probe_eisa_isa) { |
@@ -5132,23 +5156,17 @@ static int __init gdth_init(void) | |||
5132 | 5156 | ||
5133 | #ifdef CONFIG_PCI | 5157 | #ifdef CONFIG_PCI |
5134 | /* scanning for PCI controllers */ | 5158 | /* scanning for PCI controllers */ |
5135 | if (pci_register_driver(&gdth_pci_driver) == 0) | 5159 | if (pci_register_driver(&gdth_pci_driver)) { |
5136 | gdth_pci_registered = true; | 5160 | gdth_ha_str *ha; |
5161 | |||
5162 | list_for_each_entry(ha, &gdth_instances, list) | ||
5163 | gdth_remove_one(ha); | ||
5164 | return -ENODEV; | ||
5165 | } | ||
5137 | #endif /* CONFIG_PCI */ | 5166 | #endif /* CONFIG_PCI */ |
5138 | 5167 | ||
5139 | TRACE2(("gdth_detect() %d controller detected\n", gdth_ctr_count)); | 5168 | TRACE2(("gdth_detect() %d controller detected\n", gdth_ctr_count)); |
5140 | 5169 | ||
5141 | if (list_empty(&gdth_instances)) | ||
5142 | return -ENODEV; | ||
5143 | |||
5144 | #ifdef GDTH_STATISTICS | ||
5145 | TRACE2(("gdth_detect(): Initializing timer !\n")); | ||
5146 | init_timer(&gdth_timer); | ||
5147 | gdth_timer.expires = jiffies + HZ; | ||
5148 | gdth_timer.data = 0L; | ||
5149 | gdth_timer.function = gdth_timeout; | ||
5150 | add_timer(&gdth_timer); | ||
5151 | #endif | ||
5152 | major = register_chrdev(0,"gdth", &gdth_fops); | 5170 | major = register_chrdev(0,"gdth", &gdth_fops); |
5153 | register_reboot_notifier(&gdth_notifier); | 5171 | register_reboot_notifier(&gdth_notifier); |
5154 | gdth_polling = FALSE; | 5172 | gdth_polling = FALSE; |
@@ -5167,8 +5185,7 @@ static void __exit gdth_exit(void) | |||
5167 | #endif | 5185 | #endif |
5168 | 5186 | ||
5169 | #ifdef CONFIG_PCI | 5187 | #ifdef CONFIG_PCI |
5170 | if (gdth_pci_registered) | 5188 | pci_unregister_driver(&gdth_pci_driver); |
5171 | pci_unregister_driver(&gdth_pci_driver); | ||
5172 | #endif | 5189 | #endif |
5173 | 5190 | ||
5174 | list_for_each_entry(ha, &gdth_instances, list) | 5191 | list_for_each_entry(ha, &gdth_instances, list) |
diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 010c1b9b178c..b43bf1d60dac 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c | |||
@@ -730,7 +730,9 @@ static int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr, | |||
730 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, | 730 | if (iscsi_recv_pdu(conn->cls_conn, hdr, data, |
731 | datalen)) | 731 | datalen)) |
732 | rc = ISCSI_ERR_CONN_FAILED; | 732 | rc = ISCSI_ERR_CONN_FAILED; |
733 | } | 733 | } else |
734 | mod_timer(&conn->transport_timer, | ||
735 | jiffies + conn->recv_timeout); | ||
734 | iscsi_free_mgmt_task(conn, mtask); | 736 | iscsi_free_mgmt_task(conn, mtask); |
735 | break; | 737 | break; |
736 | default: | 738 | default: |
@@ -1453,19 +1455,20 @@ static void iscsi_check_transport_timeouts(unsigned long data) | |||
1453 | { | 1455 | { |
1454 | struct iscsi_conn *conn = (struct iscsi_conn *)data; | 1456 | struct iscsi_conn *conn = (struct iscsi_conn *)data; |
1455 | struct iscsi_session *session = conn->session; | 1457 | struct iscsi_session *session = conn->session; |
1456 | unsigned long timeout, next_timeout = 0, last_recv; | 1458 | unsigned long recv_timeout, next_timeout = 0, last_recv; |
1457 | 1459 | ||
1458 | spin_lock(&session->lock); | 1460 | spin_lock(&session->lock); |
1459 | if (session->state != ISCSI_STATE_LOGGED_IN) | 1461 | if (session->state != ISCSI_STATE_LOGGED_IN) |
1460 | goto done; | 1462 | goto done; |
1461 | 1463 | ||
1462 | timeout = conn->recv_timeout; | 1464 | recv_timeout = conn->recv_timeout; |
1463 | if (!timeout) | 1465 | if (!recv_timeout) |
1464 | goto done; | 1466 | goto done; |
1465 | 1467 | ||
1466 | timeout *= HZ; | 1468 | recv_timeout *= HZ; |
1467 | last_recv = conn->last_recv; | 1469 | last_recv = conn->last_recv; |
1468 | if (time_before_eq(last_recv + timeout + (conn->ping_timeout * HZ), | 1470 | if (conn->ping_mtask && |
1471 | time_before_eq(conn->last_ping + (conn->ping_timeout * HZ), | ||
1469 | jiffies)) { | 1472 | jiffies)) { |
1470 | iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " | 1473 | iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs " |
1471 | "expired, last rx %lu, last ping %lu, " | 1474 | "expired, last rx %lu, last ping %lu, " |
@@ -1476,15 +1479,13 @@ static void iscsi_check_transport_timeouts(unsigned long data) | |||
1476 | return; | 1479 | return; |
1477 | } | 1480 | } |
1478 | 1481 | ||
1479 | if (time_before_eq(last_recv + timeout, jiffies)) { | 1482 | if (time_before_eq(last_recv + recv_timeout, jiffies)) { |
1480 | if (time_before_eq(conn->last_ping, last_recv)) { | 1483 | /* send a ping to try to provoke some traffic */ |
1481 | /* send a ping to try to provoke some traffic */ | 1484 | debug_scsi("Sending nopout as ping on conn %p\n", conn); |
1482 | debug_scsi("Sending nopout as ping on conn %p\n", conn); | 1485 | iscsi_send_nopout(conn, NULL); |
1483 | iscsi_send_nopout(conn, NULL); | 1486 | next_timeout = conn->last_ping + (conn->ping_timeout * HZ); |
1484 | } | ||
1485 | next_timeout = last_recv + timeout + (conn->ping_timeout * HZ); | ||
1486 | } else | 1487 | } else |
1487 | next_timeout = last_recv + timeout; | 1488 | next_timeout = last_recv + recv_timeout; |
1488 | 1489 | ||
1489 | debug_scsi("Setting next tmo %lu\n", next_timeout); | 1490 | debug_scsi("Setting next tmo %lu\n", next_timeout); |
1490 | mod_timer(&conn->transport_timer, next_timeout); | 1491 | mod_timer(&conn->transport_timer, next_timeout); |
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c index fa060932d2b4..51e2f299dbbb 100644 --- a/drivers/scsi/qla1280.c +++ b/drivers/scsi/qla1280.c | |||
@@ -2007,7 +2007,7 @@ qla1280_set_defaults(struct scsi_qla_host *ha) | |||
2007 | nv->bus[bus].config_2.req_ack_active_negation = 1; | 2007 | nv->bus[bus].config_2.req_ack_active_negation = 1; |
2008 | nv->bus[bus].config_2.data_line_active_negation = 1; | 2008 | nv->bus[bus].config_2.data_line_active_negation = 1; |
2009 | nv->bus[bus].selection_timeout = 250; | 2009 | nv->bus[bus].selection_timeout = 250; |
2010 | nv->bus[bus].max_queue_depth = 256; | 2010 | nv->bus[bus].max_queue_depth = 32; |
2011 | 2011 | ||
2012 | if (IS_ISP1040(ha)) { | 2012 | if (IS_ISP1040(ha)) { |
2013 | nv->bus[bus].bus_reset_delay = 3; | 2013 | nv->bus[bus].bus_reset_delay = 3; |
@@ -2051,7 +2051,7 @@ qla1280_config_target(struct scsi_qla_host *ha, int bus, int target) | |||
2051 | status = qla1280_mailbox_command(ha, 0x0f, mb); | 2051 | status = qla1280_mailbox_command(ha, 0x0f, mb); |
2052 | 2052 | ||
2053 | /* Save Tag queuing enable flag. */ | 2053 | /* Save Tag queuing enable flag. */ |
2054 | flag = (BIT_0 << target) & mb[0]; | 2054 | flag = (BIT_0 << target); |
2055 | if (nv->bus[bus].target[target].parameter.tag_queuing) | 2055 | if (nv->bus[bus].target[target].parameter.tag_queuing) |
2056 | ha->bus_settings[bus].qtag_enables |= flag; | 2056 | ha->bus_settings[bus].qtag_enables |= flag; |
2057 | 2057 | ||
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index 36acbcca2d48..62e6eb136a3c 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -976,11 +976,15 @@ config SERIAL_68328_RTS_CTS | |||
976 | depends on SERIAL_68328 | 976 | depends on SERIAL_68328 |
977 | 977 | ||
978 | config SERIAL_COLDFIRE | 978 | config SERIAL_COLDFIRE |
979 | bool "ColdFire serial support" | 979 | bool "ColdFire serial support (DEPRECATED)" |
980 | depends on COLDFIRE | 980 | depends on COLDFIRE |
981 | help | 981 | help |
982 | This driver supports the built-in serial ports of the Motorola ColdFire | 982 | This driver supports the built-in serial ports of the Motorola ColdFire |
983 | family of CPUs. | 983 | family of CPUs. |
984 | This driver is deprecated because it supports only the old interface | ||
985 | for serial drivers and features like magic keys are not working. | ||
986 | Please switch to the new style driver because this driver will be | ||
987 | removed soon. | ||
984 | 988 | ||
985 | config SERIAL_MCF | 989 | config SERIAL_MCF |
986 | bool "Coldfire serial support (new style driver)" | 990 | bool "Coldfire serial support (new style driver)" |
diff --git a/drivers/serial/bfin_5xx.c b/drivers/serial/bfin_5xx.c index 8a2f6a1baa74..d6b4ead693b7 100644 --- a/drivers/serial/bfin_5xx.c +++ b/drivers/serial/bfin_5xx.c | |||
@@ -65,9 +65,6 @@ static void bfin_serial_stop_tx(struct uart_port *port) | |||
65 | { | 65 | { |
66 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; | 66 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; |
67 | struct circ_buf *xmit = &uart->port.info->xmit; | 67 | struct circ_buf *xmit = &uart->port.info->xmit; |
68 | #if !defined(CONFIG_BF54x) && !defined(CONFIG_SERIAL_BFIN_DMA) | ||
69 | unsigned short ier; | ||
70 | #endif | ||
71 | 68 | ||
72 | while (!(UART_GET_LSR(uart) & TEMT)) | 69 | while (!(UART_GET_LSR(uart) & TEMT)) |
73 | cpu_relax(); | 70 | cpu_relax(); |
@@ -82,12 +79,8 @@ static void bfin_serial_stop_tx(struct uart_port *port) | |||
82 | #ifdef CONFIG_BF54x | 79 | #ifdef CONFIG_BF54x |
83 | /* Clear TFI bit */ | 80 | /* Clear TFI bit */ |
84 | UART_PUT_LSR(uart, TFI); | 81 | UART_PUT_LSR(uart, TFI); |
85 | UART_CLEAR_IER(uart, ETBEI); | ||
86 | #else | ||
87 | ier = UART_GET_IER(uart); | ||
88 | ier &= ~ETBEI; | ||
89 | UART_PUT_IER(uart, ier); | ||
90 | #endif | 82 | #endif |
83 | UART_CLEAR_IER(uart, ETBEI); | ||
91 | #endif | 84 | #endif |
92 | } | 85 | } |
93 | 86 | ||
@@ -102,14 +95,7 @@ static void bfin_serial_start_tx(struct uart_port *port) | |||
102 | if (uart->tx_done) | 95 | if (uart->tx_done) |
103 | bfin_serial_dma_tx_chars(uart); | 96 | bfin_serial_dma_tx_chars(uart); |
104 | #else | 97 | #else |
105 | #ifdef CONFIG_BF54x | ||
106 | UART_SET_IER(uart, ETBEI); | 98 | UART_SET_IER(uart, ETBEI); |
107 | #else | ||
108 | unsigned short ier; | ||
109 | ier = UART_GET_IER(uart); | ||
110 | ier |= ETBEI; | ||
111 | UART_PUT_IER(uart, ier); | ||
112 | #endif | ||
113 | bfin_serial_tx_chars(uart); | 99 | bfin_serial_tx_chars(uart); |
114 | #endif | 100 | #endif |
115 | } | 101 | } |
@@ -120,21 +106,10 @@ static void bfin_serial_start_tx(struct uart_port *port) | |||
120 | static void bfin_serial_stop_rx(struct uart_port *port) | 106 | static void bfin_serial_stop_rx(struct uart_port *port) |
121 | { | 107 | { |
122 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; | 108 | struct bfin_serial_port *uart = (struct bfin_serial_port *)port; |
123 | #ifdef CONFIG_KGDB_UART | 109 | #ifdef CONFIG_KGDB_UART |
124 | if (uart->port.line != CONFIG_KGDB_UART_PORT) { | 110 | if (uart->port.line != CONFIG_KGDB_UART_PORT) |
125 | #endif | 111 | #endif |
126 | #ifdef CONFIG_BF54x | ||
127 | UART_CLEAR_IER(uart, ERBFI); | 112 | UART_CLEAR_IER(uart, ERBFI); |
128 | #else | ||
129 | unsigned short ier; | ||
130 | |||
131 | ier = UART_GET_IER(uart); | ||
132 | ier &= ~ERBFI; | ||
133 | UART_PUT_IER(uart, ier); | ||
134 | #endif | ||
135 | #ifdef CONFIG_KGDB_UART | ||
136 | } | ||
137 | #endif | ||
138 | } | 113 | } |
139 | 114 | ||
140 | /* | 115 | /* |
@@ -161,10 +136,7 @@ void kgdb_put_debug_char(int chr) | |||
161 | SSYNC(); | 136 | SSYNC(); |
162 | } | 137 | } |
163 | 138 | ||
164 | #ifndef CONFIG_BF54x | 139 | UART_CLEAR_DLAB(uart); |
165 | UART_PUT_LCR(uart, UART_GET_LCR(uart)&(~DLAB)); | ||
166 | SSYNC(); | ||
167 | #endif | ||
168 | UART_PUT_CHAR(uart, (unsigned char)chr); | 140 | UART_PUT_CHAR(uart, (unsigned char)chr); |
169 | SSYNC(); | 141 | SSYNC(); |
170 | } | 142 | } |
@@ -183,10 +155,7 @@ int kgdb_get_debug_char(void) | |||
183 | while(!(UART_GET_LSR(uart) & DR)) { | 155 | while(!(UART_GET_LSR(uart) & DR)) { |
184 | SSYNC(); | 156 | SSYNC(); |
185 | } | 157 | } |
186 | #ifndef CONFIG_BF54x | 158 | UART_CLEAR_DLAB(uart); |
187 | UART_PUT_LCR(uart, UART_GET_LCR(uart)&(~DLAB)); | ||
188 | SSYNC(); | ||
189 | #endif | ||
190 | chr = UART_GET_CHAR(uart); | 159 | chr = UART_GET_CHAR(uart); |
191 | SSYNC(); | 160 | SSYNC(); |
192 | 161 | ||
@@ -208,9 +177,6 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart) | |||
208 | struct tty_struct *tty = uart->port.info->tty; | 177 | struct tty_struct *tty = uart->port.info->tty; |
209 | unsigned int status, ch, flg; | 178 | unsigned int status, ch, flg; |
210 | static struct timeval anomaly_start = { .tv_sec = 0 }; | 179 | static struct timeval anomaly_start = { .tv_sec = 0 }; |
211 | #ifdef CONFIG_KGDB_UART | ||
212 | struct pt_regs *regs = get_irq_regs(); | ||
213 | #endif | ||
214 | 180 | ||
215 | status = UART_GET_LSR(uart); | 181 | status = UART_GET_LSR(uart); |
216 | UART_CLEAR_LSR(uart); | 182 | UART_CLEAR_LSR(uart); |
@@ -220,6 +186,7 @@ static void bfin_serial_rx_chars(struct bfin_serial_port *uart) | |||
220 | 186 | ||
221 | #ifdef CONFIG_KGDB_UART | 187 | #ifdef CONFIG_KGDB_UART |
222 | if (uart->port.line == CONFIG_KGDB_UART_PORT) { | 188 | if (uart->port.line == CONFIG_KGDB_UART_PORT) { |
189 | struct pt_regs *regs = get_irq_regs(); | ||
223 | if (uart->port.cons->index == CONFIG_KGDB_UART_PORT && ch == 0x1) { /* Ctrl + A */ | 190 | if (uart->port.cons->index == CONFIG_KGDB_UART_PORT && ch == 0x1) { /* Ctrl + A */ |
224 | kgdb_breakkey_pressed(regs); | 191 | kgdb_breakkey_pressed(regs); |
225 | return; | 192 | return; |
@@ -391,7 +358,6 @@ static void bfin_serial_do_work(struct work_struct *work) | |||
391 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | 358 | static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) |
392 | { | 359 | { |
393 | struct circ_buf *xmit = &uart->port.info->xmit; | 360 | struct circ_buf *xmit = &uart->port.info->xmit; |
394 | unsigned short ier; | ||
395 | 361 | ||
396 | uart->tx_done = 0; | 362 | uart->tx_done = 0; |
397 | 363 | ||
@@ -429,13 +395,7 @@ static void bfin_serial_dma_tx_chars(struct bfin_serial_port *uart) | |||
429 | set_dma_x_modify(uart->tx_dma_channel, 1); | 395 | set_dma_x_modify(uart->tx_dma_channel, 1); |
430 | enable_dma(uart->tx_dma_channel); | 396 | enable_dma(uart->tx_dma_channel); |
431 | 397 | ||
432 | #ifdef CONFIG_BF54x | ||
433 | UART_SET_IER(uart, ETBEI); | 398 | UART_SET_IER(uart, ETBEI); |
434 | #else | ||
435 | ier = UART_GET_IER(uart); | ||
436 | ier |= ETBEI; | ||
437 | UART_PUT_IER(uart, ier); | ||
438 | #endif | ||
439 | } | 399 | } |
440 | 400 | ||
441 | static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) | 401 | static void bfin_serial_dma_rx_chars(struct bfin_serial_port *uart) |
@@ -513,19 +473,12 @@ static irqreturn_t bfin_serial_dma_tx_int(int irq, void *dev_id) | |||
513 | { | 473 | { |
514 | struct bfin_serial_port *uart = dev_id; | 474 | struct bfin_serial_port *uart = dev_id; |
515 | struct circ_buf *xmit = &uart->port.info->xmit; | 475 | struct circ_buf *xmit = &uart->port.info->xmit; |
516 | unsigned short ier; | ||
517 | 476 | ||
518 | spin_lock(&uart->port.lock); | 477 | spin_lock(&uart->port.lock); |
519 | if (!(get_dma_curr_irqstat(uart->tx_dma_channel)&DMA_RUN)) { | 478 | if (!(get_dma_curr_irqstat(uart->tx_dma_channel)&DMA_RUN)) { |
520 | disable_dma(uart->tx_dma_channel); | 479 | disable_dma(uart->tx_dma_channel); |
521 | clear_dma_irqstat(uart->tx_dma_channel); | 480 | clear_dma_irqstat(uart->tx_dma_channel); |
522 | #ifdef CONFIG_BF54x | ||
523 | UART_CLEAR_IER(uart, ETBEI); | 481 | UART_CLEAR_IER(uart, ETBEI); |
524 | #else | ||
525 | ier = UART_GET_IER(uart); | ||
526 | ier &= ~ETBEI; | ||
527 | UART_PUT_IER(uart, ier); | ||
528 | #endif | ||
529 | xmit->tail = (xmit->tail + uart->tx_count) & (UART_XMIT_SIZE - 1); | 482 | xmit->tail = (xmit->tail + uart->tx_count) & (UART_XMIT_SIZE - 1); |
530 | uart->port.icount.tx += uart->tx_count; | 483 | uart->port.icount.tx += uart->tx_count; |
531 | 484 | ||
@@ -701,7 +654,6 @@ static int bfin_serial_startup(struct uart_port *port) | |||
701 | # endif | 654 | # endif |
702 | } | 655 | } |
703 | 656 | ||
704 | |||
705 | if (request_irq | 657 | if (request_irq |
706 | (uart->port.irq+1, bfin_serial_tx_int, IRQF_DISABLED, | 658 | (uart->port.irq+1, bfin_serial_tx_int, IRQF_DISABLED, |
707 | "BFIN_UART_TX", uart)) { | 659 | "BFIN_UART_TX", uart)) { |
@@ -710,11 +662,7 @@ static int bfin_serial_startup(struct uart_port *port) | |||
710 | return -EBUSY; | 662 | return -EBUSY; |
711 | } | 663 | } |
712 | #endif | 664 | #endif |
713 | #ifdef CONFIG_BF54x | ||
714 | UART_SET_IER(uart, ERBFI); | 665 | UART_SET_IER(uart, ERBFI); |
715 | #else | ||
716 | UART_PUT_IER(uart, UART_GET_IER(uart) | ERBFI); | ||
717 | #endif | ||
718 | return 0; | 666 | return 0; |
719 | } | 667 | } |
720 | 668 | ||
@@ -810,26 +758,15 @@ bfin_serial_set_termios(struct uart_port *port, struct ktermios *termios, | |||
810 | UART_PUT_IER(uart, 0); | 758 | UART_PUT_IER(uart, 0); |
811 | #endif | 759 | #endif |
812 | 760 | ||
813 | #ifndef CONFIG_BF54x | ||
814 | /* Set DLAB in LCR to Access DLL and DLH */ | 761 | /* Set DLAB in LCR to Access DLL and DLH */ |
815 | val = UART_GET_LCR(uart); | 762 | UART_SET_DLAB(uart); |
816 | val |= DLAB; | ||
817 | UART_PUT_LCR(uart, val); | ||
818 | SSYNC(); | ||
819 | #endif | ||
820 | 763 | ||
821 | UART_PUT_DLL(uart, quot & 0xFF); | 764 | UART_PUT_DLL(uart, quot & 0xFF); |
822 | SSYNC(); | ||
823 | UART_PUT_DLH(uart, (quot >> 8) & 0xFF); | 765 | UART_PUT_DLH(uart, (quot >> 8) & 0xFF); |
824 | SSYNC(); | 766 | SSYNC(); |
825 | 767 | ||
826 | #ifndef CONFIG_BF54x | ||
827 | /* Clear DLAB in LCR to Access THR RBR IER */ | 768 | /* Clear DLAB in LCR to Access THR RBR IER */ |
828 | val = UART_GET_LCR(uart); | 769 | UART_CLEAR_DLAB(uart); |
829 | val &= ~DLAB; | ||
830 | UART_PUT_LCR(uart, val); | ||
831 | SSYNC(); | ||
832 | #endif | ||
833 | 770 | ||
834 | UART_PUT_LCR(uart, lcr); | 771 | UART_PUT_LCR(uart, lcr); |
835 | 772 | ||
@@ -992,8 +929,7 @@ bfin_serial_console_get_options(struct bfin_serial_port *uart, int *baud, | |||
992 | status = UART_GET_IER(uart) & (ERBFI | ETBEI); | 929 | status = UART_GET_IER(uart) & (ERBFI | ETBEI); |
993 | if (status == (ERBFI | ETBEI)) { | 930 | if (status == (ERBFI | ETBEI)) { |
994 | /* ok, the port was enabled */ | 931 | /* ok, the port was enabled */ |
995 | unsigned short lcr, val; | 932 | u16 lcr, dlh, dll; |
996 | unsigned short dlh, dll; | ||
997 | 933 | ||
998 | lcr = UART_GET_LCR(uart); | 934 | lcr = UART_GET_LCR(uart); |
999 | 935 | ||
@@ -1010,22 +946,14 @@ bfin_serial_console_get_options(struct bfin_serial_port *uart, int *baud, | |||
1010 | case 2: *bits = 7; break; | 946 | case 2: *bits = 7; break; |
1011 | case 3: *bits = 8; break; | 947 | case 3: *bits = 8; break; |
1012 | } | 948 | } |
1013 | #ifndef CONFIG_BF54x | ||
1014 | /* Set DLAB in LCR to Access DLL and DLH */ | 949 | /* Set DLAB in LCR to Access DLL and DLH */ |
1015 | val = UART_GET_LCR(uart); | 950 | UART_SET_DLAB(uart); |
1016 | val |= DLAB; | ||
1017 | UART_PUT_LCR(uart, val); | ||
1018 | #endif | ||
1019 | 951 | ||
1020 | dll = UART_GET_DLL(uart); | 952 | dll = UART_GET_DLL(uart); |
1021 | dlh = UART_GET_DLH(uart); | 953 | dlh = UART_GET_DLH(uart); |
1022 | 954 | ||
1023 | #ifndef CONFIG_BF54x | ||
1024 | /* Clear DLAB in LCR to Access THR RBR IER */ | 955 | /* Clear DLAB in LCR to Access THR RBR IER */ |
1025 | val = UART_GET_LCR(uart); | 956 | UART_CLEAR_DLAB(uart); |
1026 | val &= ~DLAB; | ||
1027 | UART_PUT_LCR(uart, val); | ||
1028 | #endif | ||
1029 | 957 | ||
1030 | *baud = get_sclk() / (16*(dll | dlh << 8)); | 958 | *baud = get_sclk() / (16*(dll | dlh << 8)); |
1031 | } | 959 | } |
@@ -1290,11 +1218,7 @@ static int __init bfin_serial_init(void) | |||
1290 | request_irq(uart->port.irq, bfin_serial_rx_int, | 1218 | request_irq(uart->port.irq, bfin_serial_rx_int, |
1291 | IRQF_DISABLED, "BFIN_UART_RX", uart); | 1219 | IRQF_DISABLED, "BFIN_UART_RX", uart); |
1292 | pr_info("Request irq for kgdb uart port\n"); | 1220 | pr_info("Request irq for kgdb uart port\n"); |
1293 | #ifdef CONFIG_BF54x | ||
1294 | UART_SET_IER(uart, ERBFI); | 1221 | UART_SET_IER(uart, ERBFI); |
1295 | #else | ||
1296 | UART_PUT_IER(uart, UART_GET_IER(uart) | ERBFI); | ||
1297 | #endif | ||
1298 | SSYNC(); | 1222 | SSYNC(); |
1299 | t.c_cflag = CS8|B57600; | 1223 | t.c_cflag = CS8|B57600; |
1300 | t.c_iflag = 0; | 1224 | t.c_iflag = 0; |
diff --git a/drivers/serial/crisv10.c b/drivers/serial/crisv10.c index f9fa237aa949..3e0366eab412 100644 --- a/drivers/serial/crisv10.c +++ b/drivers/serial/crisv10.c | |||
@@ -3808,7 +3808,7 @@ rs_close(struct tty_struct *tty, struct file * filp) | |||
3808 | 3808 | ||
3809 | shutdown(info); | 3809 | shutdown(info); |
3810 | rs_flush_buffer(tty); | 3810 | rs_flush_buffer(tty); |
3811 | tty_ldisc_flush_buffer(tty); | 3811 | tty_ldisc_flush(tty); |
3812 | tty->closing = 0; | 3812 | tty->closing = 0; |
3813 | info->event = 0; | 3813 | info->event = 0; |
3814 | info->tty = 0; | 3814 | info->tty = 0; |
diff --git a/drivers/serial/mcfserial.c b/drivers/serial/mcfserial.c index 43af40d59b8a..56007cc8a9b3 100644 --- a/drivers/serial/mcfserial.c +++ b/drivers/serial/mcfserial.c | |||
@@ -1,3 +1,4 @@ | |||
1 | #warning This driver is deprecated. Check Kconfig for details. | ||
1 | /* | 2 | /* |
2 | * mcfserial.c -- serial driver for ColdFire internal UARTS. | 3 | * mcfserial.c -- serial driver for ColdFire internal UARTS. |
3 | * | 4 | * |
diff --git a/drivers/serial/serial_core.c b/drivers/serial/serial_core.c index 1e2b9d826f69..eab032733790 100644 --- a/drivers/serial/serial_core.c +++ b/drivers/serial/serial_core.c | |||
@@ -556,7 +556,7 @@ static int uart_chars_in_buffer(struct tty_struct *tty) | |||
556 | static void uart_flush_buffer(struct tty_struct *tty) | 556 | static void uart_flush_buffer(struct tty_struct *tty) |
557 | { | 557 | { |
558 | struct uart_state *state = tty->driver_data; | 558 | struct uart_state *state = tty->driver_data; |
559 | struct uart_port *port = state->port; | 559 | struct uart_port *port; |
560 | unsigned long flags; | 560 | unsigned long flags; |
561 | 561 | ||
562 | /* | 562 | /* |
@@ -568,6 +568,7 @@ static void uart_flush_buffer(struct tty_struct *tty) | |||
568 | return; | 568 | return; |
569 | } | 569 | } |
570 | 570 | ||
571 | port = state->port; | ||
571 | pr_debug("uart_flush_buffer(%d) called\n", tty->index); | 572 | pr_debug("uart_flush_buffer(%d) called\n", tty->index); |
572 | 573 | ||
573 | spin_lock_irqsave(&port->lock, flags); | 574 | spin_lock_irqsave(&port->lock, flags); |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index 969106187718..8fdafc27fce8 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -42,14 +42,12 @@ | |||
42 | #include <linux/console.h> | 42 | #include <linux/console.h> |
43 | #include <linux/platform_device.h> | 43 | #include <linux/platform_device.h> |
44 | #include <linux/serial_sci.h> | 44 | #include <linux/serial_sci.h> |
45 | |||
46 | #ifdef CONFIG_CPU_FREQ | ||
47 | #include <linux/notifier.h> | 45 | #include <linux/notifier.h> |
48 | #include <linux/cpufreq.h> | 46 | #include <linux/cpufreq.h> |
49 | #endif | 47 | #include <linux/clk.h> |
50 | |||
51 | #if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64) | ||
52 | #include <linux/ctype.h> | 48 | #include <linux/ctype.h> |
49 | |||
50 | #ifdef CONFIG_SUPERH | ||
53 | #include <asm/clock.h> | 51 | #include <asm/clock.h> |
54 | #include <asm/sh_bios.h> | 52 | #include <asm/sh_bios.h> |
55 | #include <asm/kgdb.h> | 53 | #include <asm/kgdb.h> |
@@ -80,7 +78,7 @@ struct sci_port { | |||
80 | struct timer_list break_timer; | 78 | struct timer_list break_timer; |
81 | int break_flag; | 79 | int break_flag; |
82 | 80 | ||
83 | #if defined(CONFIG_SUPERH) && !defined(CONFIG_SUPERH64) | 81 | #ifdef CONFIG_SUPERH |
84 | /* Port clock */ | 82 | /* Port clock */ |
85 | struct clk *clk; | 83 | struct clk *clk; |
86 | #endif | 84 | #endif |
@@ -365,21 +363,19 @@ static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | |||
365 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) | 363 | static void sci_init_pins_scif(struct uart_port *port, unsigned int cflag) |
366 | { | 364 | { |
367 | unsigned int fcr_val = 0; | 365 | unsigned int fcr_val = 0; |
366 | unsigned short data; | ||
368 | 367 | ||
369 | if (cflag & CRTSCTS) { | 368 | if (port->mapbase == 0xffe00000) { |
370 | fcr_val |= SCFCR_MCE; | 369 | data = ctrl_inw(PSCR); |
371 | 370 | data &= ~0x03cf; | |
372 | ctrl_outw(0x0000, PORT_PSCR); | 371 | if (cflag & CRTSCTS) |
373 | } else { | 372 | fcr_val |= SCFCR_MCE; |
374 | unsigned short data; | 373 | else |
375 | 374 | data |= 0x0340; | |
376 | data = ctrl_inw(PORT_PSCR); | ||
377 | data &= 0x033f; | ||
378 | data |= 0x0400; | ||
379 | ctrl_outw(data, PORT_PSCR); | ||
380 | 375 | ||
381 | ctrl_outw(ctrl_inw(SCSPTR0) & 0x17, SCSPTR0); | 376 | ctrl_outw(data, PSCR); |
382 | } | 377 | } |
378 | /* SCIF1 and SCIF2 should be setup by board code */ | ||
383 | 379 | ||
384 | sci_out(port, SCFCR, fcr_val); | 380 | sci_out(port, SCFCR, fcr_val); |
385 | } | 381 | } |
diff --git a/drivers/serial/sh-sci.h b/drivers/serial/sh-sci.h index fa8700a968fc..eb84833233fd 100644 --- a/drivers/serial/sh-sci.h +++ b/drivers/serial/sh-sci.h | |||
@@ -76,12 +76,13 @@ | |||
76 | # define SCSCR_INIT(port) 0x32 /* TIE=0,RIE=0,TE=1,RE=1,REIE=0,CKE=1 */ | 76 | # define SCSCR_INIT(port) 0x32 /* TIE=0,RIE=0,TE=1,RE=1,REIE=0,CKE=1 */ |
77 | # define SCIF_ONLY | 77 | # define SCIF_ONLY |
78 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) | 78 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) |
79 | # define SCPDR0 0xA405013E /* 16 bit SCIF0 PSDR */ | 79 | # define PADR 0xA4050120 |
80 | # define SCSPTR0 SCPDR0 | 80 | # define PSDR 0xA405013e |
81 | # define PWDR 0xA4050166 | ||
82 | # define PSCR 0xA405011E | ||
81 | # define SCIF_ORER 0x0001 /* overrun error bit */ | 83 | # define SCIF_ORER 0x0001 /* overrun error bit */ |
82 | # define SCSCR_INIT(port) 0x0038 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ | 84 | # define SCSCR_INIT(port) 0x0038 /* TIE=0,RIE=0,TE=1,RE=1,REIE=1 */ |
83 | # define SCIF_ONLY | 85 | # define SCIF_ONLY |
84 | # define PORT_PSCR 0xA405011E | ||
85 | #elif defined(CONFIG_CPU_SUBTYPE_SH7366) | 86 | #elif defined(CONFIG_CPU_SUBTYPE_SH7366) |
86 | # define SCPDR0 0xA405013E /* 16 bit SCIF0 PSDR */ | 87 | # define SCPDR0 0xA405013E /* 16 bit SCIF0 PSDR */ |
87 | # define SCSPTR0 SCPDR0 | 88 | # define SCSPTR0 SCPDR0 |
@@ -320,7 +321,7 @@ | |||
320 | unsigned int addr = port->mapbase + (offset); \ | 321 | unsigned int addr = port->mapbase + (offset); \ |
321 | if ((size) == 8) { \ | 322 | if ((size) == 8) { \ |
322 | ctrl_outb(value, addr); \ | 323 | ctrl_outb(value, addr); \ |
323 | } else { \ | 324 | } else if ((size) == 16) { \ |
324 | ctrl_outw(value, addr); \ | 325 | ctrl_outw(value, addr); \ |
325 | } | 326 | } |
326 | 327 | ||
@@ -451,7 +452,11 @@ SCIF_FNS(SCSPTR, 0, 0, 0x24, 16) | |||
451 | SCIF_FNS(SCLSR, 0, 0, 0x28, 16) | 452 | SCIF_FNS(SCLSR, 0, 0, 0x28, 16) |
452 | #else | 453 | #else |
453 | SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16) | 454 | SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16) |
455 | #if defined(CONFIG_CPU_SUBTYPE_SH7722) | ||
456 | SCIF_FNS(SCSPTR, 0, 0, 0, 0) | ||
457 | #else | ||
454 | SCIF_FNS(SCSPTR, 0, 0, 0x20, 16) | 458 | SCIF_FNS(SCSPTR, 0, 0, 0x20, 16) |
459 | #endif | ||
455 | SCIF_FNS(SCLSR, 0, 0, 0x24, 16) | 460 | SCIF_FNS(SCLSR, 0, 0, 0x24, 16) |
456 | #endif | 461 | #endif |
457 | #endif | 462 | #endif |
@@ -593,13 +598,25 @@ static inline int sci_rxd_in(struct uart_port *port) | |||
593 | return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ | 598 | return ctrl_inw(SCSPTR3) & 0x0001 ? 1 : 0; /* SCIF */ |
594 | return 1; | 599 | return 1; |
595 | } | 600 | } |
596 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) || defined(CONFIG_CPU_SUBTYPE_SH7366) | 601 | #elif defined(CONFIG_CPU_SUBTYPE_SH7366) |
597 | static inline int sci_rxd_in(struct uart_port *port) | 602 | static inline int sci_rxd_in(struct uart_port *port) |
598 | { | 603 | { |
599 | if (port->mapbase == 0xffe00000) | 604 | if (port->mapbase == 0xffe00000) |
600 | return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */ | 605 | return ctrl_inb(SCPDR0) & 0x0001 ? 1 : 0; /* SCIF0 */ |
601 | return 1; | 606 | return 1; |
602 | } | 607 | } |
608 | #elif defined(CONFIG_CPU_SUBTYPE_SH7722) | ||
609 | static inline int sci_rxd_in(struct uart_port *port) | ||
610 | { | ||
611 | if (port->mapbase == 0xffe00000) | ||
612 | return ctrl_inb(PSDR) & 0x02 ? 1 : 0; /* SCIF0 */ | ||
613 | if (port->mapbase == 0xffe10000) | ||
614 | return ctrl_inb(PADR) & 0x40 ? 1 : 0; /* SCIF1 */ | ||
615 | if (port->mapbase == 0xffe20000) | ||
616 | return ctrl_inb(PWDR) & 0x04 ? 1 : 0; /* SCIF2 */ | ||
617 | |||
618 | return 1; | ||
619 | } | ||
603 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) | 620 | #elif defined(CONFIG_CPU_SUBTYPE_SH7723) |
604 | static inline int sci_rxd_in(struct uart_port *port) | 621 | static inline int sci_rxd_in(struct uart_port *port) |
605 | { | 622 | { |
diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig index fae9e8f3d092..66ec5d8808de 100644 --- a/drivers/spi/Kconfig +++ b/drivers/spi/Kconfig | |||
@@ -126,7 +126,6 @@ config SPI_MPC52xx_PSC | |||
126 | config SPI_MPC83xx | 126 | config SPI_MPC83xx |
127 | tristate "Freescale MPC83xx/QUICC Engine SPI controller" | 127 | tristate "Freescale MPC83xx/QUICC Engine SPI controller" |
128 | depends on SPI_MASTER && (PPC_83xx || QUICC_ENGINE) && EXPERIMENTAL | 128 | depends on SPI_MASTER && (PPC_83xx || QUICC_ENGINE) && EXPERIMENTAL |
129 | select SPI_BITBANG | ||
130 | help | 129 | help |
131 | This enables using the Freescale MPC83xx and QUICC Engine SPI | 130 | This enables using the Freescale MPC83xx and QUICC Engine SPI |
132 | controllers in master mode. | 131 | controllers in master mode. |
diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c index 90729469d481..681d62325d3d 100644 --- a/drivers/spi/mpc52xx_psc_spi.c +++ b/drivers/spi/mpc52xx_psc_spi.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * MPC52xx SPC in SPI mode driver. | 2 | * MPC52xx PSC in SPI mode driver. |
3 | * | 3 | * |
4 | * Maintainer: Dragos Carp | 4 | * Maintainer: Dragos Carp |
5 | * | 5 | * |
diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c index 654bb58be630..0c452c46ab07 100644 --- a/drivers/spi/pxa2xx_spi.c +++ b/drivers/spi/pxa2xx_spi.c | |||
@@ -1567,7 +1567,7 @@ static int pxa2xx_spi_resume(struct platform_device *pdev) | |||
1567 | int status = 0; | 1567 | int status = 0; |
1568 | 1568 | ||
1569 | /* Enable the SSP clock */ | 1569 | /* Enable the SSP clock */ |
1570 | clk_disable(ssp->clk); | 1570 | clk_enable(ssp->clk); |
1571 | 1571 | ||
1572 | /* Start the queue running */ | 1572 | /* Start the queue running */ |
1573 | status = start_queue(drv_data); | 1573 | status = start_queue(drv_data); |
diff --git a/drivers/spi/spi_mpc83xx.c b/drivers/spi/spi_mpc83xx.c index 189f706b9e4b..6832da6f7109 100644 --- a/drivers/spi/spi_mpc83xx.c +++ b/drivers/spi/spi_mpc83xx.c | |||
@@ -49,6 +49,7 @@ struct mpc83xx_spi_reg { | |||
49 | #define SPMODE_LEN(x) ((x) << 20) | 49 | #define SPMODE_LEN(x) ((x) << 20) |
50 | #define SPMODE_PM(x) ((x) << 16) | 50 | #define SPMODE_PM(x) ((x) << 16) |
51 | #define SPMODE_OP (1 << 14) | 51 | #define SPMODE_OP (1 << 14) |
52 | #define SPMODE_CG(x) ((x) << 7) | ||
52 | 53 | ||
53 | /* | 54 | /* |
54 | * Default for SPI Mode: | 55 | * Default for SPI Mode: |
@@ -67,10 +68,6 @@ struct mpc83xx_spi_reg { | |||
67 | 68 | ||
68 | /* SPI Controller driver's private data. */ | 69 | /* SPI Controller driver's private data. */ |
69 | struct mpc83xx_spi { | 70 | struct mpc83xx_spi { |
70 | /* bitbang has to be first */ | ||
71 | struct spi_bitbang bitbang; | ||
72 | struct completion done; | ||
73 | |||
74 | struct mpc83xx_spi_reg __iomem *base; | 71 | struct mpc83xx_spi_reg __iomem *base; |
75 | 72 | ||
76 | /* rx & tx bufs from the spi_transfer */ | 73 | /* rx & tx bufs from the spi_transfer */ |
@@ -82,7 +79,7 @@ struct mpc83xx_spi { | |||
82 | u32(*get_tx) (struct mpc83xx_spi *); | 79 | u32(*get_tx) (struct mpc83xx_spi *); |
83 | 80 | ||
84 | unsigned int count; | 81 | unsigned int count; |
85 | u32 irq; | 82 | int irq; |
86 | 83 | ||
87 | unsigned nsecs; /* (clock cycle time)/2 */ | 84 | unsigned nsecs; /* (clock cycle time)/2 */ |
88 | 85 | ||
@@ -94,6 +91,25 @@ struct mpc83xx_spi { | |||
94 | 91 | ||
95 | void (*activate_cs) (u8 cs, u8 polarity); | 92 | void (*activate_cs) (u8 cs, u8 polarity); |
96 | void (*deactivate_cs) (u8 cs, u8 polarity); | 93 | void (*deactivate_cs) (u8 cs, u8 polarity); |
94 | |||
95 | u8 busy; | ||
96 | |||
97 | struct workqueue_struct *workqueue; | ||
98 | struct work_struct work; | ||
99 | |||
100 | struct list_head queue; | ||
101 | spinlock_t lock; | ||
102 | |||
103 | struct completion done; | ||
104 | }; | ||
105 | |||
106 | struct spi_mpc83xx_cs { | ||
107 | /* functions to deal with different sized buffers */ | ||
108 | void (*get_rx) (u32 rx_data, struct mpc83xx_spi *); | ||
109 | u32 (*get_tx) (struct mpc83xx_spi *); | ||
110 | u32 rx_shift; /* RX data reg shift when in qe mode */ | ||
111 | u32 tx_shift; /* TX data reg shift when in qe mode */ | ||
112 | u32 hw_mode; /* Holds HW mode register settings */ | ||
97 | }; | 113 | }; |
98 | 114 | ||
99 | static inline void mpc83xx_spi_write_reg(__be32 __iomem * reg, u32 val) | 115 | static inline void mpc83xx_spi_write_reg(__be32 __iomem * reg, u32 val) |
@@ -137,6 +153,7 @@ static void mpc83xx_spi_chipselect(struct spi_device *spi, int value) | |||
137 | { | 153 | { |
138 | struct mpc83xx_spi *mpc83xx_spi; | 154 | struct mpc83xx_spi *mpc83xx_spi; |
139 | u8 pol = spi->mode & SPI_CS_HIGH ? 1 : 0; | 155 | u8 pol = spi->mode & SPI_CS_HIGH ? 1 : 0; |
156 | struct spi_mpc83xx_cs *cs = spi->controller_state; | ||
140 | 157 | ||
141 | mpc83xx_spi = spi_master_get_devdata(spi->master); | 158 | mpc83xx_spi = spi_master_get_devdata(spi->master); |
142 | 159 | ||
@@ -147,50 +164,26 @@ static void mpc83xx_spi_chipselect(struct spi_device *spi, int value) | |||
147 | 164 | ||
148 | if (value == BITBANG_CS_ACTIVE) { | 165 | if (value == BITBANG_CS_ACTIVE) { |
149 | u32 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); | 166 | u32 regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); |
150 | u32 len = spi->bits_per_word; | ||
151 | u8 pm; | ||
152 | 167 | ||
153 | if (len == 32) | 168 | mpc83xx_spi->rx_shift = cs->rx_shift; |
154 | len = 0; | 169 | mpc83xx_spi->tx_shift = cs->tx_shift; |
155 | else | 170 | mpc83xx_spi->get_rx = cs->get_rx; |
156 | len = len - 1; | 171 | mpc83xx_spi->get_tx = cs->get_tx; |
157 | 172 | ||
158 | /* mask out bits we are going to set */ | 173 | if (cs->hw_mode != regval) { |
159 | regval &= ~(SPMODE_CP_BEGIN_EDGECLK | SPMODE_CI_INACTIVEHIGH | 174 | unsigned long flags; |
160 | | SPMODE_LEN(0xF) | SPMODE_DIV16 | 175 | void *tmp_ptr = &mpc83xx_spi->base->mode; |
161 | | SPMODE_PM(0xF) | SPMODE_REV | SPMODE_LOOP); | 176 | |
162 | 177 | regval = cs->hw_mode; | |
163 | if (spi->mode & SPI_CPHA) | 178 | /* Turn off IRQs locally to minimize time that |
164 | regval |= SPMODE_CP_BEGIN_EDGECLK; | 179 | * SPI is disabled |
165 | if (spi->mode & SPI_CPOL) | 180 | */ |
166 | regval |= SPMODE_CI_INACTIVEHIGH; | 181 | local_irq_save(flags); |
167 | if (!(spi->mode & SPI_LSB_FIRST)) | 182 | /* Turn off SPI unit prior changing mode */ |
168 | regval |= SPMODE_REV; | 183 | mpc83xx_spi_write_reg(tmp_ptr, regval & ~SPMODE_ENABLE); |
169 | if (spi->mode & SPI_LOOP) | 184 | mpc83xx_spi_write_reg(tmp_ptr, regval); |
170 | regval |= SPMODE_LOOP; | 185 | local_irq_restore(flags); |
171 | |||
172 | regval |= SPMODE_LEN(len); | ||
173 | |||
174 | if ((mpc83xx_spi->spibrg / spi->max_speed_hz) >= 64) { | ||
175 | pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 64) - 1; | ||
176 | if (pm > 0x0f) { | ||
177 | dev_err(&spi->dev, "Requested speed is too " | ||
178 | "low: %d Hz. Will use %d Hz instead.\n", | ||
179 | spi->max_speed_hz, | ||
180 | mpc83xx_spi->spibrg / 1024); | ||
181 | pm = 0x0f; | ||
182 | } | ||
183 | regval |= SPMODE_PM(pm) | SPMODE_DIV16; | ||
184 | } else { | ||
185 | pm = mpc83xx_spi->spibrg / (spi->max_speed_hz * 4); | ||
186 | if (pm) | ||
187 | pm--; | ||
188 | regval |= SPMODE_PM(pm); | ||
189 | } | 186 | } |
190 | |||
191 | /* Turn off SPI unit prior changing mode */ | ||
192 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, 0); | ||
193 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, regval); | ||
194 | if (mpc83xx_spi->activate_cs) | 187 | if (mpc83xx_spi->activate_cs) |
195 | mpc83xx_spi->activate_cs(spi->chip_select, pol); | 188 | mpc83xx_spi->activate_cs(spi->chip_select, pol); |
196 | } | 189 | } |
@@ -201,8 +194,9 @@ int mpc83xx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
201 | { | 194 | { |
202 | struct mpc83xx_spi *mpc83xx_spi; | 195 | struct mpc83xx_spi *mpc83xx_spi; |
203 | u32 regval; | 196 | u32 regval; |
204 | u8 bits_per_word; | 197 | u8 bits_per_word, pm; |
205 | u32 hz; | 198 | u32 hz; |
199 | struct spi_mpc83xx_cs *cs = spi->controller_state; | ||
206 | 200 | ||
207 | mpc83xx_spi = spi_master_get_devdata(spi->master); | 201 | mpc83xx_spi = spi_master_get_devdata(spi->master); |
208 | 202 | ||
@@ -223,61 +217,191 @@ int mpc83xx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
223 | || ((bits_per_word > 16) && (bits_per_word != 32))) | 217 | || ((bits_per_word > 16) && (bits_per_word != 32))) |
224 | return -EINVAL; | 218 | return -EINVAL; |
225 | 219 | ||
226 | mpc83xx_spi->rx_shift = 0; | 220 | if (!hz) |
227 | mpc83xx_spi->tx_shift = 0; | 221 | hz = spi->max_speed_hz; |
222 | |||
223 | cs->rx_shift = 0; | ||
224 | cs->tx_shift = 0; | ||
228 | if (bits_per_word <= 8) { | 225 | if (bits_per_word <= 8) { |
229 | mpc83xx_spi->get_rx = mpc83xx_spi_rx_buf_u8; | 226 | cs->get_rx = mpc83xx_spi_rx_buf_u8; |
230 | mpc83xx_spi->get_tx = mpc83xx_spi_tx_buf_u8; | 227 | cs->get_tx = mpc83xx_spi_tx_buf_u8; |
231 | if (mpc83xx_spi->qe_mode) { | 228 | if (mpc83xx_spi->qe_mode) { |
232 | mpc83xx_spi->rx_shift = 16; | 229 | cs->rx_shift = 16; |
233 | mpc83xx_spi->tx_shift = 24; | 230 | cs->tx_shift = 24; |
234 | } | 231 | } |
235 | } else if (bits_per_word <= 16) { | 232 | } else if (bits_per_word <= 16) { |
236 | mpc83xx_spi->get_rx = mpc83xx_spi_rx_buf_u16; | 233 | cs->get_rx = mpc83xx_spi_rx_buf_u16; |
237 | mpc83xx_spi->get_tx = mpc83xx_spi_tx_buf_u16; | 234 | cs->get_tx = mpc83xx_spi_tx_buf_u16; |
238 | if (mpc83xx_spi->qe_mode) { | 235 | if (mpc83xx_spi->qe_mode) { |
239 | mpc83xx_spi->rx_shift = 16; | 236 | cs->rx_shift = 16; |
240 | mpc83xx_spi->tx_shift = 16; | 237 | cs->tx_shift = 16; |
241 | } | 238 | } |
242 | } else if (bits_per_word <= 32) { | 239 | } else if (bits_per_word <= 32) { |
243 | mpc83xx_spi->get_rx = mpc83xx_spi_rx_buf_u32; | 240 | cs->get_rx = mpc83xx_spi_rx_buf_u32; |
244 | mpc83xx_spi->get_tx = mpc83xx_spi_tx_buf_u32; | 241 | cs->get_tx = mpc83xx_spi_tx_buf_u32; |
245 | } else | 242 | } else |
246 | return -EINVAL; | 243 | return -EINVAL; |
247 | 244 | ||
248 | if (mpc83xx_spi->qe_mode && spi->mode & SPI_LSB_FIRST) { | 245 | if (mpc83xx_spi->qe_mode && spi->mode & SPI_LSB_FIRST) { |
249 | mpc83xx_spi->tx_shift = 0; | 246 | cs->tx_shift = 0; |
250 | if (bits_per_word <= 8) | 247 | if (bits_per_word <= 8) |
251 | mpc83xx_spi->rx_shift = 8; | 248 | cs->rx_shift = 8; |
252 | else | 249 | else |
253 | mpc83xx_spi->rx_shift = 0; | 250 | cs->rx_shift = 0; |
254 | } | 251 | } |
255 | 252 | ||
256 | /* nsecs = (clock period)/2 */ | 253 | mpc83xx_spi->rx_shift = cs->rx_shift; |
257 | if (!hz) | 254 | mpc83xx_spi->tx_shift = cs->tx_shift; |
258 | hz = spi->max_speed_hz; | 255 | mpc83xx_spi->get_rx = cs->get_rx; |
259 | mpc83xx_spi->nsecs = (1000000000 / 2) / hz; | 256 | mpc83xx_spi->get_tx = cs->get_tx; |
260 | if (mpc83xx_spi->nsecs > MAX_UDELAY_MS * 1000) | ||
261 | return -EINVAL; | ||
262 | 257 | ||
263 | if (bits_per_word == 32) | 258 | if (bits_per_word == 32) |
264 | bits_per_word = 0; | 259 | bits_per_word = 0; |
265 | else | 260 | else |
266 | bits_per_word = bits_per_word - 1; | 261 | bits_per_word = bits_per_word - 1; |
267 | 262 | ||
268 | regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); | ||
269 | |||
270 | /* mask out bits we are going to set */ | 263 | /* mask out bits we are going to set */ |
271 | regval &= ~(SPMODE_LEN(0xF) | SPMODE_REV); | 264 | cs->hw_mode &= ~(SPMODE_LEN(0xF) | SPMODE_DIV16 |
272 | regval |= SPMODE_LEN(bits_per_word); | 265 | | SPMODE_PM(0xF)); |
273 | if (!(spi->mode & SPI_LSB_FIRST)) | 266 | |
274 | regval |= SPMODE_REV; | 267 | cs->hw_mode |= SPMODE_LEN(bits_per_word); |
268 | |||
269 | if ((mpc83xx_spi->spibrg / hz) >= 64) { | ||
270 | pm = mpc83xx_spi->spibrg / (hz * 64) - 1; | ||
271 | if (pm > 0x0f) { | ||
272 | dev_err(&spi->dev, "Requested speed is too " | ||
273 | "low: %d Hz. Will use %d Hz instead.\n", | ||
274 | hz, mpc83xx_spi->spibrg / 1024); | ||
275 | pm = 0x0f; | ||
276 | } | ||
277 | cs->hw_mode |= SPMODE_PM(pm) | SPMODE_DIV16; | ||
278 | } else { | ||
279 | pm = mpc83xx_spi->spibrg / (hz * 4); | ||
280 | if (pm) | ||
281 | pm--; | ||
282 | cs->hw_mode |= SPMODE_PM(pm); | ||
283 | } | ||
284 | regval = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); | ||
285 | if (cs->hw_mode != regval) { | ||
286 | unsigned long flags; | ||
287 | void *tmp_ptr = &mpc83xx_spi->base->mode; | ||
288 | |||
289 | regval = cs->hw_mode; | ||
290 | /* Turn off IRQs locally to minimize time | ||
291 | * that SPI is disabled | ||
292 | */ | ||
293 | local_irq_save(flags); | ||
294 | /* Turn off SPI unit prior changing mode */ | ||
295 | mpc83xx_spi_write_reg(tmp_ptr, regval & ~SPMODE_ENABLE); | ||
296 | mpc83xx_spi_write_reg(tmp_ptr, regval); | ||
297 | local_irq_restore(flags); | ||
298 | } | ||
299 | return 0; | ||
300 | } | ||
275 | 301 | ||
276 | /* Turn off SPI unit prior changing mode */ | 302 | static int mpc83xx_spi_bufs(struct spi_device *spi, struct spi_transfer *t) |
277 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, 0); | 303 | { |
278 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, regval); | 304 | struct mpc83xx_spi *mpc83xx_spi; |
305 | u32 word, len, bits_per_word; | ||
279 | 306 | ||
280 | return 0; | 307 | mpc83xx_spi = spi_master_get_devdata(spi->master); |
308 | |||
309 | mpc83xx_spi->tx = t->tx_buf; | ||
310 | mpc83xx_spi->rx = t->rx_buf; | ||
311 | bits_per_word = spi->bits_per_word; | ||
312 | if (t->bits_per_word) | ||
313 | bits_per_word = t->bits_per_word; | ||
314 | len = t->len; | ||
315 | if (bits_per_word > 8) | ||
316 | len /= 2; | ||
317 | if (bits_per_word > 16) | ||
318 | len /= 2; | ||
319 | mpc83xx_spi->count = len; | ||
320 | INIT_COMPLETION(mpc83xx_spi->done); | ||
321 | |||
322 | /* enable rx ints */ | ||
323 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, SPIM_NE); | ||
324 | |||
325 | /* transmit word */ | ||
326 | word = mpc83xx_spi->get_tx(mpc83xx_spi); | ||
327 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word); | ||
328 | |||
329 | wait_for_completion(&mpc83xx_spi->done); | ||
330 | |||
331 | /* disable rx ints */ | ||
332 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, 0); | ||
333 | |||
334 | return mpc83xx_spi->count; | ||
335 | } | ||
336 | |||
337 | static void mpc83xx_spi_work(struct work_struct *work) | ||
338 | { | ||
339 | struct mpc83xx_spi *mpc83xx_spi = | ||
340 | container_of(work, struct mpc83xx_spi, work); | ||
341 | |||
342 | spin_lock_irq(&mpc83xx_spi->lock); | ||
343 | mpc83xx_spi->busy = 1; | ||
344 | while (!list_empty(&mpc83xx_spi->queue)) { | ||
345 | struct spi_message *m; | ||
346 | struct spi_device *spi; | ||
347 | struct spi_transfer *t = NULL; | ||
348 | unsigned cs_change; | ||
349 | int status, nsecs = 50; | ||
350 | |||
351 | m = container_of(mpc83xx_spi->queue.next, | ||
352 | struct spi_message, queue); | ||
353 | list_del_init(&m->queue); | ||
354 | spin_unlock_irq(&mpc83xx_spi->lock); | ||
355 | |||
356 | spi = m->spi; | ||
357 | cs_change = 1; | ||
358 | status = 0; | ||
359 | list_for_each_entry(t, &m->transfers, transfer_list) { | ||
360 | if (t->bits_per_word || t->speed_hz) { | ||
361 | /* Don't allow changes if CS is active */ | ||
362 | status = -EINVAL; | ||
363 | |||
364 | if (cs_change) | ||
365 | status = mpc83xx_spi_setup_transfer(spi, t); | ||
366 | if (status < 0) | ||
367 | break; | ||
368 | } | ||
369 | |||
370 | if (cs_change) | ||
371 | mpc83xx_spi_chipselect(spi, BITBANG_CS_ACTIVE); | ||
372 | cs_change = t->cs_change; | ||
373 | if (t->len) | ||
374 | status = mpc83xx_spi_bufs(spi, t); | ||
375 | if (status) { | ||
376 | status = -EMSGSIZE; | ||
377 | break; | ||
378 | } | ||
379 | m->actual_length += t->len; | ||
380 | |||
381 | if (t->delay_usecs) | ||
382 | udelay(t->delay_usecs); | ||
383 | |||
384 | if (cs_change) { | ||
385 | ndelay(nsecs); | ||
386 | mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE); | ||
387 | ndelay(nsecs); | ||
388 | } | ||
389 | } | ||
390 | |||
391 | m->status = status; | ||
392 | m->complete(m->context); | ||
393 | |||
394 | if (status || !cs_change) { | ||
395 | ndelay(nsecs); | ||
396 | mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE); | ||
397 | } | ||
398 | |||
399 | mpc83xx_spi_setup_transfer(spi, NULL); | ||
400 | |||
401 | spin_lock_irq(&mpc83xx_spi->lock); | ||
402 | } | ||
403 | mpc83xx_spi->busy = 0; | ||
404 | spin_unlock_irq(&mpc83xx_spi->lock); | ||
281 | } | 405 | } |
282 | 406 | ||
283 | /* the spi->mode bits understood by this driver: */ | 407 | /* the spi->mode bits understood by this driver: */ |
@@ -286,9 +410,10 @@ int mpc83xx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
286 | 410 | ||
287 | static int mpc83xx_spi_setup(struct spi_device *spi) | 411 | static int mpc83xx_spi_setup(struct spi_device *spi) |
288 | { | 412 | { |
289 | struct spi_bitbang *bitbang; | ||
290 | struct mpc83xx_spi *mpc83xx_spi; | 413 | struct mpc83xx_spi *mpc83xx_spi; |
291 | int retval; | 414 | int retval; |
415 | u32 hw_mode; | ||
416 | struct spi_mpc83xx_cs *cs = spi->controller_state; | ||
292 | 417 | ||
293 | if (spi->mode & ~MODEBITS) { | 418 | if (spi->mode & ~MODEBITS) { |
294 | dev_dbg(&spi->dev, "setup: unsupported mode bits %x\n", | 419 | dev_dbg(&spi->dev, "setup: unsupported mode bits %x\n", |
@@ -299,63 +424,56 @@ static int mpc83xx_spi_setup(struct spi_device *spi) | |||
299 | if (!spi->max_speed_hz) | 424 | if (!spi->max_speed_hz) |
300 | return -EINVAL; | 425 | return -EINVAL; |
301 | 426 | ||
302 | bitbang = spi_master_get_devdata(spi->master); | 427 | if (!cs) { |
428 | cs = kzalloc(sizeof *cs, GFP_KERNEL); | ||
429 | if (!cs) | ||
430 | return -ENOMEM; | ||
431 | spi->controller_state = cs; | ||
432 | } | ||
303 | mpc83xx_spi = spi_master_get_devdata(spi->master); | 433 | mpc83xx_spi = spi_master_get_devdata(spi->master); |
304 | 434 | ||
305 | if (!spi->bits_per_word) | 435 | if (!spi->bits_per_word) |
306 | spi->bits_per_word = 8; | 436 | spi->bits_per_word = 8; |
307 | 437 | ||
438 | hw_mode = cs->hw_mode; /* Save orginal settings */ | ||
439 | cs->hw_mode = mpc83xx_spi_read_reg(&mpc83xx_spi->base->mode); | ||
440 | /* mask out bits we are going to set */ | ||
441 | cs->hw_mode &= ~(SPMODE_CP_BEGIN_EDGECLK | SPMODE_CI_INACTIVEHIGH | ||
442 | | SPMODE_REV | SPMODE_LOOP); | ||
443 | |||
444 | if (spi->mode & SPI_CPHA) | ||
445 | cs->hw_mode |= SPMODE_CP_BEGIN_EDGECLK; | ||
446 | if (spi->mode & SPI_CPOL) | ||
447 | cs->hw_mode |= SPMODE_CI_INACTIVEHIGH; | ||
448 | if (!(spi->mode & SPI_LSB_FIRST)) | ||
449 | cs->hw_mode |= SPMODE_REV; | ||
450 | if (spi->mode & SPI_LOOP) | ||
451 | cs->hw_mode |= SPMODE_LOOP; | ||
452 | |||
308 | retval = mpc83xx_spi_setup_transfer(spi, NULL); | 453 | retval = mpc83xx_spi_setup_transfer(spi, NULL); |
309 | if (retval < 0) | 454 | if (retval < 0) { |
455 | cs->hw_mode = hw_mode; /* Restore settings */ | ||
310 | return retval; | 456 | return retval; |
457 | } | ||
311 | 458 | ||
312 | dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u nsec\n", | 459 | dev_dbg(&spi->dev, "%s, mode %d, %u bits/w, %u Hz\n", |
313 | __func__, spi->mode & (SPI_CPOL | SPI_CPHA), | 460 | __func__, spi->mode & (SPI_CPOL | SPI_CPHA), |
314 | spi->bits_per_word, 2 * mpc83xx_spi->nsecs); | 461 | spi->bits_per_word, spi->max_speed_hz); |
315 | 462 | #if 0 /* Don't think this is needed */ | |
316 | /* NOTE we _need_ to call chipselect() early, ideally with adapter | 463 | /* NOTE we _need_ to call chipselect() early, ideally with adapter |
317 | * setup, unless the hardware defaults cooperate to avoid confusion | 464 | * setup, unless the hardware defaults cooperate to avoid confusion |
318 | * between normal (active low) and inverted chipselects. | 465 | * between normal (active low) and inverted chipselects. |
319 | */ | 466 | */ |
320 | 467 | ||
321 | /* deselect chip (low or high) */ | 468 | /* deselect chip (low or high) */ |
322 | spin_lock(&bitbang->lock); | 469 | spin_lock(&mpc83xx_spi->lock); |
323 | if (!bitbang->busy) { | 470 | if (!mpc83xx_spi->busy) |
324 | bitbang->chipselect(spi, BITBANG_CS_INACTIVE); | 471 | mpc83xx_spi_chipselect(spi, BITBANG_CS_INACTIVE); |
325 | ndelay(mpc83xx_spi->nsecs); | 472 | spin_unlock(&mpc83xx_spi->lock); |
326 | } | 473 | #endif |
327 | spin_unlock(&bitbang->lock); | ||
328 | |||
329 | return 0; | 474 | return 0; |
330 | } | 475 | } |
331 | 476 | ||
332 | static int mpc83xx_spi_bufs(struct spi_device *spi, struct spi_transfer *t) | ||
333 | { | ||
334 | struct mpc83xx_spi *mpc83xx_spi; | ||
335 | u32 word; | ||
336 | |||
337 | mpc83xx_spi = spi_master_get_devdata(spi->master); | ||
338 | |||
339 | mpc83xx_spi->tx = t->tx_buf; | ||
340 | mpc83xx_spi->rx = t->rx_buf; | ||
341 | mpc83xx_spi->count = t->len; | ||
342 | INIT_COMPLETION(mpc83xx_spi->done); | ||
343 | |||
344 | /* enable rx ints */ | ||
345 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, SPIM_NE); | ||
346 | |||
347 | /* transmit word */ | ||
348 | word = mpc83xx_spi->get_tx(mpc83xx_spi); | ||
349 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->transmit, word); | ||
350 | |||
351 | wait_for_completion(&mpc83xx_spi->done); | ||
352 | |||
353 | /* disable rx ints */ | ||
354 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mask, 0); | ||
355 | |||
356 | return t->len - mpc83xx_spi->count; | ||
357 | } | ||
358 | |||
359 | irqreturn_t mpc83xx_spi_irq(s32 irq, void *context_data) | 477 | irqreturn_t mpc83xx_spi_irq(s32 irq, void *context_data) |
360 | { | 478 | { |
361 | struct mpc83xx_spi *mpc83xx_spi = context_data; | 479 | struct mpc83xx_spi *mpc83xx_spi = context_data; |
@@ -395,6 +513,28 @@ irqreturn_t mpc83xx_spi_irq(s32 irq, void *context_data) | |||
395 | 513 | ||
396 | return ret; | 514 | return ret; |
397 | } | 515 | } |
516 | static int mpc83xx_spi_transfer(struct spi_device *spi, | ||
517 | struct spi_message *m) | ||
518 | { | ||
519 | struct mpc83xx_spi *mpc83xx_spi = spi_master_get_devdata(spi->master); | ||
520 | unsigned long flags; | ||
521 | |||
522 | m->actual_length = 0; | ||
523 | m->status = -EINPROGRESS; | ||
524 | |||
525 | spin_lock_irqsave(&mpc83xx_spi->lock, flags); | ||
526 | list_add_tail(&m->queue, &mpc83xx_spi->queue); | ||
527 | queue_work(mpc83xx_spi->workqueue, &mpc83xx_spi->work); | ||
528 | spin_unlock_irqrestore(&mpc83xx_spi->lock, flags); | ||
529 | |||
530 | return 0; | ||
531 | } | ||
532 | |||
533 | |||
534 | static void mpc83xx_spi_cleanup(struct spi_device *spi) | ||
535 | { | ||
536 | kfree(spi->controller_state); | ||
537 | } | ||
398 | 538 | ||
399 | static int __init mpc83xx_spi_probe(struct platform_device *dev) | 539 | static int __init mpc83xx_spi_probe(struct platform_device *dev) |
400 | { | 540 | { |
@@ -426,11 +566,11 @@ static int __init mpc83xx_spi_probe(struct platform_device *dev) | |||
426 | ret = -ENODEV; | 566 | ret = -ENODEV; |
427 | goto free_master; | 567 | goto free_master; |
428 | } | 568 | } |
569 | master->setup = mpc83xx_spi_setup; | ||
570 | master->transfer = mpc83xx_spi_transfer; | ||
571 | master->cleanup = mpc83xx_spi_cleanup; | ||
572 | |||
429 | mpc83xx_spi = spi_master_get_devdata(master); | 573 | mpc83xx_spi = spi_master_get_devdata(master); |
430 | mpc83xx_spi->bitbang.master = spi_master_get(master); | ||
431 | mpc83xx_spi->bitbang.chipselect = mpc83xx_spi_chipselect; | ||
432 | mpc83xx_spi->bitbang.setup_transfer = mpc83xx_spi_setup_transfer; | ||
433 | mpc83xx_spi->bitbang.txrx_bufs = mpc83xx_spi_bufs; | ||
434 | mpc83xx_spi->activate_cs = pdata->activate_cs; | 574 | mpc83xx_spi->activate_cs = pdata->activate_cs; |
435 | mpc83xx_spi->deactivate_cs = pdata->deactivate_cs; | 575 | mpc83xx_spi->deactivate_cs = pdata->deactivate_cs; |
436 | mpc83xx_spi->qe_mode = pdata->qe_mode; | 576 | mpc83xx_spi->qe_mode = pdata->qe_mode; |
@@ -445,7 +585,6 @@ static int __init mpc83xx_spi_probe(struct platform_device *dev) | |||
445 | mpc83xx_spi->tx_shift = 24; | 585 | mpc83xx_spi->tx_shift = 24; |
446 | } | 586 | } |
447 | 587 | ||
448 | mpc83xx_spi->bitbang.master->setup = mpc83xx_spi_setup; | ||
449 | init_completion(&mpc83xx_spi->done); | 588 | init_completion(&mpc83xx_spi->done); |
450 | 589 | ||
451 | mpc83xx_spi->base = ioremap(r->start, r->end - r->start + 1); | 590 | mpc83xx_spi->base = ioremap(r->start, r->end - r->start + 1); |
@@ -483,11 +622,21 @@ static int __init mpc83xx_spi_probe(struct platform_device *dev) | |||
483 | regval |= SPMODE_OP; | 622 | regval |= SPMODE_OP; |
484 | 623 | ||
485 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, regval); | 624 | mpc83xx_spi_write_reg(&mpc83xx_spi->base->mode, regval); |
625 | spin_lock_init(&mpc83xx_spi->lock); | ||
626 | init_completion(&mpc83xx_spi->done); | ||
627 | INIT_WORK(&mpc83xx_spi->work, mpc83xx_spi_work); | ||
628 | INIT_LIST_HEAD(&mpc83xx_spi->queue); | ||
486 | 629 | ||
487 | ret = spi_bitbang_start(&mpc83xx_spi->bitbang); | 630 | mpc83xx_spi->workqueue = create_singlethread_workqueue( |
488 | 631 | master->dev.parent->bus_id); | |
489 | if (ret != 0) | 632 | if (mpc83xx_spi->workqueue == NULL) { |
633 | ret = -EBUSY; | ||
490 | goto free_irq; | 634 | goto free_irq; |
635 | } | ||
636 | |||
637 | ret = spi_register_master(master); | ||
638 | if (ret < 0) | ||
639 | goto unreg_master; | ||
491 | 640 | ||
492 | printk(KERN_INFO | 641 | printk(KERN_INFO |
493 | "%s: MPC83xx SPI Controller driver at 0x%p (irq = %d)\n", | 642 | "%s: MPC83xx SPI Controller driver at 0x%p (irq = %d)\n", |
@@ -495,6 +644,8 @@ static int __init mpc83xx_spi_probe(struct platform_device *dev) | |||
495 | 644 | ||
496 | return ret; | 645 | return ret; |
497 | 646 | ||
647 | unreg_master: | ||
648 | destroy_workqueue(mpc83xx_spi->workqueue); | ||
498 | free_irq: | 649 | free_irq: |
499 | free_irq(mpc83xx_spi->irq, mpc83xx_spi); | 650 | free_irq(mpc83xx_spi->irq, mpc83xx_spi); |
500 | unmap_io: | 651 | unmap_io: |
@@ -515,10 +666,12 @@ static int __exit mpc83xx_spi_remove(struct platform_device *dev) | |||
515 | master = platform_get_drvdata(dev); | 666 | master = platform_get_drvdata(dev); |
516 | mpc83xx_spi = spi_master_get_devdata(master); | 667 | mpc83xx_spi = spi_master_get_devdata(master); |
517 | 668 | ||
518 | spi_bitbang_stop(&mpc83xx_spi->bitbang); | 669 | flush_workqueue(mpc83xx_spi->workqueue); |
670 | destroy_workqueue(mpc83xx_spi->workqueue); | ||
671 | spi_unregister_master(master); | ||
672 | |||
519 | free_irq(mpc83xx_spi->irq, mpc83xx_spi); | 673 | free_irq(mpc83xx_spi->irq, mpc83xx_spi); |
520 | iounmap(mpc83xx_spi->base); | 674 | iounmap(mpc83xx_spi->base); |
521 | spi_master_put(mpc83xx_spi->bitbang.master); | ||
522 | 675 | ||
523 | return 0; | 676 | return 0; |
524 | } | 677 | } |
diff --git a/drivers/usb/c67x00/c67x00-ll-hpi.c b/drivers/usb/c67x00/c67x00-ll-hpi.c index f3430b372f09..5100fbbf6cb0 100644 --- a/drivers/usb/c67x00/c67x00-ll-hpi.c +++ b/drivers/usb/c67x00/c67x00-ll-hpi.c | |||
@@ -23,6 +23,7 @@ | |||
23 | 23 | ||
24 | #include <asm/byteorder.h> | 24 | #include <asm/byteorder.h> |
25 | #include <linux/io.h> | 25 | #include <linux/io.h> |
26 | #include <linux/jiffies.h> | ||
26 | #include <linux/usb/c67x00.h> | 27 | #include <linux/usb/c67x00.h> |
27 | #include "c67x00.h" | 28 | #include "c67x00.h" |
28 | 29 | ||
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index cefe7f2c6f75..63c34043b4d9 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -1248,6 +1248,9 @@ static struct usb_device_id acm_ids[] = { | |||
1248 | { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ | 1248 | { USB_DEVICE(0x22b8, 0x7000), /* Motorola Q Phone */ |
1249 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | 1249 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ |
1250 | }, | 1250 | }, |
1251 | { USB_DEVICE(0x0803, 0x3095), /* Zoom Telephonics Model 3095F USB MODEM */ | ||
1252 | .driver_info = NO_UNION_NORMAL, /* has no union descriptor */ | ||
1253 | }, | ||
1251 | 1254 | ||
1252 | /* control interfaces with various AT-command sets */ | 1255 | /* control interfaces with various AT-command sets */ |
1253 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1256 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c index 99e5a68a3f12..fae55a31e26d 100644 --- a/drivers/usb/core/endpoint.c +++ b/drivers/usb/core/endpoint.c | |||
@@ -156,6 +156,10 @@ static struct attribute *ep_dev_attrs[] = { | |||
156 | static struct attribute_group ep_dev_attr_grp = { | 156 | static struct attribute_group ep_dev_attr_grp = { |
157 | .attrs = ep_dev_attrs, | 157 | .attrs = ep_dev_attrs, |
158 | }; | 158 | }; |
159 | static struct attribute_group *ep_dev_groups[] = { | ||
160 | &ep_dev_attr_grp, | ||
161 | NULL | ||
162 | }; | ||
159 | 163 | ||
160 | static int usb_endpoint_major_init(void) | 164 | static int usb_endpoint_major_init(void) |
161 | { | 165 | { |
@@ -298,6 +302,7 @@ int usb_create_ep_files(struct device *parent, | |||
298 | 302 | ||
299 | ep_dev->desc = &endpoint->desc; | 303 | ep_dev->desc = &endpoint->desc; |
300 | ep_dev->udev = udev; | 304 | ep_dev->udev = udev; |
305 | ep_dev->dev.groups = ep_dev_groups; | ||
301 | ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor); | 306 | ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor); |
302 | ep_dev->dev.class = ep_class->class; | 307 | ep_dev->dev.class = ep_class->class; |
303 | ep_dev->dev.parent = parent; | 308 | ep_dev->dev.parent = parent; |
@@ -309,9 +314,6 @@ int usb_create_ep_files(struct device *parent, | |||
309 | retval = device_register(&ep_dev->dev); | 314 | retval = device_register(&ep_dev->dev); |
310 | if (retval) | 315 | if (retval) |
311 | goto error_chrdev; | 316 | goto error_chrdev; |
312 | retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); | ||
313 | if (retval) | ||
314 | goto error_group; | ||
315 | 317 | ||
316 | /* create the symlink to the old-style "ep_XX" directory */ | 318 | /* create the symlink to the old-style "ep_XX" directory */ |
317 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); | 319 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); |
@@ -322,8 +324,6 @@ int usb_create_ep_files(struct device *parent, | |||
322 | return retval; | 324 | return retval; |
323 | 325 | ||
324 | error_link: | 326 | error_link: |
325 | sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); | ||
326 | error_group: | ||
327 | device_unregister(&ep_dev->dev); | 327 | device_unregister(&ep_dev->dev); |
328 | destroy_endpoint_class(); | 328 | destroy_endpoint_class(); |
329 | return retval; | 329 | return retval; |
@@ -348,7 +348,6 @@ void usb_remove_ep_files(struct usb_host_endpoint *endpoint) | |||
348 | 348 | ||
349 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); | 349 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); |
350 | sysfs_remove_link(&ep_dev->dev.parent->kobj, name); | 350 | sysfs_remove_link(&ep_dev->dev.parent->kobj, name); |
351 | sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); | ||
352 | device_unregister(&ep_dev->dev); | 351 | device_unregister(&ep_dev->dev); |
353 | endpoint->ep_dev = NULL; | 352 | endpoint->ep_dev = NULL; |
354 | destroy_endpoint_class(); | 353 | destroy_endpoint_class(); |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 3e69266e1f4d..fe47d145255a 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -1607,6 +1607,7 @@ free_interfaces: | |||
1607 | intf->dev.driver = NULL; | 1607 | intf->dev.driver = NULL; |
1608 | intf->dev.bus = &usb_bus_type; | 1608 | intf->dev.bus = &usb_bus_type; |
1609 | intf->dev.type = &usb_if_device_type; | 1609 | intf->dev.type = &usb_if_device_type; |
1610 | intf->dev.groups = usb_interface_groups; | ||
1610 | intf->dev.dma_mask = dev->dev.dma_mask; | 1611 | intf->dev.dma_mask = dev->dev.dma_mask; |
1611 | device_initialize(&intf->dev); | 1612 | device_initialize(&intf->dev); |
1612 | mark_quiesced(intf); | 1613 | mark_quiesced(intf); |
diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c index 5b20a60de8ba..c783cb111847 100644 --- a/drivers/usb/core/sysfs.c +++ b/drivers/usb/core/sysfs.c | |||
@@ -538,6 +538,46 @@ static struct attribute_group dev_attr_grp = { | |||
538 | .attrs = dev_attrs, | 538 | .attrs = dev_attrs, |
539 | }; | 539 | }; |
540 | 540 | ||
541 | /* When modifying this list, be sure to modify dev_string_attrs_are_visible() | ||
542 | * accordingly. | ||
543 | */ | ||
544 | static struct attribute *dev_string_attrs[] = { | ||
545 | &dev_attr_manufacturer.attr, | ||
546 | &dev_attr_product.attr, | ||
547 | &dev_attr_serial.attr, | ||
548 | NULL | ||
549 | }; | ||
550 | |||
551 | static mode_t dev_string_attrs_are_visible(struct kobject *kobj, | ||
552 | struct attribute *a, int n) | ||
553 | { | ||
554 | struct usb_device *udev = to_usb_device( | ||
555 | container_of(kobj, struct device, kobj)); | ||
556 | |||
557 | if (a == &dev_attr_manufacturer.attr) { | ||
558 | if (udev->manufacturer == NULL) | ||
559 | return 0; | ||
560 | } else if (a == &dev_attr_product.attr) { | ||
561 | if (udev->product == NULL) | ||
562 | return 0; | ||
563 | } else if (a == &dev_attr_serial.attr) { | ||
564 | if (udev->serial == NULL) | ||
565 | return 0; | ||
566 | } | ||
567 | return a->mode; | ||
568 | } | ||
569 | |||
570 | static struct attribute_group dev_string_attr_grp = { | ||
571 | .attrs = dev_string_attrs, | ||
572 | .is_visible = dev_string_attrs_are_visible, | ||
573 | }; | ||
574 | |||
575 | struct attribute_group *usb_device_groups[] = { | ||
576 | &dev_attr_grp, | ||
577 | &dev_string_attr_grp, | ||
578 | NULL | ||
579 | }; | ||
580 | |||
541 | /* Binary descriptors */ | 581 | /* Binary descriptors */ |
542 | 582 | ||
543 | static ssize_t | 583 | static ssize_t |
@@ -591,10 +631,9 @@ int usb_create_sysfs_dev_files(struct usb_device *udev) | |||
591 | struct device *dev = &udev->dev; | 631 | struct device *dev = &udev->dev; |
592 | int retval; | 632 | int retval; |
593 | 633 | ||
594 | retval = sysfs_create_group(&dev->kobj, &dev_attr_grp); | 634 | /* Unforunately these attributes cannot be created before |
595 | if (retval) | 635 | * the uevent is broadcast. |
596 | return retval; | 636 | */ |
597 | |||
598 | retval = device_create_bin_file(dev, &dev_bin_attr_descriptors); | 637 | retval = device_create_bin_file(dev, &dev_bin_attr_descriptors); |
599 | if (retval) | 638 | if (retval) |
600 | goto error; | 639 | goto error; |
@@ -607,21 +646,6 @@ int usb_create_sysfs_dev_files(struct usb_device *udev) | |||
607 | if (retval) | 646 | if (retval) |
608 | goto error; | 647 | goto error; |
609 | 648 | ||
610 | if (udev->manufacturer) { | ||
611 | retval = device_create_file(dev, &dev_attr_manufacturer); | ||
612 | if (retval) | ||
613 | goto error; | ||
614 | } | ||
615 | if (udev->product) { | ||
616 | retval = device_create_file(dev, &dev_attr_product); | ||
617 | if (retval) | ||
618 | goto error; | ||
619 | } | ||
620 | if (udev->serial) { | ||
621 | retval = device_create_file(dev, &dev_attr_serial); | ||
622 | if (retval) | ||
623 | goto error; | ||
624 | } | ||
625 | retval = usb_create_ep_files(dev, &udev->ep0, udev); | 649 | retval = usb_create_ep_files(dev, &udev->ep0, udev); |
626 | if (retval) | 650 | if (retval) |
627 | goto error; | 651 | goto error; |
@@ -636,13 +660,9 @@ void usb_remove_sysfs_dev_files(struct usb_device *udev) | |||
636 | struct device *dev = &udev->dev; | 660 | struct device *dev = &udev->dev; |
637 | 661 | ||
638 | usb_remove_ep_files(&udev->ep0); | 662 | usb_remove_ep_files(&udev->ep0); |
639 | device_remove_file(dev, &dev_attr_manufacturer); | ||
640 | device_remove_file(dev, &dev_attr_product); | ||
641 | device_remove_file(dev, &dev_attr_serial); | ||
642 | remove_power_attributes(dev); | 663 | remove_power_attributes(dev); |
643 | remove_persist_attributes(dev); | 664 | remove_persist_attributes(dev); |
644 | device_remove_bin_file(dev, &dev_bin_attr_descriptors); | 665 | device_remove_bin_file(dev, &dev_bin_attr_descriptors); |
645 | sysfs_remove_group(&dev->kobj, &dev_attr_grp); | ||
646 | } | 666 | } |
647 | 667 | ||
648 | /* Interface Accociation Descriptor fields */ | 668 | /* Interface Accociation Descriptor fields */ |
@@ -688,17 +708,15 @@ static ssize_t show_interface_string(struct device *dev, | |||
688 | struct device_attribute *attr, char *buf) | 708 | struct device_attribute *attr, char *buf) |
689 | { | 709 | { |
690 | struct usb_interface *intf; | 710 | struct usb_interface *intf; |
691 | struct usb_device *udev; | 711 | char *string; |
692 | int len; | ||
693 | 712 | ||
694 | intf = to_usb_interface(dev); | 713 | intf = to_usb_interface(dev); |
695 | udev = interface_to_usbdev(intf); | 714 | string = intf->cur_altsetting->string; |
696 | len = snprintf(buf, 256, "%s", intf->cur_altsetting->string); | 715 | barrier(); /* The altsetting might change! */ |
697 | if (len < 0) | 716 | |
717 | if (!string) | ||
698 | return 0; | 718 | return 0; |
699 | buf[len] = '\n'; | 719 | return sprintf(buf, "%s\n", string); |
700 | buf[len+1] = 0; | ||
701 | return len+1; | ||
702 | } | 720 | } |
703 | static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); | 721 | static DEVICE_ATTR(interface, S_IRUGO, show_interface_string, NULL); |
704 | 722 | ||
@@ -727,18 +745,6 @@ static ssize_t show_modalias(struct device *dev, | |||
727 | } | 745 | } |
728 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); | 746 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); |
729 | 747 | ||
730 | static struct attribute *intf_assoc_attrs[] = { | ||
731 | &dev_attr_iad_bFirstInterface.attr, | ||
732 | &dev_attr_iad_bInterfaceCount.attr, | ||
733 | &dev_attr_iad_bFunctionClass.attr, | ||
734 | &dev_attr_iad_bFunctionSubClass.attr, | ||
735 | &dev_attr_iad_bFunctionProtocol.attr, | ||
736 | NULL, | ||
737 | }; | ||
738 | static struct attribute_group intf_assoc_attr_grp = { | ||
739 | .attrs = intf_assoc_attrs, | ||
740 | }; | ||
741 | |||
742 | static struct attribute *intf_attrs[] = { | 748 | static struct attribute *intf_attrs[] = { |
743 | &dev_attr_bInterfaceNumber.attr, | 749 | &dev_attr_bInterfaceNumber.attr, |
744 | &dev_attr_bAlternateSetting.attr, | 750 | &dev_attr_bAlternateSetting.attr, |
@@ -753,6 +759,37 @@ static struct attribute_group intf_attr_grp = { | |||
753 | .attrs = intf_attrs, | 759 | .attrs = intf_attrs, |
754 | }; | 760 | }; |
755 | 761 | ||
762 | static struct attribute *intf_assoc_attrs[] = { | ||
763 | &dev_attr_iad_bFirstInterface.attr, | ||
764 | &dev_attr_iad_bInterfaceCount.attr, | ||
765 | &dev_attr_iad_bFunctionClass.attr, | ||
766 | &dev_attr_iad_bFunctionSubClass.attr, | ||
767 | &dev_attr_iad_bFunctionProtocol.attr, | ||
768 | NULL, | ||
769 | }; | ||
770 | |||
771 | static mode_t intf_assoc_attrs_are_visible(struct kobject *kobj, | ||
772 | struct attribute *a, int n) | ||
773 | { | ||
774 | struct usb_interface *intf = to_usb_interface( | ||
775 | container_of(kobj, struct device, kobj)); | ||
776 | |||
777 | if (intf->intf_assoc == NULL) | ||
778 | return 0; | ||
779 | return a->mode; | ||
780 | } | ||
781 | |||
782 | static struct attribute_group intf_assoc_attr_grp = { | ||
783 | .attrs = intf_assoc_attrs, | ||
784 | .is_visible = intf_assoc_attrs_are_visible, | ||
785 | }; | ||
786 | |||
787 | struct attribute_group *usb_interface_groups[] = { | ||
788 | &intf_attr_grp, | ||
789 | &intf_assoc_attr_grp, | ||
790 | NULL | ||
791 | }; | ||
792 | |||
756 | static inline void usb_create_intf_ep_files(struct usb_interface *intf, | 793 | static inline void usb_create_intf_ep_files(struct usb_interface *intf, |
757 | struct usb_device *udev) | 794 | struct usb_device *udev) |
758 | { | 795 | { |
@@ -777,23 +814,21 @@ static inline void usb_remove_intf_ep_files(struct usb_interface *intf) | |||
777 | 814 | ||
778 | int usb_create_sysfs_intf_files(struct usb_interface *intf) | 815 | int usb_create_sysfs_intf_files(struct usb_interface *intf) |
779 | { | 816 | { |
780 | struct device *dev = &intf->dev; | ||
781 | struct usb_device *udev = interface_to_usbdev(intf); | 817 | struct usb_device *udev = interface_to_usbdev(intf); |
782 | struct usb_host_interface *alt = intf->cur_altsetting; | 818 | struct usb_host_interface *alt = intf->cur_altsetting; |
783 | int retval; | 819 | int retval; |
784 | 820 | ||
785 | if (intf->sysfs_files_created) | 821 | if (intf->sysfs_files_created) |
786 | return 0; | 822 | return 0; |
787 | retval = sysfs_create_group(&dev->kobj, &intf_attr_grp); | ||
788 | if (retval) | ||
789 | return retval; | ||
790 | 823 | ||
824 | /* The interface string may be present in some altsettings | ||
825 | * and missing in others. Hence its attribute cannot be created | ||
826 | * before the uevent is broadcast. | ||
827 | */ | ||
791 | if (alt->string == NULL) | 828 | if (alt->string == NULL) |
792 | alt->string = usb_cache_string(udev, alt->desc.iInterface); | 829 | alt->string = usb_cache_string(udev, alt->desc.iInterface); |
793 | if (alt->string) | 830 | if (alt->string) |
794 | retval = device_create_file(dev, &dev_attr_interface); | 831 | retval = device_create_file(&intf->dev, &dev_attr_interface); |
795 | if (intf->intf_assoc) | ||
796 | retval = sysfs_create_group(&dev->kobj, &intf_assoc_attr_grp); | ||
797 | usb_create_intf_ep_files(intf, udev); | 832 | usb_create_intf_ep_files(intf, udev); |
798 | intf->sysfs_files_created = 1; | 833 | intf->sysfs_files_created = 1; |
799 | return 0; | 834 | return 0; |
@@ -807,7 +842,5 @@ void usb_remove_sysfs_intf_files(struct usb_interface *intf) | |||
807 | return; | 842 | return; |
808 | usb_remove_intf_ep_files(intf); | 843 | usb_remove_intf_ep_files(intf); |
809 | device_remove_file(dev, &dev_attr_interface); | 844 | device_remove_file(dev, &dev_attr_interface); |
810 | sysfs_remove_group(&dev->kobj, &intf_attr_grp); | ||
811 | sysfs_remove_group(&intf->dev.kobj, &intf_assoc_attr_grp); | ||
812 | intf->sysfs_files_created = 0; | 845 | intf->sysfs_files_created = 0; |
813 | } | 846 | } |
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 1f0db51190cc..325774375837 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -291,6 +291,7 @@ struct usb_device *usb_alloc_dev(struct usb_device *parent, | |||
291 | device_initialize(&dev->dev); | 291 | device_initialize(&dev->dev); |
292 | dev->dev.bus = &usb_bus_type; | 292 | dev->dev.bus = &usb_bus_type; |
293 | dev->dev.type = &usb_device_type; | 293 | dev->dev.type = &usb_device_type; |
294 | dev->dev.groups = usb_device_groups; | ||
294 | dev->dev.dma_mask = bus->controller->dma_mask; | 295 | dev->dev.dma_mask = bus->controller->dma_mask; |
295 | set_dev_node(&dev->dev, dev_to_node(bus->controller)); | 296 | set_dev_node(&dev->dev, dev_to_node(bus->controller)); |
296 | dev->state = USB_STATE_ATTACHED; | 297 | dev->state = USB_STATE_ATTACHED; |
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 1bf8ccb9c58d..1a8bc21c335e 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -130,6 +130,10 @@ static inline int is_active(const struct usb_interface *f) | |||
130 | /* for labeling diagnostics */ | 130 | /* for labeling diagnostics */ |
131 | extern const char *usbcore_name; | 131 | extern const char *usbcore_name; |
132 | 132 | ||
133 | /* sysfs stuff */ | ||
134 | extern struct attribute_group *usb_device_groups[]; | ||
135 | extern struct attribute_group *usb_interface_groups[]; | ||
136 | |||
133 | /* usbfs stuff */ | 137 | /* usbfs stuff */ |
134 | extern struct mutex usbfs_mutex; | 138 | extern struct mutex usbfs_mutex; |
135 | extern struct usb_driver usbfs_driver; | 139 | extern struct usb_driver usbfs_driver; |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index ce337cb5d137..f261d2a9a5f0 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
@@ -3251,7 +3251,7 @@ static int udc_pci_probe( | |||
3251 | /* pci setup */ | 3251 | /* pci setup */ |
3252 | if (pci_enable_device(pdev) < 0) { | 3252 | if (pci_enable_device(pdev) < 0) { |
3253 | kfree(dev); | 3253 | kfree(dev); |
3254 | dev = 0; | 3254 | dev = NULL; |
3255 | retval = -ENODEV; | 3255 | retval = -ENODEV; |
3256 | goto finished; | 3256 | goto finished; |
3257 | } | 3257 | } |
@@ -3264,7 +3264,7 @@ static int udc_pci_probe( | |||
3264 | if (!request_mem_region(resource, len, name)) { | 3264 | if (!request_mem_region(resource, len, name)) { |
3265 | dev_dbg(&pdev->dev, "pci device used already\n"); | 3265 | dev_dbg(&pdev->dev, "pci device used already\n"); |
3266 | kfree(dev); | 3266 | kfree(dev); |
3267 | dev = 0; | 3267 | dev = NULL; |
3268 | retval = -EBUSY; | 3268 | retval = -EBUSY; |
3269 | goto finished; | 3269 | goto finished; |
3270 | } | 3270 | } |
@@ -3274,7 +3274,7 @@ static int udc_pci_probe( | |||
3274 | if (dev->virt_addr == NULL) { | 3274 | if (dev->virt_addr == NULL) { |
3275 | dev_dbg(&pdev->dev, "start address cannot be mapped\n"); | 3275 | dev_dbg(&pdev->dev, "start address cannot be mapped\n"); |
3276 | kfree(dev); | 3276 | kfree(dev); |
3277 | dev = 0; | 3277 | dev = NULL; |
3278 | retval = -EFAULT; | 3278 | retval = -EFAULT; |
3279 | goto finished; | 3279 | goto finished; |
3280 | } | 3280 | } |
@@ -3282,7 +3282,7 @@ static int udc_pci_probe( | |||
3282 | if (!pdev->irq) { | 3282 | if (!pdev->irq) { |
3283 | dev_err(&dev->pdev->dev, "irq not set\n"); | 3283 | dev_err(&dev->pdev->dev, "irq not set\n"); |
3284 | kfree(dev); | 3284 | kfree(dev); |
3285 | dev = 0; | 3285 | dev = NULL; |
3286 | retval = -ENODEV; | 3286 | retval = -ENODEV; |
3287 | goto finished; | 3287 | goto finished; |
3288 | } | 3288 | } |
@@ -3290,7 +3290,7 @@ static int udc_pci_probe( | |||
3290 | if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { | 3290 | if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { |
3291 | dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); | 3291 | dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); |
3292 | kfree(dev); | 3292 | kfree(dev); |
3293 | dev = 0; | 3293 | dev = NULL; |
3294 | retval = -EBUSY; | 3294 | retval = -EBUSY; |
3295 | goto finished; | 3295 | goto finished; |
3296 | } | 3296 | } |
diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c index e756023362c2..07e5a0b5dcda 100644 --- a/drivers/usb/gadget/atmel_usba_udc.c +++ b/drivers/usb/gadget/atmel_usba_udc.c | |||
@@ -649,7 +649,13 @@ static int usba_ep_disable(struct usb_ep *_ep) | |||
649 | 649 | ||
650 | if (!ep->desc) { | 650 | if (!ep->desc) { |
651 | spin_unlock_irqrestore(&udc->lock, flags); | 651 | spin_unlock_irqrestore(&udc->lock, flags); |
652 | DBG(DBG_ERR, "ep_disable: %s not enabled\n", ep->ep.name); | 652 | /* REVISIT because this driver disables endpoints in |
653 | * reset_all_endpoints() before calling disconnect(), | ||
654 | * most gadget drivers would trigger this non-error ... | ||
655 | */ | ||
656 | if (udc->gadget.speed != USB_SPEED_UNKNOWN) | ||
657 | DBG(DBG_ERR, "ep_disable: %s not enabled\n", | ||
658 | ep->ep.name); | ||
653 | return -EINVAL; | 659 | return -EINVAL; |
654 | } | 660 | } |
655 | ep->desc = NULL; | 661 | ep->desc = NULL; |
@@ -1032,8 +1038,6 @@ static struct usba_udc the_udc = { | |||
1032 | .release = nop_release, | 1038 | .release = nop_release, |
1033 | }, | 1039 | }, |
1034 | }, | 1040 | }, |
1035 | |||
1036 | .lock = SPIN_LOCK_UNLOCKED, | ||
1037 | }; | 1041 | }; |
1038 | 1042 | ||
1039 | /* | 1043 | /* |
@@ -1052,6 +1056,12 @@ static void reset_all_endpoints(struct usba_udc *udc) | |||
1052 | request_complete(ep, req, -ECONNRESET); | 1056 | request_complete(ep, req, -ECONNRESET); |
1053 | } | 1057 | } |
1054 | 1058 | ||
1059 | /* NOTE: normally, the next call to the gadget driver is in | ||
1060 | * charge of disabling endpoints... usually disconnect(). | ||
1061 | * The exception would be entering a high speed test mode. | ||
1062 | * | ||
1063 | * FIXME remove this code ... and retest thoroughly. | ||
1064 | */ | ||
1055 | list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { | 1065 | list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { |
1056 | if (ep->desc) { | 1066 | if (ep->desc) { |
1057 | spin_unlock(&udc->lock); | 1067 | spin_unlock(&udc->lock); |
@@ -1219,7 +1229,7 @@ static inline bool feature_is_ep_halt(struct usb_ctrlrequest *crq) | |||
1219 | static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep, | 1229 | static int handle_ep0_setup(struct usba_udc *udc, struct usba_ep *ep, |
1220 | struct usb_ctrlrequest *crq) | 1230 | struct usb_ctrlrequest *crq) |
1221 | { | 1231 | { |
1222 | int retval = 0;; | 1232 | int retval = 0; |
1223 | 1233 | ||
1224 | switch (crq->bRequest) { | 1234 | switch (crq->bRequest) { |
1225 | case USB_REQ_GET_STATUS: { | 1235 | case USB_REQ_GET_STATUS: { |
@@ -1693,6 +1703,14 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1693 | usba_writel(udc, INT_CLR, USBA_END_OF_RESET); | 1703 | usba_writel(udc, INT_CLR, USBA_END_OF_RESET); |
1694 | reset_all_endpoints(udc); | 1704 | reset_all_endpoints(udc); |
1695 | 1705 | ||
1706 | if (udc->gadget.speed != USB_SPEED_UNKNOWN | ||
1707 | && udc->driver->disconnect) { | ||
1708 | udc->gadget.speed = USB_SPEED_UNKNOWN; | ||
1709 | spin_unlock(&udc->lock); | ||
1710 | udc->driver->disconnect(&udc->gadget); | ||
1711 | spin_lock(&udc->lock); | ||
1712 | } | ||
1713 | |||
1696 | if (status & USBA_HIGH_SPEED) { | 1714 | if (status & USBA_HIGH_SPEED) { |
1697 | DBG(DBG_BUS, "High-speed bus reset detected\n"); | 1715 | DBG(DBG_BUS, "High-speed bus reset detected\n"); |
1698 | udc->gadget.speed = USB_SPEED_HIGH; | 1716 | udc->gadget.speed = USB_SPEED_HIGH; |
@@ -1716,9 +1734,13 @@ static irqreturn_t usba_udc_irq(int irq, void *devid) | |||
1716 | | USBA_DET_SUSPEND | 1734 | | USBA_DET_SUSPEND |
1717 | | USBA_END_OF_RESUME)); | 1735 | | USBA_END_OF_RESUME)); |
1718 | 1736 | ||
1737 | /* | ||
1738 | * Unclear why we hit this irregularly, e.g. in usbtest, | ||
1739 | * but it's clearly harmless... | ||
1740 | */ | ||
1719 | if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED)) | 1741 | if (!(usba_ep_readl(ep0, CFG) & USBA_EPT_MAPPED)) |
1720 | dev_warn(&udc->pdev->dev, | 1742 | dev_dbg(&udc->pdev->dev, |
1721 | "WARNING: EP0 configuration is invalid!\n"); | 1743 | "ODD: EP0 configuration is invalid!\n"); |
1722 | } | 1744 | } |
1723 | 1745 | ||
1724 | spin_unlock(&udc->lock); | 1746 | spin_unlock(&udc->lock); |
@@ -1751,9 +1773,11 @@ static irqreturn_t usba_vbus_irq(int irq, void *devid) | |||
1751 | reset_all_endpoints(udc); | 1773 | reset_all_endpoints(udc); |
1752 | toggle_bias(0); | 1774 | toggle_bias(0); |
1753 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | 1775 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
1754 | spin_unlock(&udc->lock); | 1776 | if (udc->driver->disconnect) { |
1755 | udc->driver->disconnect(&udc->gadget); | 1777 | spin_unlock(&udc->lock); |
1756 | spin_lock(&udc->lock); | 1778 | udc->driver->disconnect(&udc->gadget); |
1779 | spin_lock(&udc->lock); | ||
1780 | } | ||
1757 | } | 1781 | } |
1758 | udc->vbus_prev = vbus; | 1782 | udc->vbus_prev = vbus; |
1759 | } | 1783 | } |
@@ -1825,7 +1849,7 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1825 | 1849 | ||
1826 | if (!udc->pdev) | 1850 | if (!udc->pdev) |
1827 | return -ENODEV; | 1851 | return -ENODEV; |
1828 | if (driver != udc->driver) | 1852 | if (driver != udc->driver || !driver->unbind) |
1829 | return -EINVAL; | 1853 | return -EINVAL; |
1830 | 1854 | ||
1831 | if (udc->vbus_pin != -1) | 1855 | if (udc->vbus_pin != -1) |
@@ -1840,6 +1864,9 @@ int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) | |||
1840 | toggle_bias(0); | 1864 | toggle_bias(0); |
1841 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); | 1865 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
1842 | 1866 | ||
1867 | if (udc->driver->disconnect) | ||
1868 | udc->driver->disconnect(&udc->gadget); | ||
1869 | |||
1843 | driver->unbind(&udc->gadget); | 1870 | driver->unbind(&udc->gadget); |
1844 | udc->gadget.dev.driver = NULL; | 1871 | udc->gadget.dev.driver = NULL; |
1845 | udc->driver = NULL; | 1872 | udc->driver = NULL; |
@@ -1879,6 +1906,7 @@ static int __init usba_udc_probe(struct platform_device *pdev) | |||
1879 | goto err_get_hclk; | 1906 | goto err_get_hclk; |
1880 | } | 1907 | } |
1881 | 1908 | ||
1909 | spin_lock_init(&udc->lock); | ||
1882 | udc->pdev = pdev; | 1910 | udc->pdev = pdev; |
1883 | udc->pclk = pclk; | 1911 | udc->pclk = pclk; |
1884 | udc->hclk = hclk; | 1912 | udc->hclk = hclk; |
diff --git a/drivers/usb/gadget/pxa27x_udc.c b/drivers/usb/gadget/pxa27x_udc.c index 75eba202f737..499b7a23f351 100644 --- a/drivers/usb/gadget/pxa27x_udc.c +++ b/drivers/usb/gadget/pxa27x_udc.c | |||
@@ -1546,7 +1546,6 @@ static __init void udc_init_data(struct pxa_udc *dev) | |||
1546 | INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); | 1546 | INIT_LIST_HEAD(&dev->gadget.ep0->ep_list); |
1547 | dev->udc_usb_ep[0].pxa_ep = &dev->pxa_ep[0]; | 1547 | dev->udc_usb_ep[0].pxa_ep = &dev->pxa_ep[0]; |
1548 | ep0_idle(dev); | 1548 | ep0_idle(dev); |
1549 | strcpy(dev->dev->bus_id, ""); | ||
1550 | 1549 | ||
1551 | /* PXA endpoints init */ | 1550 | /* PXA endpoints init */ |
1552 | for (i = 0; i < NR_PXA_ENDPOINTS; i++) { | 1551 | for (i = 0; i < NR_PXA_ENDPOINTS; i++) { |
@@ -1746,13 +1745,10 @@ static void handle_ep0_ctrl_req(struct pxa_udc *udc, | |||
1746 | ep_err(ep, "wrong to have extra bytes for setup : 0x%08x\n", i); | 1745 | ep_err(ep, "wrong to have extra bytes for setup : 0x%08x\n", i); |
1747 | } | 1746 | } |
1748 | 1747 | ||
1749 | le16_to_cpus(&u.r.wValue); | ||
1750 | le16_to_cpus(&u.r.wIndex); | ||
1751 | le16_to_cpus(&u.r.wLength); | ||
1752 | |||
1753 | ep_dbg(ep, "SETUP %02x.%02x v%04x i%04x l%04x\n", | 1748 | ep_dbg(ep, "SETUP %02x.%02x v%04x i%04x l%04x\n", |
1754 | u.r.bRequestType, u.r.bRequest, | 1749 | u.r.bRequestType, u.r.bRequest, |
1755 | u.r.wValue, u.r.wIndex, u.r.wLength); | 1750 | le16_to_cpu(u.r.wValue), le16_to_cpu(u.r.wIndex), |
1751 | le16_to_cpu(u.r.wLength)); | ||
1756 | if (unlikely(have_extrabytes)) | 1752 | if (unlikely(have_extrabytes)) |
1757 | goto stall; | 1753 | goto stall; |
1758 | 1754 | ||
@@ -2296,7 +2292,8 @@ static void pxa_udc_shutdown(struct platform_device *_dev) | |||
2296 | { | 2292 | { |
2297 | struct pxa_udc *udc = platform_get_drvdata(_dev); | 2293 | struct pxa_udc *udc = platform_get_drvdata(_dev); |
2298 | 2294 | ||
2299 | udc_disable(udc); | 2295 | if (udc_readl(udc, UDCCR) & UDCCR_UDE) |
2296 | udc_disable(udc); | ||
2300 | } | 2297 | } |
2301 | 2298 | ||
2302 | #ifdef CONFIG_PM | 2299 | #ifdef CONFIG_PM |
@@ -2361,9 +2358,8 @@ static int pxa_udc_resume(struct platform_device *_dev) | |||
2361 | * Upon exit from sleep mode and before clearing OTGPH, | 2358 | * Upon exit from sleep mode and before clearing OTGPH, |
2362 | * Software must configure the USB OTG pad, UDC, and UHC | 2359 | * Software must configure the USB OTG pad, UDC, and UHC |
2363 | * to the state they were in before entering sleep mode. | 2360 | * to the state they were in before entering sleep mode. |
2364 | * | ||
2365 | * Should be : PSSR |= PSSR_OTGPH; | ||
2366 | */ | 2361 | */ |
2362 | PSSR |= PSSR_OTGPH; | ||
2367 | 2363 | ||
2368 | return 0; | 2364 | return 0; |
2369 | } | 2365 | } |
@@ -2387,6 +2383,9 @@ static struct platform_driver udc_driver = { | |||
2387 | 2383 | ||
2388 | static int __init udc_init(void) | 2384 | static int __init udc_init(void) |
2389 | { | 2385 | { |
2386 | if (!cpu_is_pxa27x()) | ||
2387 | return -ENODEV; | ||
2388 | |||
2390 | printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); | 2389 | printk(KERN_INFO "%s: version %s\n", driver_name, DRIVER_VERSION); |
2391 | return platform_driver_probe(&udc_driver, pxa_udc_probe); | 2390 | return platform_driver_probe(&udc_driver, pxa_udc_probe); |
2392 | } | 2391 | } |
diff --git a/drivers/usb/gadget/pxa27x_udc.h b/drivers/usb/gadget/pxa27x_udc.h index 1d1b7936ee11..97453db924ff 100644 --- a/drivers/usb/gadget/pxa27x_udc.h +++ b/drivers/usb/gadget/pxa27x_udc.h | |||
@@ -484,4 +484,12 @@ static inline struct pxa_udc *to_gadget_udc(struct usb_gadget *gadget) | |||
484 | #define ep_warn(ep, fmt, arg...) \ | 484 | #define ep_warn(ep, fmt, arg...) \ |
485 | dev_warn(ep->dev->dev, "%s:%s:" fmt, EPNAME(ep), __func__, ## arg) | 485 | dev_warn(ep->dev->dev, "%s:%s:" fmt, EPNAME(ep), __func__, ## arg) |
486 | 486 | ||
487 | /* | ||
488 | * Cannot include pxa-regs.h, as register names are similar. | ||
489 | * So PSSR is redefined here. This should be removed once UDC registers will | ||
490 | * be gone from pxa-regs.h. | ||
491 | */ | ||
492 | #define PSSR __REG(0x40F00004) /* Power Manager Sleep Status */ | ||
493 | #define PSSR_OTGPH (1 << 6) /* OTG Peripheral Hold */ | ||
494 | |||
487 | #endif /* __LINUX_USB_GADGET_PXA27X_H */ | 495 | #endif /* __LINUX_USB_GADGET_PXA27X_H */ |
diff --git a/drivers/usb/gadget/serial.c b/drivers/usb/gadget/serial.c index 54cdd6f94034..fa019fa73334 100644 --- a/drivers/usb/gadget/serial.c +++ b/drivers/usb/gadget/serial.c | |||
@@ -14,7 +14,6 @@ | |||
14 | * This software is distributed under the terms of the GNU General | 14 | * This software is distributed under the terms of the GNU General |
15 | * Public License ("GPL") as published by the Free Software Foundation, | 15 | * Public License ("GPL") as published by the Free Software Foundation, |
16 | * either version 2 of that License or (at your option) any later version. | 16 | * either version 2 of that License or (at your option) any later version. |
17 | * | ||
18 | */ | 17 | */ |
19 | 18 | ||
20 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
@@ -33,7 +32,7 @@ | |||
33 | /* Defines */ | 32 | /* Defines */ |
34 | 33 | ||
35 | #define GS_VERSION_STR "v2.2" | 34 | #define GS_VERSION_STR "v2.2" |
36 | #define GS_VERSION_NUM 0x0202 | 35 | #define GS_VERSION_NUM 0x2200 |
37 | 36 | ||
38 | #define GS_LONG_NAME "Gadget Serial" | 37 | #define GS_LONG_NAME "Gadget Serial" |
39 | #define GS_SHORT_NAME "g_serial" | 38 | #define GS_SHORT_NAME "g_serial" |
@@ -41,7 +40,11 @@ | |||
41 | #define GS_MAJOR 127 | 40 | #define GS_MAJOR 127 |
42 | #define GS_MINOR_START 0 | 41 | #define GS_MINOR_START 0 |
43 | 42 | ||
44 | #define GS_NUM_PORTS 16 | 43 | /* REVISIT only one port is supported for now; |
44 | * see gs_{send,recv}_packet() ... no multiplexing, | ||
45 | * and no support for multiple ACM devices. | ||
46 | */ | ||
47 | #define GS_NUM_PORTS 1 | ||
45 | 48 | ||
46 | #define GS_NUM_CONFIGS 1 | 49 | #define GS_NUM_CONFIGS 1 |
47 | #define GS_NO_CONFIG_ID 0 | 50 | #define GS_NO_CONFIG_ID 0 |
@@ -65,6 +68,9 @@ | |||
65 | 68 | ||
66 | #define GS_DEFAULT_USE_ACM 0 | 69 | #define GS_DEFAULT_USE_ACM 0 |
67 | 70 | ||
71 | /* 9600-8-N-1 ... matches init_termios.c_cflag and defaults | ||
72 | * expected by "usbser.sys" on MS-Windows. | ||
73 | */ | ||
68 | #define GS_DEFAULT_DTE_RATE 9600 | 74 | #define GS_DEFAULT_DTE_RATE 9600 |
69 | #define GS_DEFAULT_DATA_BITS 8 | 75 | #define GS_DEFAULT_DATA_BITS 8 |
70 | #define GS_DEFAULT_PARITY USB_CDC_NO_PARITY | 76 | #define GS_DEFAULT_PARITY USB_CDC_NO_PARITY |
@@ -107,10 +113,6 @@ static int debug = 1; | |||
107 | #define GS_NOTIFY_MAXPACKET 8 | 113 | #define GS_NOTIFY_MAXPACKET 8 |
108 | 114 | ||
109 | 115 | ||
110 | /* Structures */ | ||
111 | |||
112 | struct gs_dev; | ||
113 | |||
114 | /* circular buffer */ | 116 | /* circular buffer */ |
115 | struct gs_buf { | 117 | struct gs_buf { |
116 | unsigned int buf_size; | 118 | unsigned int buf_size; |
@@ -119,12 +121,6 @@ struct gs_buf { | |||
119 | char *buf_put; | 121 | char *buf_put; |
120 | }; | 122 | }; |
121 | 123 | ||
122 | /* list of requests */ | ||
123 | struct gs_req_entry { | ||
124 | struct list_head re_entry; | ||
125 | struct usb_request *re_req; | ||
126 | }; | ||
127 | |||
128 | /* the port structure holds info for each port, one for each minor number */ | 124 | /* the port structure holds info for each port, one for each minor number */ |
129 | struct gs_port { | 125 | struct gs_port { |
130 | struct gs_dev *port_dev; /* pointer to device struct */ | 126 | struct gs_dev *port_dev; /* pointer to device struct */ |
@@ -164,26 +160,7 @@ struct gs_dev { | |||
164 | 160 | ||
165 | /* Functions */ | 161 | /* Functions */ |
166 | 162 | ||
167 | /* module */ | 163 | /* tty driver internals */ |
168 | static int __init gs_module_init(void); | ||
169 | static void __exit gs_module_exit(void); | ||
170 | |||
171 | /* tty driver */ | ||
172 | static int gs_open(struct tty_struct *tty, struct file *file); | ||
173 | static void gs_close(struct tty_struct *tty, struct file *file); | ||
174 | static int gs_write(struct tty_struct *tty, | ||
175 | const unsigned char *buf, int count); | ||
176 | static int gs_put_char(struct tty_struct *tty, unsigned char ch); | ||
177 | static void gs_flush_chars(struct tty_struct *tty); | ||
178 | static int gs_write_room(struct tty_struct *tty); | ||
179 | static int gs_chars_in_buffer(struct tty_struct *tty); | ||
180 | static void gs_throttle(struct tty_struct * tty); | ||
181 | static void gs_unthrottle(struct tty_struct * tty); | ||
182 | static void gs_break(struct tty_struct *tty, int break_state); | ||
183 | static int gs_ioctl(struct tty_struct *tty, struct file *file, | ||
184 | unsigned int cmd, unsigned long arg); | ||
185 | static void gs_set_termios(struct tty_struct *tty, struct ktermios *old); | ||
186 | |||
187 | static int gs_send(struct gs_dev *dev); | 164 | static int gs_send(struct gs_dev *dev); |
188 | static int gs_send_packet(struct gs_dev *dev, char *packet, | 165 | static int gs_send_packet(struct gs_dev *dev, char *packet, |
189 | unsigned int size); | 166 | unsigned int size); |
@@ -192,19 +169,7 @@ static int gs_recv_packet(struct gs_dev *dev, char *packet, | |||
192 | static void gs_read_complete(struct usb_ep *ep, struct usb_request *req); | 169 | static void gs_read_complete(struct usb_ep *ep, struct usb_request *req); |
193 | static void gs_write_complete(struct usb_ep *ep, struct usb_request *req); | 170 | static void gs_write_complete(struct usb_ep *ep, struct usb_request *req); |
194 | 171 | ||
195 | /* gadget driver */ | 172 | /* gadget driver internals */ |
196 | static int gs_bind(struct usb_gadget *gadget); | ||
197 | static void gs_unbind(struct usb_gadget *gadget); | ||
198 | static int gs_setup(struct usb_gadget *gadget, | ||
199 | const struct usb_ctrlrequest *ctrl); | ||
200 | static int gs_setup_standard(struct usb_gadget *gadget, | ||
201 | const struct usb_ctrlrequest *ctrl); | ||
202 | static int gs_setup_class(struct usb_gadget *gadget, | ||
203 | const struct usb_ctrlrequest *ctrl); | ||
204 | static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req); | ||
205 | static void gs_setup_complete_set_line_coding(struct usb_ep *ep, | ||
206 | struct usb_request *req); | ||
207 | static void gs_disconnect(struct usb_gadget *gadget); | ||
208 | static int gs_set_config(struct gs_dev *dev, unsigned config); | 173 | static int gs_set_config(struct gs_dev *dev, unsigned config); |
209 | static void gs_reset_config(struct gs_dev *dev); | 174 | static void gs_reset_config(struct gs_dev *dev); |
210 | static int gs_build_config_buf(u8 *buf, struct usb_gadget *g, | 175 | static int gs_build_config_buf(u8 *buf, struct usb_gadget *g, |
@@ -214,10 +179,6 @@ static struct usb_request *gs_alloc_req(struct usb_ep *ep, unsigned int len, | |||
214 | gfp_t kmalloc_flags); | 179 | gfp_t kmalloc_flags); |
215 | static void gs_free_req(struct usb_ep *ep, struct usb_request *req); | 180 | static void gs_free_req(struct usb_ep *ep, struct usb_request *req); |
216 | 181 | ||
217 | static struct gs_req_entry *gs_alloc_req_entry(struct usb_ep *ep, unsigned len, | ||
218 | gfp_t kmalloc_flags); | ||
219 | static void gs_free_req_entry(struct usb_ep *ep, struct gs_req_entry *req); | ||
220 | |||
221 | static int gs_alloc_ports(struct gs_dev *dev, gfp_t kmalloc_flags); | 182 | static int gs_alloc_ports(struct gs_dev *dev, gfp_t kmalloc_flags); |
222 | static void gs_free_ports(struct gs_dev *dev); | 183 | static void gs_free_ports(struct gs_dev *dev); |
223 | 184 | ||
@@ -232,62 +193,15 @@ static unsigned int gs_buf_put(struct gs_buf *gb, const char *buf, | |||
232 | static unsigned int gs_buf_get(struct gs_buf *gb, char *buf, | 193 | static unsigned int gs_buf_get(struct gs_buf *gb, char *buf, |
233 | unsigned int count); | 194 | unsigned int count); |
234 | 195 | ||
235 | /* external functions */ | ||
236 | extern int net2280_set_fifo_mode(struct usb_gadget *gadget, int mode); | ||
237 | |||
238 | 196 | ||
239 | /* Globals */ | 197 | /* Globals */ |
240 | 198 | ||
241 | static struct gs_dev *gs_device; | 199 | static struct gs_dev *gs_device; |
242 | 200 | ||
243 | static const char *EP_IN_NAME; | ||
244 | static const char *EP_OUT_NAME; | ||
245 | static const char *EP_NOTIFY_NAME; | ||
246 | |||
247 | static struct mutex gs_open_close_lock[GS_NUM_PORTS]; | 201 | static struct mutex gs_open_close_lock[GS_NUM_PORTS]; |
248 | 202 | ||
249 | static unsigned int read_q_size = GS_DEFAULT_READ_Q_SIZE; | ||
250 | static unsigned int write_q_size = GS_DEFAULT_WRITE_Q_SIZE; | ||
251 | |||
252 | static unsigned int write_buf_size = GS_DEFAULT_WRITE_BUF_SIZE; | ||
253 | |||
254 | static unsigned int use_acm = GS_DEFAULT_USE_ACM; | ||
255 | |||
256 | |||
257 | /* tty driver struct */ | ||
258 | static const struct tty_operations gs_tty_ops = { | ||
259 | .open = gs_open, | ||
260 | .close = gs_close, | ||
261 | .write = gs_write, | ||
262 | .put_char = gs_put_char, | ||
263 | .flush_chars = gs_flush_chars, | ||
264 | .write_room = gs_write_room, | ||
265 | .ioctl = gs_ioctl, | ||
266 | .set_termios = gs_set_termios, | ||
267 | .throttle = gs_throttle, | ||
268 | .unthrottle = gs_unthrottle, | ||
269 | .break_ctl = gs_break, | ||
270 | .chars_in_buffer = gs_chars_in_buffer, | ||
271 | }; | ||
272 | static struct tty_driver *gs_tty_driver; | ||
273 | |||
274 | /* gadget driver struct */ | ||
275 | static struct usb_gadget_driver gs_gadget_driver = { | ||
276 | #ifdef CONFIG_USB_GADGET_DUALSPEED | ||
277 | .speed = USB_SPEED_HIGH, | ||
278 | #else | ||
279 | .speed = USB_SPEED_FULL, | ||
280 | #endif /* CONFIG_USB_GADGET_DUALSPEED */ | ||
281 | .function = GS_LONG_NAME, | ||
282 | .bind = gs_bind, | ||
283 | .unbind = gs_unbind, | ||
284 | .setup = gs_setup, | ||
285 | .disconnect = gs_disconnect, | ||
286 | .driver = { | ||
287 | .name = GS_SHORT_NAME, | ||
288 | }, | ||
289 | }; | ||
290 | 203 | ||
204 | /*-------------------------------------------------------------------------*/ | ||
291 | 205 | ||
292 | /* USB descriptors */ | 206 | /* USB descriptors */ |
293 | 207 | ||
@@ -304,7 +218,6 @@ static char manufacturer[50]; | |||
304 | static struct usb_string gs_strings[] = { | 218 | static struct usb_string gs_strings[] = { |
305 | { GS_MANUFACTURER_STR_ID, manufacturer }, | 219 | { GS_MANUFACTURER_STR_ID, manufacturer }, |
306 | { GS_PRODUCT_STR_ID, GS_LONG_NAME }, | 220 | { GS_PRODUCT_STR_ID, GS_LONG_NAME }, |
307 | { GS_SERIAL_STR_ID, "0" }, | ||
308 | { GS_BULK_CONFIG_STR_ID, "Gadget Serial Bulk" }, | 221 | { GS_BULK_CONFIG_STR_ID, "Gadget Serial Bulk" }, |
309 | { GS_ACM_CONFIG_STR_ID, "Gadget Serial CDC ACM" }, | 222 | { GS_ACM_CONFIG_STR_ID, "Gadget Serial CDC ACM" }, |
310 | { GS_CONTROL_STR_ID, "Gadget Serial Control" }, | 223 | { GS_CONTROL_STR_ID, "Gadget Serial Control" }, |
@@ -327,7 +240,6 @@ static struct usb_device_descriptor gs_device_desc = { | |||
327 | .idProduct = __constant_cpu_to_le16(GS_PRODUCT_ID), | 240 | .idProduct = __constant_cpu_to_le16(GS_PRODUCT_ID), |
328 | .iManufacturer = GS_MANUFACTURER_STR_ID, | 241 | .iManufacturer = GS_MANUFACTURER_STR_ID, |
329 | .iProduct = GS_PRODUCT_STR_ID, | 242 | .iProduct = GS_PRODUCT_STR_ID, |
330 | .iSerialNumber = GS_SERIAL_STR_ID, | ||
331 | .bNumConfigurations = GS_NUM_CONFIGS, | 243 | .bNumConfigurations = GS_NUM_CONFIGS, |
332 | }; | 244 | }; |
333 | 245 | ||
@@ -364,7 +276,7 @@ static const struct usb_interface_descriptor gs_bulk_interface_desc = { | |||
364 | .bDescriptorType = USB_DT_INTERFACE, | 276 | .bDescriptorType = USB_DT_INTERFACE, |
365 | .bInterfaceNumber = GS_BULK_INTERFACE_ID, | 277 | .bInterfaceNumber = GS_BULK_INTERFACE_ID, |
366 | .bNumEndpoints = 2, | 278 | .bNumEndpoints = 2, |
367 | .bInterfaceClass = USB_CLASS_CDC_DATA, | 279 | .bInterfaceClass = USB_CLASS_VENDOR_SPEC, |
368 | .bInterfaceSubClass = 0, | 280 | .bInterfaceSubClass = 0, |
369 | .bInterfaceProtocol = 0, | 281 | .bInterfaceProtocol = 0, |
370 | .iInterface = GS_DATA_STR_ID, | 282 | .iInterface = GS_DATA_STR_ID, |
@@ -521,6 +433,8 @@ static const struct usb_descriptor_header *gs_acm_highspeed_function[] = { | |||
521 | }; | 433 | }; |
522 | 434 | ||
523 | 435 | ||
436 | /*-------------------------------------------------------------------------*/ | ||
437 | |||
524 | /* Module */ | 438 | /* Module */ |
525 | MODULE_DESCRIPTION(GS_LONG_NAME); | 439 | MODULE_DESCRIPTION(GS_LONG_NAME); |
526 | MODULE_AUTHOR("Al Borchers"); | 440 | MODULE_AUTHOR("Al Borchers"); |
@@ -531,84 +445,23 @@ module_param(debug, int, S_IRUGO|S_IWUSR); | |||
531 | MODULE_PARM_DESC(debug, "Enable debugging, 0=off, 1=on"); | 445 | MODULE_PARM_DESC(debug, "Enable debugging, 0=off, 1=on"); |
532 | #endif | 446 | #endif |
533 | 447 | ||
448 | static unsigned int read_q_size = GS_DEFAULT_READ_Q_SIZE; | ||
534 | module_param(read_q_size, uint, S_IRUGO); | 449 | module_param(read_q_size, uint, S_IRUGO); |
535 | MODULE_PARM_DESC(read_q_size, "Read request queue size, default=32"); | 450 | MODULE_PARM_DESC(read_q_size, "Read request queue size, default=32"); |
536 | 451 | ||
452 | static unsigned int write_q_size = GS_DEFAULT_WRITE_Q_SIZE; | ||
537 | module_param(write_q_size, uint, S_IRUGO); | 453 | module_param(write_q_size, uint, S_IRUGO); |
538 | MODULE_PARM_DESC(write_q_size, "Write request queue size, default=32"); | 454 | MODULE_PARM_DESC(write_q_size, "Write request queue size, default=32"); |
539 | 455 | ||
456 | static unsigned int write_buf_size = GS_DEFAULT_WRITE_BUF_SIZE; | ||
540 | module_param(write_buf_size, uint, S_IRUGO); | 457 | module_param(write_buf_size, uint, S_IRUGO); |
541 | MODULE_PARM_DESC(write_buf_size, "Write buffer size, default=8192"); | 458 | MODULE_PARM_DESC(write_buf_size, "Write buffer size, default=8192"); |
542 | 459 | ||
460 | static unsigned int use_acm = GS_DEFAULT_USE_ACM; | ||
543 | module_param(use_acm, uint, S_IRUGO); | 461 | module_param(use_acm, uint, S_IRUGO); |
544 | MODULE_PARM_DESC(use_acm, "Use CDC ACM, 0=no, 1=yes, default=no"); | 462 | MODULE_PARM_DESC(use_acm, "Use CDC ACM, 0=no, 1=yes, default=no"); |
545 | 463 | ||
546 | module_init(gs_module_init); | 464 | /*-------------------------------------------------------------------------*/ |
547 | module_exit(gs_module_exit); | ||
548 | |||
549 | /* | ||
550 | * gs_module_init | ||
551 | * | ||
552 | * Register as a USB gadget driver and a tty driver. | ||
553 | */ | ||
554 | static int __init gs_module_init(void) | ||
555 | { | ||
556 | int i; | ||
557 | int retval; | ||
558 | |||
559 | retval = usb_gadget_register_driver(&gs_gadget_driver); | ||
560 | if (retval) { | ||
561 | pr_err("gs_module_init: cannot register gadget driver, " | ||
562 | "ret=%d\n", retval); | ||
563 | return retval; | ||
564 | } | ||
565 | |||
566 | gs_tty_driver = alloc_tty_driver(GS_NUM_PORTS); | ||
567 | if (!gs_tty_driver) | ||
568 | return -ENOMEM; | ||
569 | gs_tty_driver->owner = THIS_MODULE; | ||
570 | gs_tty_driver->driver_name = GS_SHORT_NAME; | ||
571 | gs_tty_driver->name = "ttygs"; | ||
572 | gs_tty_driver->major = GS_MAJOR; | ||
573 | gs_tty_driver->minor_start = GS_MINOR_START; | ||
574 | gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; | ||
575 | gs_tty_driver->subtype = SERIAL_TYPE_NORMAL; | ||
576 | gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | ||
577 | gs_tty_driver->init_termios = tty_std_termios; | ||
578 | gs_tty_driver->init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCAL; | ||
579 | tty_set_operations(gs_tty_driver, &gs_tty_ops); | ||
580 | |||
581 | for (i=0; i < GS_NUM_PORTS; i++) | ||
582 | mutex_init(&gs_open_close_lock[i]); | ||
583 | |||
584 | retval = tty_register_driver(gs_tty_driver); | ||
585 | if (retval) { | ||
586 | usb_gadget_unregister_driver(&gs_gadget_driver); | ||
587 | put_tty_driver(gs_tty_driver); | ||
588 | pr_err("gs_module_init: cannot register tty driver, " | ||
589 | "ret=%d\n", retval); | ||
590 | return retval; | ||
591 | } | ||
592 | |||
593 | pr_info("gs_module_init: %s %s loaded\n", | ||
594 | GS_LONG_NAME, GS_VERSION_STR); | ||
595 | return 0; | ||
596 | } | ||
597 | |||
598 | /* | ||
599 | * gs_module_exit | ||
600 | * | ||
601 | * Unregister as a tty driver and a USB gadget driver. | ||
602 | */ | ||
603 | static void __exit gs_module_exit(void) | ||
604 | { | ||
605 | tty_unregister_driver(gs_tty_driver); | ||
606 | put_tty_driver(gs_tty_driver); | ||
607 | usb_gadget_unregister_driver(&gs_gadget_driver); | ||
608 | |||
609 | pr_info("gs_module_exit: %s %s unloaded\n", | ||
610 | GS_LONG_NAME, GS_VERSION_STR); | ||
611 | } | ||
612 | 465 | ||
613 | /* TTY Driver */ | 466 | /* TTY Driver */ |
614 | 467 | ||
@@ -753,15 +606,15 @@ exit_unlock_dev: | |||
753 | * gs_close | 606 | * gs_close |
754 | */ | 607 | */ |
755 | 608 | ||
756 | #define GS_WRITE_FINISHED_EVENT_SAFELY(p) \ | 609 | static int gs_write_finished_event_safely(struct gs_port *p) |
757 | ({ \ | 610 | { |
758 | int cond; \ | 611 | int cond; |
759 | \ | 612 | |
760 | spin_lock_irq(&(p)->port_lock); \ | 613 | spin_lock_irq(&(p)->port_lock); |
761 | cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf); \ | 614 | cond = !(p)->port_dev || !gs_buf_data_avail((p)->port_write_buf); |
762 | spin_unlock_irq(&(p)->port_lock); \ | 615 | spin_unlock_irq(&(p)->port_lock); |
763 | cond; \ | 616 | return cond; |
764 | }) | 617 | } |
765 | 618 | ||
766 | static void gs_close(struct tty_struct *tty, struct file *file) | 619 | static void gs_close(struct tty_struct *tty, struct file *file) |
767 | { | 620 | { |
@@ -807,7 +660,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) | |||
807 | if (gs_buf_data_avail(port->port_write_buf) > 0) { | 660 | if (gs_buf_data_avail(port->port_write_buf) > 0) { |
808 | spin_unlock_irq(&port->port_lock); | 661 | spin_unlock_irq(&port->port_lock); |
809 | wait_event_interruptible_timeout(port->port_write_wait, | 662 | wait_event_interruptible_timeout(port->port_write_wait, |
810 | GS_WRITE_FINISHED_EVENT_SAFELY(port), | 663 | gs_write_finished_event_safely(port), |
811 | GS_CLOSE_TIMEOUT * HZ); | 664 | GS_CLOSE_TIMEOUT * HZ); |
812 | spin_lock_irq(&port->port_lock); | 665 | spin_lock_irq(&port->port_lock); |
813 | } | 666 | } |
@@ -1065,6 +918,23 @@ static void gs_set_termios(struct tty_struct *tty, struct ktermios *old) | |||
1065 | { | 918 | { |
1066 | } | 919 | } |
1067 | 920 | ||
921 | static const struct tty_operations gs_tty_ops = { | ||
922 | .open = gs_open, | ||
923 | .close = gs_close, | ||
924 | .write = gs_write, | ||
925 | .put_char = gs_put_char, | ||
926 | .flush_chars = gs_flush_chars, | ||
927 | .write_room = gs_write_room, | ||
928 | .ioctl = gs_ioctl, | ||
929 | .set_termios = gs_set_termios, | ||
930 | .throttle = gs_throttle, | ||
931 | .unthrottle = gs_unthrottle, | ||
932 | .break_ctl = gs_break, | ||
933 | .chars_in_buffer = gs_chars_in_buffer, | ||
934 | }; | ||
935 | |||
936 | /*-------------------------------------------------------------------------*/ | ||
937 | |||
1068 | /* | 938 | /* |
1069 | * gs_send | 939 | * gs_send |
1070 | * | 940 | * |
@@ -1080,7 +950,6 @@ static int gs_send(struct gs_dev *dev) | |||
1080 | unsigned long flags; | 950 | unsigned long flags; |
1081 | struct usb_ep *ep; | 951 | struct usb_ep *ep; |
1082 | struct usb_request *req; | 952 | struct usb_request *req; |
1083 | struct gs_req_entry *req_entry; | ||
1084 | 953 | ||
1085 | if (dev == NULL) { | 954 | if (dev == NULL) { |
1086 | pr_err("gs_send: NULL device pointer\n"); | 955 | pr_err("gs_send: NULL device pointer\n"); |
@@ -1093,10 +962,8 @@ static int gs_send(struct gs_dev *dev) | |||
1093 | 962 | ||
1094 | while(!list_empty(&dev->dev_req_list)) { | 963 | while(!list_empty(&dev->dev_req_list)) { |
1095 | 964 | ||
1096 | req_entry = list_entry(dev->dev_req_list.next, | 965 | req = list_entry(dev->dev_req_list.next, |
1097 | struct gs_req_entry, re_entry); | 966 | struct usb_request, list); |
1098 | |||
1099 | req = req_entry->re_req; | ||
1100 | 967 | ||
1101 | len = gs_send_packet(dev, req->buf, ep->maxpacket); | 968 | len = gs_send_packet(dev, req->buf, ep->maxpacket); |
1102 | 969 | ||
@@ -1106,7 +973,7 @@ static int gs_send(struct gs_dev *dev) | |||
1106 | *((unsigned char *)req->buf), | 973 | *((unsigned char *)req->buf), |
1107 | *((unsigned char *)req->buf+1), | 974 | *((unsigned char *)req->buf+1), |
1108 | *((unsigned char *)req->buf+2)); | 975 | *((unsigned char *)req->buf+2)); |
1109 | list_del(&req_entry->re_entry); | 976 | list_del(&req->list); |
1110 | req->length = len; | 977 | req->length = len; |
1111 | spin_unlock_irqrestore(&dev->dev_lock, flags); | 978 | spin_unlock_irqrestore(&dev->dev_lock, flags); |
1112 | if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) { | 979 | if ((ret=usb_ep_queue(ep, req, GFP_ATOMIC))) { |
@@ -1289,7 +1156,6 @@ requeue: | |||
1289 | static void gs_write_complete(struct usb_ep *ep, struct usb_request *req) | 1156 | static void gs_write_complete(struct usb_ep *ep, struct usb_request *req) |
1290 | { | 1157 | { |
1291 | struct gs_dev *dev = ep->driver_data; | 1158 | struct gs_dev *dev = ep->driver_data; |
1292 | struct gs_req_entry *gs_req = req->context; | ||
1293 | 1159 | ||
1294 | if (dev == NULL) { | 1160 | if (dev == NULL) { |
1295 | pr_err("gs_write_complete: NULL device pointer\n"); | 1161 | pr_err("gs_write_complete: NULL device pointer\n"); |
@@ -1300,13 +1166,8 @@ static void gs_write_complete(struct usb_ep *ep, struct usb_request *req) | |||
1300 | case 0: | 1166 | case 0: |
1301 | /* normal completion */ | 1167 | /* normal completion */ |
1302 | requeue: | 1168 | requeue: |
1303 | if (gs_req == NULL) { | ||
1304 | pr_err("gs_write_complete: NULL request pointer\n"); | ||
1305 | return; | ||
1306 | } | ||
1307 | |||
1308 | spin_lock(&dev->dev_lock); | 1169 | spin_lock(&dev->dev_lock); |
1309 | list_add(&gs_req->re_entry, &dev->dev_req_list); | 1170 | list_add(&req->list, &dev->dev_req_list); |
1310 | spin_unlock(&dev->dev_lock); | 1171 | spin_unlock(&dev->dev_lock); |
1311 | 1172 | ||
1312 | gs_send(dev); | 1173 | gs_send(dev); |
@@ -1328,9 +1189,39 @@ requeue: | |||
1328 | } | 1189 | } |
1329 | } | 1190 | } |
1330 | 1191 | ||
1192 | /*-------------------------------------------------------------------------*/ | ||
1193 | |||
1331 | /* Gadget Driver */ | 1194 | /* Gadget Driver */ |
1332 | 1195 | ||
1333 | /* | 1196 | /* |
1197 | * gs_unbind | ||
1198 | * | ||
1199 | * Called on module unload. Frees the control request and device | ||
1200 | * structure. | ||
1201 | */ | ||
1202 | static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) | ||
1203 | { | ||
1204 | struct gs_dev *dev = get_gadget_data(gadget); | ||
1205 | |||
1206 | gs_device = NULL; | ||
1207 | |||
1208 | /* read/write requests already freed, only control request remains */ | ||
1209 | if (dev != NULL) { | ||
1210 | if (dev->dev_ctrl_req != NULL) { | ||
1211 | gs_free_req(gadget->ep0, dev->dev_ctrl_req); | ||
1212 | dev->dev_ctrl_req = NULL; | ||
1213 | } | ||
1214 | gs_reset_config(dev); | ||
1215 | gs_free_ports(dev); | ||
1216 | kfree(dev); | ||
1217 | set_gadget_data(gadget, NULL); | ||
1218 | } | ||
1219 | |||
1220 | pr_info("gs_unbind: %s %s unbound\n", GS_LONG_NAME, | ||
1221 | GS_VERSION_STR); | ||
1222 | } | ||
1223 | |||
1224 | /* | ||
1334 | * gs_bind | 1225 | * gs_bind |
1335 | * | 1226 | * |
1336 | * Called on module load. Allocates and initializes the device | 1227 | * Called on module load. Allocates and initializes the device |
@@ -1362,19 +1253,23 @@ static int __init gs_bind(struct usb_gadget *gadget) | |||
1362 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0099); | 1253 | __constant_cpu_to_le16(GS_VERSION_NUM|0x0099); |
1363 | } | 1254 | } |
1364 | 1255 | ||
1256 | dev = kzalloc(sizeof(struct gs_dev), GFP_KERNEL); | ||
1257 | if (dev == NULL) | ||
1258 | return -ENOMEM; | ||
1259 | |||
1365 | usb_ep_autoconfig_reset(gadget); | 1260 | usb_ep_autoconfig_reset(gadget); |
1366 | 1261 | ||
1367 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); | 1262 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_in_desc); |
1368 | if (!ep) | 1263 | if (!ep) |
1369 | goto autoconf_fail; | 1264 | goto autoconf_fail; |
1370 | EP_IN_NAME = ep->name; | 1265 | dev->dev_in_ep = ep; |
1371 | ep->driver_data = ep; /* claim the endpoint */ | 1266 | ep->driver_data = dev; /* claim the endpoint */ |
1372 | 1267 | ||
1373 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); | 1268 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_out_desc); |
1374 | if (!ep) | 1269 | if (!ep) |
1375 | goto autoconf_fail; | 1270 | goto autoconf_fail; |
1376 | EP_OUT_NAME = ep->name; | 1271 | dev->dev_out_ep = ep; |
1377 | ep->driver_data = ep; /* claim the endpoint */ | 1272 | ep->driver_data = dev; /* claim the endpoint */ |
1378 | 1273 | ||
1379 | if (use_acm) { | 1274 | if (use_acm) { |
1380 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); | 1275 | ep = usb_ep_autoconfig(gadget, &gs_fullspeed_notify_desc); |
@@ -1384,8 +1279,8 @@ static int __init gs_bind(struct usb_gadget *gadget) | |||
1384 | } | 1279 | } |
1385 | gs_device_desc.idProduct = __constant_cpu_to_le16( | 1280 | gs_device_desc.idProduct = __constant_cpu_to_le16( |
1386 | GS_CDC_PRODUCT_ID), | 1281 | GS_CDC_PRODUCT_ID), |
1387 | EP_NOTIFY_NAME = ep->name; | 1282 | dev->dev_notify_ep = ep; |
1388 | ep->driver_data = ep; /* claim the endpoint */ | 1283 | ep->driver_data = dev; /* claim the endpoint */ |
1389 | } | 1284 | } |
1390 | 1285 | ||
1391 | gs_device_desc.bDeviceClass = use_acm | 1286 | gs_device_desc.bDeviceClass = use_acm |
@@ -1415,9 +1310,7 @@ static int __init gs_bind(struct usb_gadget *gadget) | |||
1415 | gs_acm_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP; | 1310 | gs_acm_config_desc.bmAttributes |= USB_CONFIG_ATT_WAKEUP; |
1416 | } | 1311 | } |
1417 | 1312 | ||
1418 | gs_device = dev = kzalloc(sizeof(struct gs_dev), GFP_KERNEL); | 1313 | gs_device = dev; |
1419 | if (dev == NULL) | ||
1420 | return -ENOMEM; | ||
1421 | 1314 | ||
1422 | snprintf(manufacturer, sizeof(manufacturer), "%s %s with %s", | 1315 | snprintf(manufacturer, sizeof(manufacturer), "%s %s with %s", |
1423 | init_utsname()->sysname, init_utsname()->release, | 1316 | init_utsname()->sysname, init_utsname()->release, |
@@ -1441,8 +1334,6 @@ static int __init gs_bind(struct usb_gadget *gadget) | |||
1441 | gs_unbind(gadget); | 1334 | gs_unbind(gadget); |
1442 | return -ENOMEM; | 1335 | return -ENOMEM; |
1443 | } | 1336 | } |
1444 | dev->dev_ctrl_req->complete = gs_setup_complete; | ||
1445 | |||
1446 | gadget->ep0->driver_data = dev; | 1337 | gadget->ep0->driver_data = dev; |
1447 | 1338 | ||
1448 | pr_info("gs_bind: %s %s bound\n", | 1339 | pr_info("gs_bind: %s %s bound\n", |
@@ -1451,99 +1342,11 @@ static int __init gs_bind(struct usb_gadget *gadget) | |||
1451 | return 0; | 1342 | return 0; |
1452 | 1343 | ||
1453 | autoconf_fail: | 1344 | autoconf_fail: |
1345 | kfree(dev); | ||
1454 | pr_err("gs_bind: cannot autoconfigure on %s\n", gadget->name); | 1346 | pr_err("gs_bind: cannot autoconfigure on %s\n", gadget->name); |
1455 | return -ENODEV; | 1347 | return -ENODEV; |
1456 | } | 1348 | } |
1457 | 1349 | ||
1458 | /* | ||
1459 | * gs_unbind | ||
1460 | * | ||
1461 | * Called on module unload. Frees the control request and device | ||
1462 | * structure. | ||
1463 | */ | ||
1464 | static void /* __init_or_exit */ gs_unbind(struct usb_gadget *gadget) | ||
1465 | { | ||
1466 | struct gs_dev *dev = get_gadget_data(gadget); | ||
1467 | |||
1468 | gs_device = NULL; | ||
1469 | |||
1470 | /* read/write requests already freed, only control request remains */ | ||
1471 | if (dev != NULL) { | ||
1472 | if (dev->dev_ctrl_req != NULL) { | ||
1473 | gs_free_req(gadget->ep0, dev->dev_ctrl_req); | ||
1474 | dev->dev_ctrl_req = NULL; | ||
1475 | } | ||
1476 | gs_free_ports(dev); | ||
1477 | if (dev->dev_notify_ep) | ||
1478 | usb_ep_disable(dev->dev_notify_ep); | ||
1479 | if (dev->dev_in_ep) | ||
1480 | usb_ep_disable(dev->dev_in_ep); | ||
1481 | if (dev->dev_out_ep) | ||
1482 | usb_ep_disable(dev->dev_out_ep); | ||
1483 | kfree(dev); | ||
1484 | set_gadget_data(gadget, NULL); | ||
1485 | } | ||
1486 | |||
1487 | pr_info("gs_unbind: %s %s unbound\n", GS_LONG_NAME, | ||
1488 | GS_VERSION_STR); | ||
1489 | } | ||
1490 | |||
1491 | /* | ||
1492 | * gs_setup | ||
1493 | * | ||
1494 | * Implements all the control endpoint functionality that's not | ||
1495 | * handled in hardware or the hardware driver. | ||
1496 | * | ||
1497 | * Returns the size of the data sent to the host, or a negative | ||
1498 | * error number. | ||
1499 | */ | ||
1500 | static int gs_setup(struct usb_gadget *gadget, | ||
1501 | const struct usb_ctrlrequest *ctrl) | ||
1502 | { | ||
1503 | int ret = -EOPNOTSUPP; | ||
1504 | struct gs_dev *dev = get_gadget_data(gadget); | ||
1505 | struct usb_request *req = dev->dev_ctrl_req; | ||
1506 | u16 wIndex = le16_to_cpu(ctrl->wIndex); | ||
1507 | u16 wValue = le16_to_cpu(ctrl->wValue); | ||
1508 | u16 wLength = le16_to_cpu(ctrl->wLength); | ||
1509 | |||
1510 | req->complete = gs_setup_complete; | ||
1511 | |||
1512 | switch (ctrl->bRequestType & USB_TYPE_MASK) { | ||
1513 | case USB_TYPE_STANDARD: | ||
1514 | ret = gs_setup_standard(gadget,ctrl); | ||
1515 | break; | ||
1516 | |||
1517 | case USB_TYPE_CLASS: | ||
1518 | ret = gs_setup_class(gadget,ctrl); | ||
1519 | break; | ||
1520 | |||
1521 | default: | ||
1522 | pr_err("gs_setup: unknown request, type=%02x, request=%02x, " | ||
1523 | "value=%04x, index=%04x, length=%d\n", | ||
1524 | ctrl->bRequestType, ctrl->bRequest, | ||
1525 | wValue, wIndex, wLength); | ||
1526 | break; | ||
1527 | } | ||
1528 | |||
1529 | /* respond with data transfer before status phase? */ | ||
1530 | if (ret >= 0) { | ||
1531 | req->length = ret; | ||
1532 | req->zero = ret < wLength | ||
1533 | && (ret % gadget->ep0->maxpacket) == 0; | ||
1534 | ret = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC); | ||
1535 | if (ret < 0) { | ||
1536 | pr_err("gs_setup: cannot queue response, ret=%d\n", | ||
1537 | ret); | ||
1538 | req->status = 0; | ||
1539 | gs_setup_complete(gadget->ep0, req); | ||
1540 | } | ||
1541 | } | ||
1542 | |||
1543 | /* device either stalls (ret < 0) or reports success */ | ||
1544 | return ret; | ||
1545 | } | ||
1546 | |||
1547 | static int gs_setup_standard(struct usb_gadget *gadget, | 1350 | static int gs_setup_standard(struct usb_gadget *gadget, |
1548 | const struct usb_ctrlrequest *ctrl) | 1351 | const struct usb_ctrlrequest *ctrl) |
1549 | { | 1352 | { |
@@ -1673,6 +1476,42 @@ set_interface_done: | |||
1673 | return ret; | 1476 | return ret; |
1674 | } | 1477 | } |
1675 | 1478 | ||
1479 | static void gs_setup_complete_set_line_coding(struct usb_ep *ep, | ||
1480 | struct usb_request *req) | ||
1481 | { | ||
1482 | struct gs_dev *dev = ep->driver_data; | ||
1483 | struct gs_port *port = dev->dev_port[0]; /* ACM only has one port */ | ||
1484 | |||
1485 | switch (req->status) { | ||
1486 | case 0: | ||
1487 | /* normal completion */ | ||
1488 | if (req->actual != sizeof(port->port_line_coding)) | ||
1489 | usb_ep_set_halt(ep); | ||
1490 | else if (port) { | ||
1491 | struct usb_cdc_line_coding *value = req->buf; | ||
1492 | |||
1493 | /* REVISIT: we currently just remember this data. | ||
1494 | * If we change that, (a) validate it first, then | ||
1495 | * (b) update whatever hardware needs updating. | ||
1496 | */ | ||
1497 | spin_lock(&port->port_lock); | ||
1498 | port->port_line_coding = *value; | ||
1499 | spin_unlock(&port->port_lock); | ||
1500 | } | ||
1501 | break; | ||
1502 | |||
1503 | case -ESHUTDOWN: | ||
1504 | /* disconnect */ | ||
1505 | gs_free_req(ep, req); | ||
1506 | break; | ||
1507 | |||
1508 | default: | ||
1509 | /* unexpected */ | ||
1510 | break; | ||
1511 | } | ||
1512 | return; | ||
1513 | } | ||
1514 | |||
1676 | static int gs_setup_class(struct usb_gadget *gadget, | 1515 | static int gs_setup_class(struct usb_gadget *gadget, |
1677 | const struct usb_ctrlrequest *ctrl) | 1516 | const struct usb_ctrlrequest *ctrl) |
1678 | { | 1517 | { |
@@ -1734,52 +1573,72 @@ static int gs_setup_class(struct usb_gadget *gadget, | |||
1734 | return ret; | 1573 | return ret; |
1735 | } | 1574 | } |
1736 | 1575 | ||
1737 | static void gs_setup_complete_set_line_coding(struct usb_ep *ep, | 1576 | /* |
1738 | struct usb_request *req) | 1577 | * gs_setup_complete |
1578 | */ | ||
1579 | static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req) | ||
1739 | { | 1580 | { |
1740 | struct gs_dev *dev = ep->driver_data; | 1581 | if (req->status || req->actual != req->length) { |
1741 | struct gs_port *port = dev->dev_port[0]; /* ACM only has one port */ | 1582 | pr_err("gs_setup_complete: status error, status=%d, " |
1583 | "actual=%d, length=%d\n", | ||
1584 | req->status, req->actual, req->length); | ||
1585 | } | ||
1586 | } | ||
1742 | 1587 | ||
1743 | switch (req->status) { | 1588 | /* |
1744 | case 0: | 1589 | * gs_setup |
1745 | /* normal completion */ | 1590 | * |
1746 | if (req->actual != sizeof(port->port_line_coding)) | 1591 | * Implements all the control endpoint functionality that's not |
1747 | usb_ep_set_halt(ep); | 1592 | * handled in hardware or the hardware driver. |
1748 | else if (port) { | 1593 | * |
1749 | struct usb_cdc_line_coding *value = req->buf; | 1594 | * Returns the size of the data sent to the host, or a negative |
1595 | * error number. | ||
1596 | */ | ||
1597 | static int gs_setup(struct usb_gadget *gadget, | ||
1598 | const struct usb_ctrlrequest *ctrl) | ||
1599 | { | ||
1600 | int ret = -EOPNOTSUPP; | ||
1601 | struct gs_dev *dev = get_gadget_data(gadget); | ||
1602 | struct usb_request *req = dev->dev_ctrl_req; | ||
1603 | u16 wIndex = le16_to_cpu(ctrl->wIndex); | ||
1604 | u16 wValue = le16_to_cpu(ctrl->wValue); | ||
1605 | u16 wLength = le16_to_cpu(ctrl->wLength); | ||
1750 | 1606 | ||
1751 | /* REVISIT: we currently just remember this data. | 1607 | req->complete = gs_setup_complete; |
1752 | * If we change that, (a) validate it first, then | 1608 | |
1753 | * (b) update whatever hardware needs updating. | 1609 | switch (ctrl->bRequestType & USB_TYPE_MASK) { |
1754 | */ | 1610 | case USB_TYPE_STANDARD: |
1755 | spin_lock(&port->port_lock); | 1611 | ret = gs_setup_standard(gadget, ctrl); |
1756 | port->port_line_coding = *value; | ||
1757 | spin_unlock(&port->port_lock); | ||
1758 | } | ||
1759 | break; | 1612 | break; |
1760 | 1613 | ||
1761 | case -ESHUTDOWN: | 1614 | case USB_TYPE_CLASS: |
1762 | /* disconnect */ | 1615 | ret = gs_setup_class(gadget, ctrl); |
1763 | gs_free_req(ep, req); | ||
1764 | break; | 1616 | break; |
1765 | 1617 | ||
1766 | default: | 1618 | default: |
1767 | /* unexpected */ | 1619 | pr_err("gs_setup: unknown request, type=%02x, request=%02x, " |
1620 | "value=%04x, index=%04x, length=%d\n", | ||
1621 | ctrl->bRequestType, ctrl->bRequest, | ||
1622 | wValue, wIndex, wLength); | ||
1768 | break; | 1623 | break; |
1769 | } | 1624 | } |
1770 | return; | ||
1771 | } | ||
1772 | 1625 | ||
1773 | /* | 1626 | /* respond with data transfer before status phase? */ |
1774 | * gs_setup_complete | 1627 | if (ret >= 0) { |
1775 | */ | 1628 | req->length = ret; |
1776 | static void gs_setup_complete(struct usb_ep *ep, struct usb_request *req) | 1629 | req->zero = ret < wLength |
1777 | { | 1630 | && (ret % gadget->ep0->maxpacket) == 0; |
1778 | if (req->status || req->actual != req->length) { | 1631 | ret = usb_ep_queue(gadget->ep0, req, GFP_ATOMIC); |
1779 | pr_err("gs_setup_complete: status error, status=%d, " | 1632 | if (ret < 0) { |
1780 | "actual=%d, length=%d\n", | 1633 | pr_err("gs_setup: cannot queue response, ret=%d\n", |
1781 | req->status, req->actual, req->length); | 1634 | ret); |
1635 | req->status = 0; | ||
1636 | gs_setup_complete(gadget->ep0, req); | ||
1637 | } | ||
1782 | } | 1638 | } |
1639 | |||
1640 | /* device either stalls (ret < 0) or reports success */ | ||
1641 | return ret; | ||
1783 | } | 1642 | } |
1784 | 1643 | ||
1785 | /* | 1644 | /* |
@@ -1811,6 +1670,23 @@ static void gs_disconnect(struct usb_gadget *gadget) | |||
1811 | pr_info("gs_disconnect: %s disconnected\n", GS_LONG_NAME); | 1670 | pr_info("gs_disconnect: %s disconnected\n", GS_LONG_NAME); |
1812 | } | 1671 | } |
1813 | 1672 | ||
1673 | static struct usb_gadget_driver gs_gadget_driver = { | ||
1674 | #ifdef CONFIG_USB_GADGET_DUALSPEED | ||
1675 | .speed = USB_SPEED_HIGH, | ||
1676 | #else | ||
1677 | .speed = USB_SPEED_FULL, | ||
1678 | #endif /* CONFIG_USB_GADGET_DUALSPEED */ | ||
1679 | .function = GS_LONG_NAME, | ||
1680 | .bind = gs_bind, | ||
1681 | .unbind = gs_unbind, | ||
1682 | .setup = gs_setup, | ||
1683 | .disconnect = gs_disconnect, | ||
1684 | .driver = { | ||
1685 | .name = GS_SHORT_NAME, | ||
1686 | .owner = THIS_MODULE, | ||
1687 | }, | ||
1688 | }; | ||
1689 | |||
1814 | /* | 1690 | /* |
1815 | * gs_set_config | 1691 | * gs_set_config |
1816 | * | 1692 | * |
@@ -1826,9 +1702,8 @@ static int gs_set_config(struct gs_dev *dev, unsigned config) | |||
1826 | int ret = 0; | 1702 | int ret = 0; |
1827 | struct usb_gadget *gadget = dev->dev_gadget; | 1703 | struct usb_gadget *gadget = dev->dev_gadget; |
1828 | struct usb_ep *ep; | 1704 | struct usb_ep *ep; |
1829 | struct usb_endpoint_descriptor *ep_desc; | 1705 | struct usb_endpoint_descriptor *out, *in, *notify; |
1830 | struct usb_request *req; | 1706 | struct usb_request *req; |
1831 | struct gs_req_entry *req_entry; | ||
1832 | 1707 | ||
1833 | if (dev == NULL) { | 1708 | if (dev == NULL) { |
1834 | pr_err("gs_set_config: NULL device pointer\n"); | 1709 | pr_err("gs_set_config: NULL device pointer\n"); |
@@ -1846,86 +1721,62 @@ static int gs_set_config(struct gs_dev *dev, unsigned config) | |||
1846 | case GS_BULK_CONFIG_ID: | 1721 | case GS_BULK_CONFIG_ID: |
1847 | if (use_acm) | 1722 | if (use_acm) |
1848 | return -EINVAL; | 1723 | return -EINVAL; |
1849 | /* device specific optimizations */ | ||
1850 | if (gadget_is_net2280(gadget)) | ||
1851 | net2280_set_fifo_mode(gadget, 1); | ||
1852 | break; | 1724 | break; |
1853 | case GS_ACM_CONFIG_ID: | 1725 | case GS_ACM_CONFIG_ID: |
1854 | if (!use_acm) | 1726 | if (!use_acm) |
1855 | return -EINVAL; | 1727 | return -EINVAL; |
1856 | /* device specific optimizations */ | ||
1857 | if (gadget_is_net2280(gadget)) | ||
1858 | net2280_set_fifo_mode(gadget, 1); | ||
1859 | break; | 1728 | break; |
1860 | default: | 1729 | default: |
1861 | return -EINVAL; | 1730 | return -EINVAL; |
1862 | } | 1731 | } |
1863 | 1732 | ||
1864 | dev->dev_config = config; | 1733 | in = choose_ep_desc(gadget, |
1865 | 1734 | &gs_highspeed_in_desc, | |
1866 | gadget_for_each_ep(ep, gadget) { | 1735 | &gs_fullspeed_in_desc); |
1867 | 1736 | out = choose_ep_desc(gadget, | |
1868 | if (EP_NOTIFY_NAME | 1737 | &gs_highspeed_out_desc, |
1869 | && strcmp(ep->name, EP_NOTIFY_NAME) == 0) { | 1738 | &gs_fullspeed_out_desc); |
1870 | ep_desc = choose_ep_desc(gadget, | 1739 | notify = dev->dev_notify_ep |
1740 | ? choose_ep_desc(gadget, | ||
1871 | &gs_highspeed_notify_desc, | 1741 | &gs_highspeed_notify_desc, |
1872 | &gs_fullspeed_notify_desc); | 1742 | &gs_fullspeed_notify_desc) |
1873 | ret = usb_ep_enable(ep,ep_desc); | 1743 | : NULL; |
1874 | if (ret == 0) { | ||
1875 | ep->driver_data = dev; | ||
1876 | dev->dev_notify_ep = ep; | ||
1877 | dev->dev_notify_ep_desc = ep_desc; | ||
1878 | } else { | ||
1879 | pr_err("gs_set_config: cannot enable NOTIFY " | ||
1880 | "endpoint %s, ret=%d\n", | ||
1881 | ep->name, ret); | ||
1882 | goto exit_reset_config; | ||
1883 | } | ||
1884 | } | ||
1885 | |||
1886 | else if (strcmp(ep->name, EP_IN_NAME) == 0) { | ||
1887 | ep_desc = choose_ep_desc(gadget, | ||
1888 | &gs_highspeed_in_desc, | ||
1889 | &gs_fullspeed_in_desc); | ||
1890 | ret = usb_ep_enable(ep,ep_desc); | ||
1891 | if (ret == 0) { | ||
1892 | ep->driver_data = dev; | ||
1893 | dev->dev_in_ep = ep; | ||
1894 | dev->dev_in_ep_desc = ep_desc; | ||
1895 | } else { | ||
1896 | pr_err("gs_set_config: cannot enable IN " | ||
1897 | "endpoint %s, ret=%d\n", | ||
1898 | ep->name, ret); | ||
1899 | goto exit_reset_config; | ||
1900 | } | ||
1901 | } | ||
1902 | 1744 | ||
1903 | else if (strcmp(ep->name, EP_OUT_NAME) == 0) { | 1745 | ret = usb_ep_enable(dev->dev_in_ep, in); |
1904 | ep_desc = choose_ep_desc(gadget, | 1746 | if (ret == 0) { |
1905 | &gs_highspeed_out_desc, | 1747 | dev->dev_in_ep_desc = in; |
1906 | &gs_fullspeed_out_desc); | 1748 | } else { |
1907 | ret = usb_ep_enable(ep,ep_desc); | 1749 | pr_debug("%s: cannot enable %s %s, ret=%d\n", |
1908 | if (ret == 0) { | 1750 | __func__, "IN", dev->dev_in_ep->name, ret); |
1909 | ep->driver_data = dev; | 1751 | return ret; |
1910 | dev->dev_out_ep = ep; | 1752 | } |
1911 | dev->dev_out_ep_desc = ep_desc; | ||
1912 | } else { | ||
1913 | pr_err("gs_set_config: cannot enable OUT " | ||
1914 | "endpoint %s, ret=%d\n", | ||
1915 | ep->name, ret); | ||
1916 | goto exit_reset_config; | ||
1917 | } | ||
1918 | } | ||
1919 | 1753 | ||
1754 | ret = usb_ep_enable(dev->dev_out_ep, out); | ||
1755 | if (ret == 0) { | ||
1756 | dev->dev_out_ep_desc = out; | ||
1757 | } else { | ||
1758 | pr_debug("%s: cannot enable %s %s, ret=%d\n", | ||
1759 | __func__, "OUT", dev->dev_out_ep->name, ret); | ||
1760 | fail0: | ||
1761 | usb_ep_disable(dev->dev_in_ep); | ||
1762 | return ret; | ||
1920 | } | 1763 | } |
1921 | 1764 | ||
1922 | if (dev->dev_in_ep == NULL || dev->dev_out_ep == NULL | 1765 | if (notify) { |
1923 | || (config != GS_BULK_CONFIG_ID && dev->dev_notify_ep == NULL)) { | 1766 | ret = usb_ep_enable(dev->dev_notify_ep, notify); |
1924 | pr_err("gs_set_config: cannot find endpoints\n"); | 1767 | if (ret == 0) { |
1925 | ret = -ENODEV; | 1768 | dev->dev_notify_ep_desc = notify; |
1926 | goto exit_reset_config; | 1769 | } else { |
1770 | pr_debug("%s: cannot enable %s %s, ret=%d\n", | ||
1771 | __func__, "NOTIFY", | ||
1772 | dev->dev_notify_ep->name, ret); | ||
1773 | usb_ep_disable(dev->dev_out_ep); | ||
1774 | goto fail0; | ||
1775 | } | ||
1927 | } | 1776 | } |
1928 | 1777 | ||
1778 | dev->dev_config = config; | ||
1779 | |||
1929 | /* allocate and queue read requests */ | 1780 | /* allocate and queue read requests */ |
1930 | ep = dev->dev_out_ep; | 1781 | ep = dev->dev_out_ep; |
1931 | for (i=0; i<read_q_size && ret == 0; i++) { | 1782 | for (i=0; i<read_q_size && ret == 0; i++) { |
@@ -1946,9 +1797,10 @@ static int gs_set_config(struct gs_dev *dev, unsigned config) | |||
1946 | /* allocate write requests, and put on free list */ | 1797 | /* allocate write requests, and put on free list */ |
1947 | ep = dev->dev_in_ep; | 1798 | ep = dev->dev_in_ep; |
1948 | for (i=0; i<write_q_size; i++) { | 1799 | for (i=0; i<write_q_size; i++) { |
1949 | if ((req_entry=gs_alloc_req_entry(ep, ep->maxpacket, GFP_ATOMIC))) { | 1800 | req = gs_alloc_req(ep, ep->maxpacket, GFP_ATOMIC); |
1950 | req_entry->re_req->complete = gs_write_complete; | 1801 | if (req) { |
1951 | list_add(&req_entry->re_entry, &dev->dev_req_list); | 1802 | req->complete = gs_write_complete; |
1803 | list_add(&req->list, &dev->dev_req_list); | ||
1952 | } else { | 1804 | } else { |
1953 | pr_err("gs_set_config: cannot allocate " | 1805 | pr_err("gs_set_config: cannot allocate " |
1954 | "write requests\n"); | 1806 | "write requests\n"); |
@@ -1986,7 +1838,7 @@ exit_reset_config: | |||
1986 | */ | 1838 | */ |
1987 | static void gs_reset_config(struct gs_dev *dev) | 1839 | static void gs_reset_config(struct gs_dev *dev) |
1988 | { | 1840 | { |
1989 | struct gs_req_entry *req_entry; | 1841 | struct usb_request *req; |
1990 | 1842 | ||
1991 | if (dev == NULL) { | 1843 | if (dev == NULL) { |
1992 | pr_err("gs_reset_config: NULL device pointer\n"); | 1844 | pr_err("gs_reset_config: NULL device pointer\n"); |
@@ -2000,26 +1852,18 @@ static void gs_reset_config(struct gs_dev *dev) | |||
2000 | 1852 | ||
2001 | /* free write requests on the free list */ | 1853 | /* free write requests on the free list */ |
2002 | while(!list_empty(&dev->dev_req_list)) { | 1854 | while(!list_empty(&dev->dev_req_list)) { |
2003 | req_entry = list_entry(dev->dev_req_list.next, | 1855 | req = list_entry(dev->dev_req_list.next, |
2004 | struct gs_req_entry, re_entry); | 1856 | struct usb_request, list); |
2005 | list_del(&req_entry->re_entry); | 1857 | list_del(&req->list); |
2006 | gs_free_req_entry(dev->dev_in_ep, req_entry); | 1858 | gs_free_req(dev->dev_in_ep, req); |
2007 | } | 1859 | } |
2008 | 1860 | ||
2009 | /* disable endpoints, forcing completion of pending i/o; */ | 1861 | /* disable endpoints, forcing completion of pending i/o; */ |
2010 | /* completion handlers free their requests in this case */ | 1862 | /* completion handlers free their requests in this case */ |
2011 | if (dev->dev_notify_ep) { | 1863 | if (dev->dev_notify_ep) |
2012 | usb_ep_disable(dev->dev_notify_ep); | 1864 | usb_ep_disable(dev->dev_notify_ep); |
2013 | dev->dev_notify_ep = NULL; | 1865 | usb_ep_disable(dev->dev_in_ep); |
2014 | } | 1866 | usb_ep_disable(dev->dev_out_ep); |
2015 | if (dev->dev_in_ep) { | ||
2016 | usb_ep_disable(dev->dev_in_ep); | ||
2017 | dev->dev_in_ep = NULL; | ||
2018 | } | ||
2019 | if (dev->dev_out_ep) { | ||
2020 | usb_ep_disable(dev->dev_out_ep); | ||
2021 | dev->dev_out_ep = NULL; | ||
2022 | } | ||
2023 | } | 1867 | } |
2024 | 1868 | ||
2025 | /* | 1869 | /* |
@@ -2113,46 +1957,6 @@ static void gs_free_req(struct usb_ep *ep, struct usb_request *req) | |||
2113 | } | 1957 | } |
2114 | 1958 | ||
2115 | /* | 1959 | /* |
2116 | * gs_alloc_req_entry | ||
2117 | * | ||
2118 | * Allocates a request and its buffer, using the given | ||
2119 | * endpoint, buffer len, and kmalloc flags. | ||
2120 | */ | ||
2121 | static struct gs_req_entry * | ||
2122 | gs_alloc_req_entry(struct usb_ep *ep, unsigned len, gfp_t kmalloc_flags) | ||
2123 | { | ||
2124 | struct gs_req_entry *req; | ||
2125 | |||
2126 | req = kmalloc(sizeof(struct gs_req_entry), kmalloc_flags); | ||
2127 | if (req == NULL) | ||
2128 | return NULL; | ||
2129 | |||
2130 | req->re_req = gs_alloc_req(ep, len, kmalloc_flags); | ||
2131 | if (req->re_req == NULL) { | ||
2132 | kfree(req); | ||
2133 | return NULL; | ||
2134 | } | ||
2135 | |||
2136 | req->re_req->context = req; | ||
2137 | |||
2138 | return req; | ||
2139 | } | ||
2140 | |||
2141 | /* | ||
2142 | * gs_free_req_entry | ||
2143 | * | ||
2144 | * Frees a request and its buffer. | ||
2145 | */ | ||
2146 | static void gs_free_req_entry(struct usb_ep *ep, struct gs_req_entry *req) | ||
2147 | { | ||
2148 | if (ep != NULL && req != NULL) { | ||
2149 | if (req->re_req != NULL) | ||
2150 | gs_free_req(ep, req->re_req); | ||
2151 | kfree(req); | ||
2152 | } | ||
2153 | } | ||
2154 | |||
2155 | /* | ||
2156 | * gs_alloc_ports | 1960 | * gs_alloc_ports |
2157 | * | 1961 | * |
2158 | * Allocate all ports and set the gs_dev struct to point to them. | 1962 | * Allocate all ports and set the gs_dev struct to point to them. |
@@ -2233,6 +2037,8 @@ static void gs_free_ports(struct gs_dev *dev) | |||
2233 | } | 2037 | } |
2234 | } | 2038 | } |
2235 | 2039 | ||
2040 | /*-------------------------------------------------------------------------*/ | ||
2041 | |||
2236 | /* Circular Buffer */ | 2042 | /* Circular Buffer */ |
2237 | 2043 | ||
2238 | /* | 2044 | /* |
@@ -2393,3 +2199,77 @@ gs_buf_get(struct gs_buf *gb, char *buf, unsigned int count) | |||
2393 | 2199 | ||
2394 | return count; | 2200 | return count; |
2395 | } | 2201 | } |
2202 | |||
2203 | /*-------------------------------------------------------------------------*/ | ||
2204 | |||
2205 | static struct tty_driver *gs_tty_driver; | ||
2206 | |||
2207 | /* | ||
2208 | * gs_module_init | ||
2209 | * | ||
2210 | * Register as a USB gadget driver and a tty driver. | ||
2211 | */ | ||
2212 | static int __init gs_module_init(void) | ||
2213 | { | ||
2214 | int i; | ||
2215 | int retval; | ||
2216 | |||
2217 | retval = usb_gadget_register_driver(&gs_gadget_driver); | ||
2218 | if (retval) { | ||
2219 | pr_err("gs_module_init: cannot register gadget driver, " | ||
2220 | "ret=%d\n", retval); | ||
2221 | return retval; | ||
2222 | } | ||
2223 | |||
2224 | gs_tty_driver = alloc_tty_driver(GS_NUM_PORTS); | ||
2225 | if (!gs_tty_driver) | ||
2226 | return -ENOMEM; | ||
2227 | gs_tty_driver->owner = THIS_MODULE; | ||
2228 | gs_tty_driver->driver_name = GS_SHORT_NAME; | ||
2229 | gs_tty_driver->name = "ttygs"; | ||
2230 | gs_tty_driver->major = GS_MAJOR; | ||
2231 | gs_tty_driver->minor_start = GS_MINOR_START; | ||
2232 | gs_tty_driver->type = TTY_DRIVER_TYPE_SERIAL; | ||
2233 | gs_tty_driver->subtype = SERIAL_TYPE_NORMAL; | ||
2234 | gs_tty_driver->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_DYNAMIC_DEV; | ||
2235 | gs_tty_driver->init_termios = tty_std_termios; | ||
2236 | /* must match GS_DEFAULT_DTE_RATE and friends */ | ||
2237 | gs_tty_driver->init_termios.c_cflag = | ||
2238 | B9600 | CS8 | CREAD | HUPCL | CLOCAL; | ||
2239 | gs_tty_driver->init_termios.c_ispeed = GS_DEFAULT_DTE_RATE; | ||
2240 | gs_tty_driver->init_termios.c_ospeed = GS_DEFAULT_DTE_RATE; | ||
2241 | tty_set_operations(gs_tty_driver, &gs_tty_ops); | ||
2242 | |||
2243 | for (i = 0; i < GS_NUM_PORTS; i++) | ||
2244 | mutex_init(&gs_open_close_lock[i]); | ||
2245 | |||
2246 | retval = tty_register_driver(gs_tty_driver); | ||
2247 | if (retval) { | ||
2248 | usb_gadget_unregister_driver(&gs_gadget_driver); | ||
2249 | put_tty_driver(gs_tty_driver); | ||
2250 | pr_err("gs_module_init: cannot register tty driver, " | ||
2251 | "ret=%d\n", retval); | ||
2252 | return retval; | ||
2253 | } | ||
2254 | |||
2255 | pr_info("gs_module_init: %s %s loaded\n", | ||
2256 | GS_LONG_NAME, GS_VERSION_STR); | ||
2257 | return 0; | ||
2258 | } | ||
2259 | module_init(gs_module_init); | ||
2260 | |||
2261 | /* | ||
2262 | * gs_module_exit | ||
2263 | * | ||
2264 | * Unregister as a tty driver and a USB gadget driver. | ||
2265 | */ | ||
2266 | static void __exit gs_module_exit(void) | ||
2267 | { | ||
2268 | tty_unregister_driver(gs_tty_driver); | ||
2269 | put_tty_driver(gs_tty_driver); | ||
2270 | usb_gadget_unregister_driver(&gs_gadget_driver); | ||
2271 | |||
2272 | pr_info("gs_module_exit: %s %s unloaded\n", | ||
2273 | GS_LONG_NAME, GS_VERSION_STR); | ||
2274 | } | ||
2275 | module_exit(gs_module_exit); | ||
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index 33b467a8352d..1ef6df395e0c 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -129,7 +129,7 @@ config USB_ISP1760_PCI | |||
129 | 129 | ||
130 | config USB_ISP1760_OF | 130 | config USB_ISP1760_OF |
131 | bool "Support for the OF platform bus" | 131 | bool "Support for the OF platform bus" |
132 | depends on USB_ISP1760_HCD && OF | 132 | depends on USB_ISP1760_HCD && PPC_OF |
133 | ---help--- | 133 | ---help--- |
134 | Enables support for the device present on the PowerPC | 134 | Enables support for the device present on the PowerPC |
135 | OpenFirmware platform bus. | 135 | OpenFirmware platform bus. |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 4ba96c1e060c..c9cec8738261 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -988,7 +988,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd) | |||
988 | * This did not trigger for a long time now. | 988 | * This did not trigger for a long time now. |
989 | */ | 989 | */ |
990 | printk(KERN_ERR "Reloading ptd %p/%p... qh %p readed: " | 990 | printk(KERN_ERR "Reloading ptd %p/%p... qh %p readed: " |
991 | "%d of %d done: %08x cur: %08x\n", qtd, | 991 | "%d of %zu done: %08x cur: %08x\n", qtd, |
992 | urb, qh, PTD_XFERRED_LENGTH(dw3), | 992 | urb, qh, PTD_XFERRED_LENGTH(dw3), |
993 | qtd->length, done_map, | 993 | qtd->length, done_map, |
994 | (1 << queue_entry)); | 994 | (1 << queue_entry)); |
@@ -1088,7 +1088,7 @@ static void do_atl_int(struct usb_hcd *usb_hcd) | |||
1088 | } else if (usb_pipebulk(urb->pipe) && (length < qtd->length)) { | 1088 | } else if (usb_pipebulk(urb->pipe) && (length < qtd->length)) { |
1089 | /* short BULK received */ | 1089 | /* short BULK received */ |
1090 | 1090 | ||
1091 | printk(KERN_ERR "short bulk, %d instead %d\n", length, | 1091 | printk(KERN_ERR "short bulk, %d instead %zu\n", length, |
1092 | qtd->length); | 1092 | qtd->length); |
1093 | if (urb->transfer_flags & URB_SHORT_NOT_OK) { | 1093 | if (urb->transfer_flags & URB_SHORT_NOT_OK) { |
1094 | urb->status = -EREMOTEIO; | 1094 | urb->status = -EREMOTEIO; |
diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c index 73fb2a38f1e4..440bf94f0d4c 100644 --- a/drivers/usb/host/isp1760-if.c +++ b/drivers/usb/host/isp1760-if.c | |||
@@ -256,7 +256,7 @@ static struct pci_driver isp1761_pci_driver = { | |||
256 | 256 | ||
257 | static int __init isp1760_init(void) | 257 | static int __init isp1760_init(void) |
258 | { | 258 | { |
259 | int ret; | 259 | int ret = -ENODEV; |
260 | 260 | ||
261 | init_kmem_once(); | 261 | init_kmem_once(); |
262 | 262 | ||
diff --git a/drivers/usb/host/ohci-sm501.c b/drivers/usb/host/ohci-sm501.c index 77204f001b9a..e899a77dfb83 100644 --- a/drivers/usb/host/ohci-sm501.c +++ b/drivers/usb/host/ohci-sm501.c | |||
@@ -90,7 +90,7 @@ static int ohci_hcd_sm501_drv_probe(struct platform_device *pdev) | |||
90 | struct device *dev = &pdev->dev; | 90 | struct device *dev = &pdev->dev; |
91 | struct resource *res, *mem; | 91 | struct resource *res, *mem; |
92 | int retval, irq; | 92 | int retval, irq; |
93 | struct usb_hcd *hcd = 0; | 93 | struct usb_hcd *hcd = NULL; |
94 | 94 | ||
95 | irq = retval = platform_get_irq(pdev, 0); | 95 | irq = retval = platform_get_irq(pdev, 0); |
96 | if (retval < 0) | 96 | if (retval < 0) |
diff --git a/drivers/usb/misc/ldusb.c b/drivers/usb/misc/ldusb.c index 7aafd53fbcab..189a9db03509 100644 --- a/drivers/usb/misc/ldusb.c +++ b/drivers/usb/misc/ldusb.c | |||
@@ -63,9 +63,6 @@ | |||
63 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 | 63 | #define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 |
64 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 | 64 | #define USB_DEVICE_ID_VERNIER_LCSPEC 0x0006 |
65 | 65 | ||
66 | #define USB_VENDOR_ID_MICROCHIP 0x04d8 | ||
67 | #define USB_DEVICE_ID_PICDEM 0x000c | ||
68 | |||
69 | #ifdef CONFIG_USB_DYNAMIC_MINORS | 66 | #ifdef CONFIG_USB_DYNAMIC_MINORS |
70 | #define USB_LD_MINOR_BASE 0 | 67 | #define USB_LD_MINOR_BASE 0 |
71 | #else | 68 | #else |
@@ -92,7 +89,6 @@ static struct usb_device_id ld_usb_table [] = { | |||
92 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, | 89 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP) }, |
93 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, | 90 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP) }, |
94 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, | 91 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS) }, |
95 | { USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICDEM) }, | ||
96 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, | 92 | { USB_DEVICE(USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LCSPEC) }, |
97 | { } /* Terminating entry */ | 93 | { } /* Terminating entry */ |
98 | }; | 94 | }; |
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 742be3c35947..054dedd28127 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -856,6 +856,11 @@ test_ctrl_queue (struct usbtest_dev *dev, struct usbtest_param *param) | |||
856 | struct urb *u; | 856 | struct urb *u; |
857 | struct usb_ctrlrequest req; | 857 | struct usb_ctrlrequest req; |
858 | struct subcase *reqp; | 858 | struct subcase *reqp; |
859 | |||
860 | /* sign of this variable means: | ||
861 | * -: tested code must return this (negative) error code | ||
862 | * +: tested code may return this (negative too) error code | ||
863 | */ | ||
859 | int expected = 0; | 864 | int expected = 0; |
860 | 865 | ||
861 | /* requests here are mostly expected to succeed on any | 866 | /* requests here are mostly expected to succeed on any |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 2cffec85ee7e..9ba64ccc1359 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -447,6 +447,15 @@ config USB_SERIAL_MOS7840 | |||
447 | To compile this driver as a module, choose M here: the | 447 | To compile this driver as a module, choose M here: the |
448 | module will be called mos7840. If unsure, choose N. | 448 | module will be called mos7840. If unsure, choose N. |
449 | 449 | ||
450 | config USB_SERIAL_MOTOROLA | ||
451 | tristate "USB Motorola Phone modem driver" | ||
452 | ---help--- | ||
453 | Say Y here if you want to use a Motorola phone with a USB | ||
454 | connector as a modem link. | ||
455 | |||
456 | To compile this driver as a module, choose M here: the | ||
457 | module will be called moto_modem. If unsure, choose N. | ||
458 | |||
450 | config USB_SERIAL_NAVMAN | 459 | config USB_SERIAL_NAVMAN |
451 | tristate "USB Navman GPS device" | 460 | tristate "USB Navman GPS device" |
452 | help | 461 | help |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index 756859510d8c..17a762ab6769 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -39,6 +39,7 @@ obj-$(CONFIG_USB_SERIAL_KOBIL_SCT) += kobil_sct.o | |||
39 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o | 39 | obj-$(CONFIG_USB_SERIAL_MCT_U232) += mct_u232.o |
40 | obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o | 40 | obj-$(CONFIG_USB_SERIAL_MOS7720) += mos7720.o |
41 | obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o | 41 | obj-$(CONFIG_USB_SERIAL_MOS7840) += mos7840.o |
42 | obj-$(CONFIG_USB_SERIAL_MOTOROLA) += moto_modem.o | ||
42 | obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o | 43 | obj-$(CONFIG_USB_SERIAL_NAVMAN) += navman.o |
43 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o | 44 | obj-$(CONFIG_USB_SERIAL_OMNINET) += omninet.o |
44 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o | 45 | obj-$(CONFIG_USB_SERIAL_OPTION) += option.o |
diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c index dc0ea08ed231..f5b57b196c5a 100644 --- a/drivers/usb/serial/cp2101.c +++ b/drivers/usb/serial/cp2101.c | |||
@@ -73,6 +73,7 @@ static struct usb_device_id id_table [] = { | |||
73 | { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ | 73 | { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ |
74 | { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ | 74 | { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ |
75 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ | 75 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ |
76 | { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */ | ||
76 | { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ | 77 | { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ |
77 | { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ | 78 | { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ |
78 | { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ | 79 | { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ |
diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c index 8a217648b250..a01e987c7d32 100644 --- a/drivers/usb/serial/iuu_phoenix.c +++ b/drivers/usb/serial/iuu_phoenix.c | |||
@@ -643,7 +643,7 @@ static void read_buf_callback(struct urb *urb) | |||
643 | static int iuu_bulk_write(struct usb_serial_port *port) | 643 | static int iuu_bulk_write(struct usb_serial_port *port) |
644 | { | 644 | { |
645 | struct iuu_private *priv = usb_get_serial_port_data(port); | 645 | struct iuu_private *priv = usb_get_serial_port_data(port); |
646 | unsigned int flags; | 646 | unsigned long flags; |
647 | int result; | 647 | int result; |
648 | int i; | 648 | int i; |
649 | char *buf_ptr = port->write_urb->transfer_buffer; | 649 | char *buf_ptr = port->write_urb->transfer_buffer; |
@@ -694,7 +694,7 @@ static void iuu_uart_read_callback(struct urb *urb) | |||
694 | { | 694 | { |
695 | struct usb_serial_port *port = urb->context; | 695 | struct usb_serial_port *port = urb->context; |
696 | struct iuu_private *priv = usb_get_serial_port_data(port); | 696 | struct iuu_private *priv = usb_get_serial_port_data(port); |
697 | unsigned int flags; | 697 | unsigned long flags; |
698 | int status; | 698 | int status; |
699 | int error = 0; | 699 | int error = 0; |
700 | int len = 0; | 700 | int len = 0; |
@@ -759,7 +759,7 @@ static int iuu_uart_write(struct usb_serial_port *port, const u8 *buf, | |||
759 | int count) | 759 | int count) |
760 | { | 760 | { |
761 | struct iuu_private *priv = usb_get_serial_port_data(port); | 761 | struct iuu_private *priv = usb_get_serial_port_data(port); |
762 | unsigned int flags; | 762 | unsigned long flags; |
763 | dbg("%s - enter", __func__); | 763 | dbg("%s - enter", __func__); |
764 | 764 | ||
765 | if (count > 256) | 765 | if (count > 256) |
diff --git a/drivers/usb/serial/moto_modem.c b/drivers/usb/serial/moto_modem.c new file mode 100644 index 000000000000..2e8e05462ef7 --- /dev/null +++ b/drivers/usb/serial/moto_modem.c | |||
@@ -0,0 +1,70 @@ | |||
1 | /* | ||
2 | * Motorola USB Phone driver | ||
3 | * | ||
4 | * Copyright (C) 2008 Greg Kroah-Hartman <greg@kroah.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * {sigh} | ||
11 | * Mororola should be using the CDC ACM USB spec, but instead | ||
12 | * they try to just "do their own thing"... This driver should handle a | ||
13 | * few phones in which a basic "dumb serial connection" is needed to be | ||
14 | * able to get a connection through to them. | ||
15 | */ | ||
16 | |||
17 | #include <linux/kernel.h> | ||
18 | #include <linux/init.h> | ||
19 | #include <linux/tty.h> | ||
20 | #include <linux/module.h> | ||
21 | #include <linux/usb.h> | ||
22 | #include <linux/usb/serial.h> | ||
23 | |||
24 | static struct usb_device_id id_table [] = { | ||
25 | { USB_DEVICE(0x05c6, 0x3197) }, /* unknown Motorola phone */ | ||
26 | { USB_DEVICE(0x0c44, 0x0022) }, /* unknown Mororola phone */ | ||
27 | { USB_DEVICE(0x22b8, 0x2a64) }, /* Motorola KRZR K1m */ | ||
28 | { }, | ||
29 | }; | ||
30 | MODULE_DEVICE_TABLE(usb, id_table); | ||
31 | |||
32 | static struct usb_driver moto_driver = { | ||
33 | .name = "moto-modem", | ||
34 | .probe = usb_serial_probe, | ||
35 | .disconnect = usb_serial_disconnect, | ||
36 | .id_table = id_table, | ||
37 | .no_dynamic_id = 1, | ||
38 | }; | ||
39 | |||
40 | static struct usb_serial_driver moto_device = { | ||
41 | .driver = { | ||
42 | .owner = THIS_MODULE, | ||
43 | .name = "moto-modem", | ||
44 | }, | ||
45 | .id_table = id_table, | ||
46 | .num_ports = 1, | ||
47 | }; | ||
48 | |||
49 | static int __init moto_init(void) | ||
50 | { | ||
51 | int retval; | ||
52 | |||
53 | retval = usb_serial_register(&moto_device); | ||
54 | if (retval) | ||
55 | return retval; | ||
56 | retval = usb_register(&moto_driver); | ||
57 | if (retval) | ||
58 | usb_serial_deregister(&moto_device); | ||
59 | return retval; | ||
60 | } | ||
61 | |||
62 | static void __exit moto_exit(void) | ||
63 | { | ||
64 | usb_deregister(&moto_driver); | ||
65 | usb_serial_deregister(&moto_device); | ||
66 | } | ||
67 | |||
68 | module_init(moto_init); | ||
69 | module_exit(moto_exit); | ||
70 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index e4be2d442b1e..e7e016e60333 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -154,8 +154,6 @@ static int option_send_setup(struct usb_serial_port *port); | |||
154 | #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 | 154 | #define NOVATELWIRELESS_PRODUCT_MC727 0x4100 |
155 | #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 | 155 | #define NOVATELWIRELESS_PRODUCT_MC950D 0x4400 |
156 | 156 | ||
157 | #define NOVATELWIRELESS_PRODUCT_U727 0x5010 | ||
158 | |||
159 | /* FUTURE NOVATEL PRODUCTS */ | 157 | /* FUTURE NOVATEL PRODUCTS */ |
160 | #define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 | 158 | #define NOVATELWIRELESS_PRODUCT_EVDO_1 0x6000 |
161 | #define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 | 159 | #define NOVATELWIRELESS_PRODUCT_HSPA_1 0x7000 |
@@ -184,6 +182,9 @@ static int option_send_setup(struct usb_serial_port *port); | |||
184 | #define AXESSTEL_VENDOR_ID 0x1726 | 182 | #define AXESSTEL_VENDOR_ID 0x1726 |
185 | #define AXESSTEL_PRODUCT_MV110H 0x1000 | 183 | #define AXESSTEL_PRODUCT_MV110H 0x1000 |
186 | 184 | ||
185 | #define ONDA_VENDOR_ID 0x19d2 | ||
186 | #define ONDA_PRODUCT_ET502HS 0x0002 | ||
187 | |||
187 | #define BANDRICH_VENDOR_ID 0x1A8D | 188 | #define BANDRICH_VENDOR_ID 0x1A8D |
188 | #define BANDRICH_PRODUCT_C100_1 0x1002 | 189 | #define BANDRICH_PRODUCT_C100_1 0x1002 |
189 | #define BANDRICH_PRODUCT_C100_2 0x1003 | 190 | #define BANDRICH_PRODUCT_C100_2 0x1003 |
@@ -269,7 +270,6 @@ static struct usb_device_id option_ids[] = { | |||
269 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ | 270 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */ |
270 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ | 271 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */ |
271 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ | 272 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */ |
272 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel U727 */ | ||
273 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ | 273 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */ |
274 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ | 274 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */ |
275 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ | 275 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */ |
@@ -293,14 +293,17 @@ static struct usb_device_id option_ids[] = { | |||
293 | { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ | 293 | { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */ |
294 | { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ | 294 | { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */ |
295 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ | 295 | { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */ |
296 | { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */ | ||
296 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, | 297 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) }, |
297 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, | 298 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) }, |
298 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, | 299 | { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) }, |
300 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) }, | ||
299 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, | 301 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) }, |
300 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, | 302 | { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) }, |
301 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 303 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
302 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 304 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
303 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 305 | { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
306 | { USB_DEVICE(0x19d2, 0x0001) }, /* Telstra NextG CDMA */ | ||
304 | { } /* Terminating entry */ | 307 | { } /* Terminating entry */ |
305 | }; | 308 | }; |
306 | MODULE_DEVICE_TABLE(usb, option_ids); | 309 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index a0ed889230aa..1b09578cbb10 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -401,6 +401,14 @@ UNUSUAL_DEV( 0x04a5, 0x3010, 0x0100, 0x0100, | |||
401 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 401 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
402 | US_FL_IGNORE_RESIDUE ), | 402 | US_FL_IGNORE_RESIDUE ), |
403 | 403 | ||
404 | #ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB | ||
405 | UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999, | ||
406 | "Cypress", | ||
407 | "Cypress AT2LP", | ||
408 | US_SC_CYP_ATACB, US_PR_BULK, NULL, | ||
409 | 0), | ||
410 | #endif | ||
411 | |||
404 | /* Reported by Simon Levitt <simon@whattf.com> | 412 | /* Reported by Simon Levitt <simon@whattf.com> |
405 | * This entry needs Sub and Proto fields */ | 413 | * This entry needs Sub and Proto fields */ |
406 | UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100, | 414 | UNUSUAL_DEV( 0x04b8, 0x0601, 0x0100, 0x0100, |
@@ -539,17 +547,6 @@ UNUSUAL_DEV( 0x04e6, 0x0101, 0x0200, 0x0200, | |||
539 | "CD-RW Device", | 547 | "CD-RW Device", |
540 | US_SC_8020, US_PR_CB, NULL, 0), | 548 | US_SC_8020, US_PR_CB, NULL, 0), |
541 | 549 | ||
542 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. | ||
543 | * Device uses standards-violating 32-byte Bulk Command Block Wrappers and | ||
544 | * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. | ||
545 | */ | ||
546 | |||
547 | UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100, | ||
548 | "Kobian Mercury", | ||
549 | "Binocam DCB-132", | ||
550 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
551 | US_FL_BULK32), | ||
552 | |||
553 | #ifdef CONFIG_USB_STORAGE_USBAT | 550 | #ifdef CONFIG_USB_STORAGE_USBAT |
554 | UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999, | 551 | UNUSUAL_DEV( 0x04e6, 0x1010, 0x0000, 0x9999, |
555 | "Shuttle/SCM", | 552 | "Shuttle/SCM", |
@@ -565,6 +562,16 @@ UNUSUAL_DEV( 0x04e8, 0x507c, 0x0220, 0x0220, | |||
565 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 562 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
566 | US_FL_MAX_SECTORS_64), | 563 | US_FL_MAX_SECTORS_64), |
567 | 564 | ||
565 | /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>. | ||
566 | * Device uses standards-violating 32-byte Bulk Command Block Wrappers and | ||
567 | * reports itself as "Proprietary SCSI Bulk." Cf. device entry 0x084d:0x0011. | ||
568 | */ | ||
569 | UNUSUAL_DEV( 0x04fc, 0x80c2, 0x0100, 0x0100, | ||
570 | "Kobian Mercury", | ||
571 | "Binocam DCB-132", | ||
572 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
573 | US_FL_BULK32), | ||
574 | |||
568 | /* Reported by Bob Sass <rls@vectordb.com> -- only rev 1.33 tested */ | 575 | /* Reported by Bob Sass <rls@vectordb.com> -- only rev 1.33 tested */ |
569 | UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133, | 576 | UNUSUAL_DEV( 0x050d, 0x0115, 0x0133, 0x0133, |
570 | "Belkin", | 577 | "Belkin", |
@@ -1304,6 +1311,16 @@ UNUSUAL_DEV( 0x0ace, 0x20ff, 0x0101, 0x0101, | |||
1304 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1311 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1305 | US_FL_IGNORE_DEVICE ), | 1312 | US_FL_IGNORE_DEVICE ), |
1306 | 1313 | ||
1314 | /* Reported by F. Aben <f.aben@option.com> | ||
1315 | * This device (wrongly) has a vendor-specific device descriptor. | ||
1316 | * The entry is needed so usb-storage can bind to it's mass-storage | ||
1317 | * interface as an interface driver */ | ||
1318 | UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000, | ||
1319 | "Option", | ||
1320 | "GI 0401 SD-Card", | ||
1321 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1322 | 0 ), | ||
1323 | |||
1307 | #ifdef CONFIG_USB_STORAGE_ISD200 | 1324 | #ifdef CONFIG_USB_STORAGE_ISD200 |
1308 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, | 1325 | UNUSUAL_DEV( 0x0bf6, 0xa001, 0x0100, 0x0110, |
1309 | "ATI", | 1326 | "ATI", |
@@ -1361,13 +1378,6 @@ UNUSUAL_DEV( 0x0d96, 0x410a, 0x0001, 0xffff, | |||
1361 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1378 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1362 | US_FL_FIX_INQUIRY), | 1379 | US_FL_FIX_INQUIRY), |
1363 | 1380 | ||
1364 | /* Reported by Rohan Hart <rohan.hart17@gmail.com> */ | ||
1365 | UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010, | ||
1366 | "INTOVA", | ||
1367 | "Pixtreme", | ||
1368 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1369 | US_FL_FIX_CAPACITY ), | ||
1370 | |||
1371 | /* | 1381 | /* |
1372 | * Entry for Jenoptik JD 5200z3 | 1382 | * Entry for Jenoptik JD 5200z3 |
1373 | * | 1383 | * |
@@ -1684,6 +1694,16 @@ UNUSUAL_DEV( 0x1652, 0x6600, 0x0201, 0x0201, | |||
1684 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1694 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1685 | US_FL_IGNORE_RESIDUE ), | 1695 | US_FL_IGNORE_RESIDUE ), |
1686 | 1696 | ||
1697 | /* Reported by Mauro Andreolini <andreoli@weblab.ing.unimo.it> | ||
1698 | * This entry is needed to bypass the ZeroCD mechanism | ||
1699 | * and to properly load as a modem device. | ||
1700 | */ | ||
1701 | UNUSUAL_DEV( 0x19d2, 0x2000, 0x0000, 0x0000, | ||
1702 | "Onda ET502HS", | ||
1703 | "USB MMC Storage", | ||
1704 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1705 | US_FL_IGNORE_DEVICE), | ||
1706 | |||
1687 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> | 1707 | /* patch submitted by Davide Perini <perini.davide@dpsoftware.org> |
1688 | * and Renato Perini <rperini@email.it> | 1708 | * and Renato Perini <rperini@email.it> |
1689 | */ | 1709 | */ |
@@ -1721,6 +1741,13 @@ UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | |||
1721 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1741 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1722 | US_FL_GO_SLOW ), | 1742 | US_FL_GO_SLOW ), |
1723 | 1743 | ||
1744 | /* Reported by Rohan Hart <rohan.hart17@gmail.com> */ | ||
1745 | UNUSUAL_DEV( 0x2770, 0x915d, 0x0010, 0x0010, | ||
1746 | "INTOVA", | ||
1747 | "Pixtreme", | ||
1748 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1749 | US_FL_FIX_CAPACITY ), | ||
1750 | |||
1724 | /* | 1751 | /* |
1725 | * David Härdeman <david@2gen.com> | 1752 | * David Härdeman <david@2gen.com> |
1726 | * The key makes the SCSI stack print confusing (but harmless) messages | 1753 | * The key makes the SCSI stack print confusing (but harmless) messages |
@@ -1745,14 +1772,6 @@ UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001, | |||
1745 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1772 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1746 | US_FL_CAPACITY_HEURISTICS), | 1773 | US_FL_CAPACITY_HEURISTICS), |
1747 | 1774 | ||
1748 | #ifdef CONFIG_USB_STORAGE_CYPRESS_ATACB | ||
1749 | UNUSUAL_DEV( 0x04b4, 0x6830, 0x0000, 0x9999, | ||
1750 | "Cypress", | ||
1751 | "Cypress AT2LP", | ||
1752 | US_SC_CYP_ATACB, US_PR_BULK, NULL, | ||
1753 | 0), | ||
1754 | #endif | ||
1755 | |||
1756 | /* Control/Bulk transport for all SubClass values */ | 1775 | /* Control/Bulk transport for all SubClass values */ |
1757 | USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR), | 1776 | USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR), |
1758 | USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR), | 1777 | USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR), |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index bb1dadaa4a23..2cdaf1ff8315 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -171,7 +171,6 @@ config FB_SYS_FOPS | |||
171 | config FB_DEFERRED_IO | 171 | config FB_DEFERRED_IO |
172 | bool | 172 | bool |
173 | depends on FB | 173 | depends on FB |
174 | default y | ||
175 | 174 | ||
176 | config FB_METRONOME | 175 | config FB_METRONOME |
177 | tristate | 176 | tristate |
diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 8ffdf3578768..b004036d4087 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c | |||
@@ -441,14 +441,15 @@ static int atmel_lcdfb_set_par(struct fb_info *info) | |||
441 | 441 | ||
442 | value = DIV_ROUND_UP(clk_value_khz, PICOS2KHZ(info->var.pixclock)); | 442 | value = DIV_ROUND_UP(clk_value_khz, PICOS2KHZ(info->var.pixclock)); |
443 | 443 | ||
444 | value = (value / 2) - 1; | 444 | if (value < 2) { |
445 | dev_dbg(info->device, " * programming CLKVAL = 0x%08lx\n", value); | ||
446 | |||
447 | if (value <= 0) { | ||
448 | dev_notice(info->device, "Bypassing pixel clock divider\n"); | 445 | dev_notice(info->device, "Bypassing pixel clock divider\n"); |
449 | lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, ATMEL_LCDC_BYPASS); | 446 | lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, ATMEL_LCDC_BYPASS); |
450 | } else { | 447 | } else { |
451 | lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, value << ATMEL_LCDC_CLKVAL_OFFSET); | 448 | value = (value / 2) - 1; |
449 | dev_dbg(info->device, " * programming CLKVAL = 0x%08lx\n", | ||
450 | value); | ||
451 | lcdc_writel(sinfo, ATMEL_LCDC_LCDCON1, | ||
452 | value << ATMEL_LCDC_CLKVAL_OFFSET); | ||
452 | info->var.pixclock = KHZ2PICOS(clk_value_khz / (2 * (value + 1))); | 453 | info->var.pixclock = KHZ2PICOS(clk_value_khz / (2 * (value + 1))); |
453 | dev_dbg(info->device, " updated pixclk: %lu KHz\n", | 454 | dev_dbg(info->device, " updated pixclk: %lu KHz\n", |
454 | PICOS2KHZ(info->var.pixclock)); | 455 | PICOS2KHZ(info->var.pixclock)); |
diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index 275d9dab0c61..e721644bad74 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c | |||
@@ -17,11 +17,9 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/fb.h> | 18 | #include <linux/fb.h> |
19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
20 | #include <linux/of_device.h> | ||
20 | 21 | ||
21 | #include <asm/io.h> | 22 | #include <asm/io.h> |
22 | #include <asm/oplib.h> | ||
23 | #include <asm/prom.h> | ||
24 | #include <asm/of_device.h> | ||
25 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
26 | 24 | ||
27 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -299,7 +297,7 @@ static int __devinit bw2_probe(struct of_device *op, const struct of_device_id * | |||
299 | par->physbase = op->resource[0].start; | 297 | par->physbase = op->resource[0].start; |
300 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; | 298 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; |
301 | 299 | ||
302 | sbusfb_fill_var(&info->var, dp->node, 1); | 300 | sbusfb_fill_var(&info->var, dp, 1); |
303 | linebytes = of_getintprop_default(dp, "linebytes", | 301 | linebytes = of_getintprop_default(dp, "linebytes", |
304 | info->var.xres); | 302 | info->var.xres); |
305 | 303 | ||
@@ -329,7 +327,7 @@ static int __devinit bw2_probe(struct of_device *op, const struct of_device_id * | |||
329 | if (!info->screen_base) | 327 | if (!info->screen_base) |
330 | goto out_unmap_regs; | 328 | goto out_unmap_regs; |
331 | 329 | ||
332 | bw2_blank(0, info); | 330 | bw2_blank(FB_BLANK_UNBLANK, info); |
333 | 331 | ||
334 | bw2_init_fix(info, linebytes); | 332 | bw2_init_fix(info, linebytes); |
335 | 333 | ||
diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index 0db0fecba93b..b17e74671779 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c | |||
@@ -17,10 +17,9 @@ | |||
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/uaccess.h> | 19 | #include <linux/uaccess.h> |
20 | #include <linux/of_device.h> | ||
20 | 21 | ||
21 | #include <asm/io.h> | 22 | #include <asm/io.h> |
22 | #include <asm/prom.h> | ||
23 | #include <asm/of_device.h> | ||
24 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
25 | 24 | ||
26 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -482,7 +481,7 @@ static int __devinit cg14_probe(struct of_device *op, const struct of_device_id | |||
482 | 481 | ||
483 | spin_lock_init(&par->lock); | 482 | spin_lock_init(&par->lock); |
484 | 483 | ||
485 | sbusfb_fill_var(&info->var, dp->node, 8); | 484 | sbusfb_fill_var(&info->var, dp, 8); |
486 | info->var.red.length = 8; | 485 | info->var.red.length = 8; |
487 | info->var.green.length = 8; | 486 | info->var.green.length = 8; |
488 | info->var.blue.length = 8; | 487 | info->var.blue.length = 8; |
diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c index 010ea53978f8..3aa7b6cb0268 100644 --- a/drivers/video/cg3.c +++ b/drivers/video/cg3.c | |||
@@ -17,11 +17,9 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/fb.h> | 18 | #include <linux/fb.h> |
19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
20 | #include <linux/of_device.h> | ||
20 | 21 | ||
21 | #include <asm/io.h> | 22 | #include <asm/io.h> |
22 | #include <asm/oplib.h> | ||
23 | #include <asm/prom.h> | ||
24 | #include <asm/of_device.h> | ||
25 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
26 | 24 | ||
27 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -373,7 +371,7 @@ static int __devinit cg3_probe(struct of_device *op, | |||
373 | par->physbase = op->resource[0].start; | 371 | par->physbase = op->resource[0].start; |
374 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; | 372 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; |
375 | 373 | ||
376 | sbusfb_fill_var(&info->var, dp->node, 8); | 374 | sbusfb_fill_var(&info->var, dp, 8); |
377 | info->var.red.length = 8; | 375 | info->var.red.length = 8; |
378 | info->var.green.length = 8; | 376 | info->var.green.length = 8; |
379 | info->var.blue.length = 8; | 377 | info->var.blue.length = 8; |
@@ -398,7 +396,7 @@ static int __devinit cg3_probe(struct of_device *op, | |||
398 | if (!info->screen_base) | 396 | if (!info->screen_base) |
399 | goto out_unmap_regs; | 397 | goto out_unmap_regs; |
400 | 398 | ||
401 | cg3_blank(0, info); | 399 | cg3_blank(FB_BLANK_UNBLANK, info); |
402 | 400 | ||
403 | if (!of_find_property(dp, "width", NULL)) { | 401 | if (!of_find_property(dp, "width", NULL)) { |
404 | err = cg3_do_default_mode(par); | 402 | err = cg3_do_default_mode(par); |
diff --git a/drivers/video/cg6.c b/drivers/video/cg6.c index fc90db6da65a..2f64bb3bd254 100644 --- a/drivers/video/cg6.c +++ b/drivers/video/cg6.c | |||
@@ -17,9 +17,9 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/fb.h> | 18 | #include <linux/fb.h> |
19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
20 | #include <linux/of_device.h> | ||
20 | 21 | ||
21 | #include <asm/io.h> | 22 | #include <asm/io.h> |
22 | #include <asm/of_device.h> | ||
23 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
24 | 24 | ||
25 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -728,7 +728,7 @@ static int __devinit cg6_probe(struct of_device *op, | |||
728 | par->physbase = op->resource[0].start; | 728 | par->physbase = op->resource[0].start; |
729 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; | 729 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; |
730 | 730 | ||
731 | sbusfb_fill_var(&info->var, dp->node, 8); | 731 | sbusfb_fill_var(&info->var, dp, 8); |
732 | info->var.red.length = 8; | 732 | info->var.red.length = 8; |
733 | info->var.green.length = 8; | 733 | info->var.green.length = 8; |
734 | info->var.blue.length = 8; | 734 | info->var.blue.length = 8; |
@@ -767,7 +767,7 @@ static int __devinit cg6_probe(struct of_device *op, | |||
767 | 767 | ||
768 | cg6_bt_init(par); | 768 | cg6_bt_init(par); |
769 | cg6_chip_init(info); | 769 | cg6_chip_init(info); |
770 | cg6_blank(0, info); | 770 | cg6_blank(FB_BLANK_UNBLANK, info); |
771 | 771 | ||
772 | if (fb_alloc_cmap(&info->cmap, 256, 0)) | 772 | if (fb_alloc_cmap(&info->cmap, 256, 0)) |
773 | goto out_unmap_regs; | 773 | goto out_unmap_regs; |
diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c index ad31983b43eb..5fa8b76673cb 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c | |||
@@ -1853,6 +1853,8 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1853 | struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; | 1853 | struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]]; |
1854 | struct display *p = &fb_display[vc->vc_num]; | 1854 | struct display *p = &fb_display[vc->vc_num]; |
1855 | int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; | 1855 | int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK; |
1856 | unsigned short saved_ec; | ||
1857 | int ret; | ||
1856 | 1858 | ||
1857 | if (fbcon_is_inactive(vc, info)) | 1859 | if (fbcon_is_inactive(vc, info)) |
1858 | return -EINVAL; | 1860 | return -EINVAL; |
@@ -1865,6 +1867,11 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1865 | * whole screen (prevents flicker). | 1867 | * whole screen (prevents flicker). |
1866 | */ | 1868 | */ |
1867 | 1869 | ||
1870 | saved_ec = vc->vc_video_erase_char; | ||
1871 | vc->vc_video_erase_char = vc->vc_scrl_erase_char; | ||
1872 | |||
1873 | ret = 0; | ||
1874 | |||
1868 | switch (dir) { | 1875 | switch (dir) { |
1869 | case SM_UP: | 1876 | case SM_UP: |
1870 | if (count > vc->vc_rows) /* Maximum realistic size */ | 1877 | if (count > vc->vc_rows) /* Maximum realistic size */ |
@@ -1883,7 +1890,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1883 | (b - count)), | 1890 | (b - count)), |
1884 | vc->vc_scrl_erase_char, | 1891 | vc->vc_scrl_erase_char, |
1885 | vc->vc_size_row * count); | 1892 | vc->vc_size_row * count); |
1886 | return 1; | 1893 | ret = 1; |
1887 | break; | 1894 | break; |
1888 | 1895 | ||
1889 | case SCROLL_WRAP_MOVE: | 1896 | case SCROLL_WRAP_MOVE: |
@@ -1955,7 +1962,8 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1955 | (b - count)), | 1962 | (b - count)), |
1956 | vc->vc_scrl_erase_char, | 1963 | vc->vc_scrl_erase_char, |
1957 | vc->vc_size_row * count); | 1964 | vc->vc_size_row * count); |
1958 | return 1; | 1965 | ret = 1; |
1966 | break; | ||
1959 | } | 1967 | } |
1960 | break; | 1968 | break; |
1961 | 1969 | ||
@@ -1974,7 +1982,7 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
1974 | t), | 1982 | t), |
1975 | vc->vc_scrl_erase_char, | 1983 | vc->vc_scrl_erase_char, |
1976 | vc->vc_size_row * count); | 1984 | vc->vc_size_row * count); |
1977 | return 1; | 1985 | ret = 1; |
1978 | break; | 1986 | break; |
1979 | 1987 | ||
1980 | case SCROLL_WRAP_MOVE: | 1988 | case SCROLL_WRAP_MOVE: |
@@ -2044,10 +2052,13 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir, | |||
2044 | t), | 2052 | t), |
2045 | vc->vc_scrl_erase_char, | 2053 | vc->vc_scrl_erase_char, |
2046 | vc->vc_size_row * count); | 2054 | vc->vc_size_row * count); |
2047 | return 1; | 2055 | ret = 1; |
2056 | break; | ||
2048 | } | 2057 | } |
2058 | break; | ||
2049 | } | 2059 | } |
2050 | return 0; | 2060 | vc->vc_video_erase_char = saved_ec; |
2061 | return ret; | ||
2051 | } | 2062 | } |
2052 | 2063 | ||
2053 | 2064 | ||
@@ -2507,6 +2518,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | |||
2507 | c = vc->vc_video_erase_char; | 2518 | c = vc->vc_video_erase_char; |
2508 | vc->vc_video_erase_char = | 2519 | vc->vc_video_erase_char = |
2509 | ((c & 0xfe00) >> 1) | (c & 0xff); | 2520 | ((c & 0xfe00) >> 1) | (c & 0xff); |
2521 | c = vc->vc_def_color; | ||
2522 | vc->vc_scrl_erase_char = | ||
2523 | ((c & 0xFE00) >> 1) | (c & 0xFF); | ||
2510 | vc->vc_attr >>= 1; | 2524 | vc->vc_attr >>= 1; |
2511 | } | 2525 | } |
2512 | } else if (!vc->vc_hi_font_mask && cnt == 512) { | 2526 | } else if (!vc->vc_hi_font_mask && cnt == 512) { |
@@ -2537,9 +2551,14 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, | |||
2537 | if (vc->vc_can_do_color) { | 2551 | if (vc->vc_can_do_color) { |
2538 | vc->vc_video_erase_char = | 2552 | vc->vc_video_erase_char = |
2539 | ((c & 0xff00) << 1) | (c & 0xff); | 2553 | ((c & 0xff00) << 1) | (c & 0xff); |
2554 | c = vc->vc_def_color; | ||
2555 | vc->vc_scrl_erase_char = | ||
2556 | ((c & 0xFF00) << 1) | (c & 0xFF); | ||
2540 | vc->vc_attr <<= 1; | 2557 | vc->vc_attr <<= 1; |
2541 | } else | 2558 | } else { |
2542 | vc->vc_video_erase_char = c & ~0x100; | 2559 | vc->vc_video_erase_char = c & ~0x100; |
2560 | vc->vc_scrl_erase_char = c & ~0x100; | ||
2561 | } | ||
2543 | } | 2562 | } |
2544 | 2563 | ||
2545 | } | 2564 | } |
diff --git a/drivers/video/ffb.c b/drivers/video/ffb.c index 93dca3e2aa50..7992b13ee68f 100644 --- a/drivers/video/ffb.c +++ b/drivers/video/ffb.c | |||
@@ -16,11 +16,10 @@ | |||
16 | #include <linux/fb.h> | 16 | #include <linux/fb.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/timer.h> | 18 | #include <linux/timer.h> |
19 | #include <linux/of_device.h> | ||
19 | 20 | ||
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | #include <asm/upa.h> | 22 | #include <asm/upa.h> |
22 | #include <asm/prom.h> | ||
23 | #include <asm/of_device.h> | ||
24 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
25 | 24 | ||
26 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -941,7 +940,7 @@ static int __devinit ffb_probe(struct of_device *op, | |||
941 | info->screen_base = (char *) par->physbase + FFB_DFB24_POFF; | 940 | info->screen_base = (char *) par->physbase + FFB_DFB24_POFF; |
942 | info->pseudo_palette = par->pseudo_palette; | 941 | info->pseudo_palette = par->pseudo_palette; |
943 | 942 | ||
944 | sbusfb_fill_var(&info->var, dp->node, 32); | 943 | sbusfb_fill_var(&info->var, dp, 32); |
945 | par->fbsize = PAGE_ALIGN(info->var.xres * info->var.yres * 4); | 944 | par->fbsize = PAGE_ALIGN(info->var.xres * info->var.yres * 4); |
946 | ffb_fixup_var_rgb(&info->var); | 945 | ffb_fixup_var_rgb(&info->var); |
947 | 946 | ||
@@ -987,7 +986,7 @@ static int __devinit ffb_probe(struct of_device *op, | |||
987 | * chosen console, it will have video outputs off in | 986 | * chosen console, it will have video outputs off in |
988 | * the DAC. | 987 | * the DAC. |
989 | */ | 988 | */ |
990 | ffb_blank(0, info); | 989 | ffb_blank(FB_BLANK_UNBLANK, info); |
991 | 990 | ||
992 | if (fb_alloc_cmap(&info->cmap, 256, 0)) | 991 | if (fb_alloc_cmap(&info->cmap, 256, 0)) |
993 | goto out_unmap_dac; | 992 | goto out_unmap_dac; |
diff --git a/drivers/video/geode/lxfb_ops.c b/drivers/video/geode/lxfb_ops.c index cd9d4cc26954..aaef9165ec9b 100644 --- a/drivers/video/geode/lxfb_ops.c +++ b/drivers/video/geode/lxfb_ops.c | |||
@@ -63,54 +63,32 @@ static const struct { | |||
63 | { 0x00014284, 19688 }, | 63 | { 0x00014284, 19688 }, |
64 | { 0x00011104, 20400 }, | 64 | { 0x00011104, 20400 }, |
65 | { 0x00016363, 23625 }, | 65 | { 0x00016363, 23625 }, |
66 | { 0x00015303, 24380 }, | ||
67 | { 0x000031AC, 24923 }, | 66 | { 0x000031AC, 24923 }, |
68 | { 0x0000215D, 25175 }, | 67 | { 0x0000215D, 25175 }, |
69 | { 0x00001087, 27000 }, | 68 | { 0x00001087, 27000 }, |
70 | { 0x0000216C, 28322 }, | 69 | { 0x0000216C, 28322 }, |
71 | { 0x0000218D, 28560 }, | 70 | { 0x0000218D, 28560 }, |
72 | { 0x00010041, 29913 }, | ||
73 | { 0x000010C9, 31200 }, | 71 | { 0x000010C9, 31200 }, |
74 | { 0x00003147, 31500 }, | 72 | { 0x00003147, 31500 }, |
75 | { 0x000141A1, 32400 }, | ||
76 | { 0x000010A7, 33032 }, | 73 | { 0x000010A7, 33032 }, |
77 | { 0x00012182, 33375 }, | ||
78 | { 0x000141B1, 33750 }, | ||
79 | { 0x00002159, 35112 }, | 74 | { 0x00002159, 35112 }, |
80 | { 0x00004249, 35500 }, | 75 | { 0x00004249, 35500 }, |
81 | { 0x00000057, 36000 }, | 76 | { 0x00000057, 36000 }, |
82 | { 0x000141E1, 37125 }, | ||
83 | { 0x0000219A, 37889 }, | 77 | { 0x0000219A, 37889 }, |
84 | { 0x00002158, 39168 }, | 78 | { 0x00002158, 39168 }, |
85 | { 0x00000045, 40000 }, | 79 | { 0x00000045, 40000 }, |
86 | { 0x000131A1, 40500 }, | ||
87 | { 0x00010061, 42301 }, | ||
88 | { 0x00000089, 43163 }, | 80 | { 0x00000089, 43163 }, |
89 | { 0x00012151, 43875 }, | ||
90 | { 0x000010E7, 44900 }, | 81 | { 0x000010E7, 44900 }, |
91 | { 0x00002136, 45720 }, | 82 | { 0x00002136, 45720 }, |
92 | { 0x000152E1, 47250 }, | ||
93 | { 0x00010071, 48000 }, | ||
94 | { 0x00003207, 49500 }, | 83 | { 0x00003207, 49500 }, |
95 | { 0x00002187, 50000 }, | 84 | { 0x00002187, 50000 }, |
96 | { 0x00014291, 50625 }, | ||
97 | { 0x00011101, 51188 }, | ||
98 | { 0x00017481, 54563 }, | ||
99 | { 0x00004286, 56250 }, | 85 | { 0x00004286, 56250 }, |
100 | { 0x00014170, 57375 }, | ||
101 | { 0x00016210, 58500 }, | ||
102 | { 0x000010E5, 60065 }, | 86 | { 0x000010E5, 60065 }, |
103 | { 0x00013140, 62796 }, | ||
104 | { 0x00004214, 65000 }, | 87 | { 0x00004214, 65000 }, |
105 | { 0x00016250, 65250 }, | ||
106 | { 0x00001105, 68179 }, | 88 | { 0x00001105, 68179 }, |
107 | { 0x000141C0, 69600 }, | ||
108 | { 0x00015220, 70160 }, | ||
109 | { 0x00010050, 72000 }, | ||
110 | { 0x000031E4, 74250 }, | 89 | { 0x000031E4, 74250 }, |
111 | { 0x00003183, 75000 }, | 90 | { 0x00003183, 75000 }, |
112 | { 0x00004284, 78750 }, | 91 | { 0x00004284, 78750 }, |
113 | { 0x00012130, 80052 }, | ||
114 | { 0x00001104, 81600 }, | 92 | { 0x00001104, 81600 }, |
115 | { 0x00006363, 94500 }, | 93 | { 0x00006363, 94500 }, |
116 | { 0x00005303, 97520 }, | 94 | { 0x00005303, 97520 }, |
diff --git a/drivers/video/leo.c b/drivers/video/leo.c index f3160fc29795..8bc46e930340 100644 --- a/drivers/video/leo.c +++ b/drivers/video/leo.c | |||
@@ -16,10 +16,9 @@ | |||
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/of_device.h> | ||
19 | 20 | ||
20 | #include <asm/io.h> | 21 | #include <asm/io.h> |
21 | #include <asm/prom.h> | ||
22 | #include <asm/of_device.h> | ||
23 | #include <asm/fbio.h> | 22 | #include <asm/fbio.h> |
24 | 23 | ||
25 | #include "sbuslib.h" | 24 | #include "sbuslib.h" |
@@ -562,7 +561,7 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id * | |||
562 | par->physbase = op->resource[0].start; | 561 | par->physbase = op->resource[0].start; |
563 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; | 562 | par->which_io = op->resource[0].flags & IORESOURCE_BITS; |
564 | 563 | ||
565 | sbusfb_fill_var(&info->var, dp->node, 32); | 564 | sbusfb_fill_var(&info->var, dp, 32); |
566 | leo_fixup_var_rgb(&info->var); | 565 | leo_fixup_var_rgb(&info->var); |
567 | 566 | ||
568 | linebytes = of_getintprop_default(dp, "linebytes", | 567 | linebytes = of_getintprop_default(dp, "linebytes", |
@@ -601,7 +600,7 @@ static int __devinit leo_probe(struct of_device *op, const struct of_device_id * | |||
601 | leo_init_wids(info); | 600 | leo_init_wids(info); |
602 | leo_init_hw(info); | 601 | leo_init_hw(info); |
603 | 602 | ||
604 | leo_blank(0, info); | 603 | leo_blank(FB_BLANK_UNBLANK, info); |
605 | 604 | ||
606 | if (fb_alloc_cmap(&info->cmap, 256, 0)) | 605 | if (fb_alloc_cmap(&info->cmap, 256, 0)) |
607 | goto out_unmap_regs; | 606 | goto out_unmap_regs; |
diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig index 9de1c114f809..39ac49e0682c 100644 --- a/drivers/video/logo/Kconfig +++ b/drivers/video/logo/Kconfig | |||
@@ -27,6 +27,16 @@ config LOGO_LINUX_CLUT224 | |||
27 | bool "Standard 224-color Linux logo" | 27 | bool "Standard 224-color Linux logo" |
28 | default y | 28 | default y |
29 | 29 | ||
30 | config LOGO_BLACKFIN_VGA16 | ||
31 | bool "16-colour Blackfin Processor Linux logo" | ||
32 | depends on BLACKFIN | ||
33 | default y | ||
34 | |||
35 | config LOGO_BLACKFIN_CLUT224 | ||
36 | bool "224-colour Blackfin Processor Linux logo" | ||
37 | depends on BLACKFIN | ||
38 | default y | ||
39 | |||
30 | config LOGO_DEC_CLUT224 | 40 | config LOGO_DEC_CLUT224 |
31 | bool "224-color Digital Equipment Corporation Linux logo" | 41 | bool "224-color Digital Equipment Corporation Linux logo" |
32 | depends on MACH_DECSTATION || ALPHA | 42 | depends on MACH_DECSTATION || ALPHA |
diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile index a5fc4edf84e6..b91251d1fe41 100644 --- a/drivers/video/logo/Makefile +++ b/drivers/video/logo/Makefile | |||
@@ -4,6 +4,8 @@ obj-$(CONFIG_LOGO) += logo.o | |||
4 | obj-$(CONFIG_LOGO_LINUX_MONO) += logo_linux_mono.o | 4 | obj-$(CONFIG_LOGO_LINUX_MONO) += logo_linux_mono.o |
5 | obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o | 5 | obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o |
6 | obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o | 6 | obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o |
7 | obj-$(CONFIG_LOGO_BLACKFIN_CLUT224) += logo_blackfin_clut224.o | ||
8 | obj-$(CONFIG_LOGO_BLACKFIN_VGA16) += logo_blackfin_vga16.o | ||
7 | obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o | 9 | obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o |
8 | obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o | 10 | obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o |
9 | obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o | 11 | obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o |
diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c index fc72684aae5a..2e85a2b52d05 100644 --- a/drivers/video/logo/logo.c +++ b/drivers/video/logo/logo.c | |||
@@ -24,6 +24,8 @@ | |||
24 | extern const struct linux_logo logo_linux_mono; | 24 | extern const struct linux_logo logo_linux_mono; |
25 | extern const struct linux_logo logo_linux_vga16; | 25 | extern const struct linux_logo logo_linux_vga16; |
26 | extern const struct linux_logo logo_linux_clut224; | 26 | extern const struct linux_logo logo_linux_clut224; |
27 | extern const struct linux_logo logo_blackfin_vga16; | ||
28 | extern const struct linux_logo logo_blackfin_clut224; | ||
27 | extern const struct linux_logo logo_dec_clut224; | 29 | extern const struct linux_logo logo_dec_clut224; |
28 | extern const struct linux_logo logo_mac_clut224; | 30 | extern const struct linux_logo logo_mac_clut224; |
29 | extern const struct linux_logo logo_parisc_clut224; | 31 | extern const struct linux_logo logo_parisc_clut224; |
@@ -65,6 +67,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth) | |||
65 | /* Generic Linux logo */ | 67 | /* Generic Linux logo */ |
66 | logo = &logo_linux_vga16; | 68 | logo = &logo_linux_vga16; |
67 | #endif | 69 | #endif |
70 | #ifdef CONFIG_LOGO_BLACKFIN_VGA16 | ||
71 | /* Blackfin processor logo */ | ||
72 | logo = &logo_blackfin_vga16; | ||
73 | #endif | ||
68 | #ifdef CONFIG_LOGO_SUPERH_VGA16 | 74 | #ifdef CONFIG_LOGO_SUPERH_VGA16 |
69 | /* SuperH Linux logo */ | 75 | /* SuperH Linux logo */ |
70 | logo = &logo_superh_vga16; | 76 | logo = &logo_superh_vga16; |
@@ -76,6 +82,10 @@ const struct linux_logo * __init_refok fb_find_logo(int depth) | |||
76 | /* Generic Linux logo */ | 82 | /* Generic Linux logo */ |
77 | logo = &logo_linux_clut224; | 83 | logo = &logo_linux_clut224; |
78 | #endif | 84 | #endif |
85 | #ifdef CONFIG_LOGO_BLACKFIN_CLUT224 | ||
86 | /* Blackfin Linux logo */ | ||
87 | logo = &logo_blackfin_clut224; | ||
88 | #endif | ||
79 | #ifdef CONFIG_LOGO_DEC_CLUT224 | 89 | #ifdef CONFIG_LOGO_DEC_CLUT224 |
80 | /* DEC Linux logo on MIPS/MIPS64 or ALPHA */ | 90 | /* DEC Linux logo on MIPS/MIPS64 or ALPHA */ |
81 | logo = &logo_dec_clut224; | 91 | logo = &logo_dec_clut224; |
diff --git a/drivers/video/logo/logo_blackfin_clut224.ppm b/drivers/video/logo/logo_blackfin_clut224.ppm new file mode 100644 index 000000000000..dc9a50a14477 --- /dev/null +++ b/drivers/video/logo/logo_blackfin_clut224.ppm | |||
@@ -0,0 +1,1127 @@ | |||
1 | P3 | ||
2 | # This was generated by the GIMP & Netpbm tools | ||
3 | # gimp linux_bf.svg (create 80x80 save as linux_bf.ppm) | ||
4 | # pnmquant 224 linux_bf.ppm | pnmnoraw > logo_blackfin_clut224.ppm | ||
5 | # | ||
6 | 80 80 | ||
7 | 255 | ||
8 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
9 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
10 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
11 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
12 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
13 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
14 | 1 1 1 3 3 3 4 6 6 6 6 6 4 6 6 3 3 3 | ||
15 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
16 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
17 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
18 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
19 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
20 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
21 | 0 0 0 0 0 0 | ||
22 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
23 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
24 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
25 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
26 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
27 | 0 0 0 0 0 0 0 0 0 2 2 2 10 10 10 26 26 27 | ||
28 | 44 44 45 66 66 66 78 81 81 78 81 81 75 75 76 60 60 60 | ||
29 | 39 39 39 20 20 20 6 6 6 1 1 1 0 0 0 0 0 0 | ||
30 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
31 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
32 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
33 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
34 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
35 | 0 0 0 0 0 0 | ||
36 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
37 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
38 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
39 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
40 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
41 | 0 0 0 2 2 2 14 14 14 47 47 47 84 84 84 75 75 76 | ||
42 | 47 47 47 12 12 12 0 0 0 0 0 0 0 0 0 20 20 20 | ||
43 | 53 54 54 81 81 82 74 74 74 31 31 31 6 6 6 0 0 0 | ||
44 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
45 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
46 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
47 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
48 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
49 | 0 0 0 0 0 0 | ||
50 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
51 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
52 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
53 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
54 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
55 | 4 4 4 34 34 35 84 84 84 60 60 60 4 4 4 0 0 0 | ||
56 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
57 | 0 0 0 0 0 0 17 18 18 75 75 76 66 66 66 17 18 18 | ||
58 | 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
59 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
60 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
61 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
62 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
63 | 0 0 0 0 0 0 | ||
64 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
65 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
66 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
67 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
68 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 | ||
69 | 42 42 43 84 84 84 8 8 8 0 0 0 0 0 0 0 0 0 | ||
70 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
71 | 0 3 3 36 40 40 10 16 16 0 0 0 31 31 31 84 84 84 | ||
72 | 29 29 30 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 | ||
73 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
74 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
75 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
76 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
77 | 0 0 0 0 0 0 | ||
78 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
79 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
80 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
81 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
82 | 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 26 27 27 | ||
83 | 84 84 84 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 | ||
84 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
85 | 15 19 19 114 115 115 110 114 114 44 46 46 0 0 0 12 12 12 | ||
86 | 90 87 86 24 24 24 1 1 1 0 0 0 0 0 0 0 0 0 | ||
87 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
88 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
89 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
90 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
91 | 0 0 0 0 0 0 | ||
92 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
93 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
94 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
95 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
96 | 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 75 75 76 | ||
97 | 14 14 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
98 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
99 | 30 40 40 133 133 133 129 130 130 78 85 85 23 31 30 0 0 0 | ||
100 | 19 19 19 78 81 81 13 13 13 0 0 0 0 0 0 0 0 0 | ||
101 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
102 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
103 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
104 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
105 | 0 0 0 0 0 0 | ||
106 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
107 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
108 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
109 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
110 | 0 0 0 0 0 0 0 0 0 0 0 0 26 27 27 81 81 82 | ||
111 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
112 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
113 | 36 40 40 89 90 91 55 63 63 23 31 30 4 6 6 0 0 0 | ||
114 | 0 0 0 60 60 60 47 47 47 2 2 2 0 0 0 0 0 0 | ||
115 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
116 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
117 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
118 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
119 | 0 0 0 0 0 0 | ||
120 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
121 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
122 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
123 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
124 | 0 0 0 0 0 0 0 0 0 2 2 2 53 54 54 34 34 35 | ||
125 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
126 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
127 | 4 10 10 7 9 9 0 0 0 0 0 0 0 0 0 0 0 0 | ||
128 | 0 0 0 1 1 1 84 84 84 13 13 13 0 0 0 0 0 0 | ||
129 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
130 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
131 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
132 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
133 | 0 0 0 0 0 0 | ||
134 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
135 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
136 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
137 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
138 | 0 0 0 0 0 0 0 0 0 4 6 6 78 81 81 2 2 2 | ||
139 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
140 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
141 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
142 | 0 0 0 0 0 0 65 64 64 36 36 36 0 0 0 0 0 0 | ||
143 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
144 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
145 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
146 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
147 | 0 0 0 0 0 0 | ||
148 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
149 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
150 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
151 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
152 | 0 0 0 0 0 0 0 0 0 10 11 11 81 81 82 0 0 0 | ||
153 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
154 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
155 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
156 | 0 0 0 0 0 0 12 12 12 67 70 70 4 4 4 0 0 0 | ||
157 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
158 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
159 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
160 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
161 | 0 0 0 0 0 0 | ||
162 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
163 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
164 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
165 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
166 | 0 0 0 0 0 0 0 0 0 16 16 16 81 81 82 0 0 0 | ||
167 | 0 0 0 0 0 0 4 10 10 44 50 50 18 21 21 0 0 0 | ||
168 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
169 | 0 1 1 78 85 85 120 121 122 7 9 9 0 0 0 0 0 0 | ||
170 | 0 0 0 0 0 0 0 0 0 82 82 81 12 12 12 0 0 0 | ||
171 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
172 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
173 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
174 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
175 | 0 0 0 0 0 0 | ||
176 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
177 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
178 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
179 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
180 | 0 0 0 0 0 0 0 0 0 19 19 19 81 81 82 0 0 0 | ||
181 | 0 0 0 2 2 2 8 8 8 55 63 63 108 110 110 52 58 58 | ||
182 | 0 0 0 0 0 0 0 0 0 0 0 0 42 42 43 129 130 130 | ||
183 | 140 142 143 114 115 115 110 114 114 129 130 130 0 0 0 0 0 0 | ||
184 | 0 0 0 0 0 0 0 0 0 75 75 76 24 24 24 0 0 0 | ||
185 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
186 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
187 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
188 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
189 | 0 0 0 0 0 0 | ||
190 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
191 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
192 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
193 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
194 | 0 0 0 0 0 0 0 0 0 19 19 19 74 74 74 0 0 0 | ||
195 | 4 6 6 167 168 167 196 196 197 196 196 197 61 65 66 78 85 85 | ||
196 | 0 0 0 0 0 0 0 0 0 118 118 118 202 202 203 219 219 219 | ||
197 | 219 219 219 214 214 215 187 187 188 78 85 85 29 33 34 0 0 0 | ||
198 | 0 0 0 0 0 0 0 0 0 60 60 60 39 39 39 0 0 0 | ||
199 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
200 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
201 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
202 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
203 | 0 0 0 0 0 0 | ||
204 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
205 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
206 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
207 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
208 | 0 0 0 0 0 0 0 0 0 19 19 19 72 71 71 0 0 0 | ||
209 | 185 185 184 244 245 245 250 251 252 251 251 252 247 248 249 36 36 36 | ||
210 | 0 0 0 0 0 0 13 13 13 243 243 241 252 252 252 253 253 253 | ||
211 | 253 253 253 252 252 252 247 247 246 193 193 194 0 0 0 0 0 0 | ||
212 | 0 0 0 0 0 0 0 0 0 42 42 43 50 51 51 1 1 1 | ||
213 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
214 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
215 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
216 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
217 | 0 0 0 0 0 0 | ||
218 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
219 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
220 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
221 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
222 | 0 0 0 0 0 0 0 0 0 19 19 19 78 81 81 0 0 0 | ||
223 | 247 247 246 193 193 194 95 97 97 193 193 194 255 255 255 237 237 238 | ||
224 | 0 0 0 0 0 0 202 202 203 255 255 255 247 247 246 108 107 107 | ||
225 | 82 85 86 167 168 167 255 255 255 248 248 249 0 0 0 0 0 0 | ||
226 | 0 0 0 0 0 0 0 0 0 34 34 35 56 56 56 2 2 2 | ||
227 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
228 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
229 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
230 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
231 | 0 0 0 0 0 0 | ||
232 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
233 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
234 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
235 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
236 | 0 0 0 0 0 0 0 0 0 19 19 19 78 81 81 0 0 0 | ||
237 | 250 250 251 50 51 51 153 154 155 150 151 151 244 245 245 244 245 245 | ||
238 | 44 50 50 84 89 89 153 154 155 255 255 255 140 142 143 0 0 0 | ||
239 | 149 149 150 156 155 156 237 237 238 254 254 254 67 70 70 0 0 0 | ||
240 | 0 0 0 0 0 0 0 0 0 39 39 39 47 47 47 1 1 1 | ||
241 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
242 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
243 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
244 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
245 | 0 0 0 0 0 0 | ||
246 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
247 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
248 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
249 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
250 | 0 0 0 0 0 0 0 0 0 19 19 19 81 81 82 0 0 0 | ||
251 | 248 248 249 34 34 35 72 71 71 165 165 165 202 202 203 244 245 245 | ||
252 | 10 16 16 82 85 86 89 90 91 255 255 255 95 97 97 0 0 0 | ||
253 | 0 0 0 53 54 54 177 177 174 255 255 255 127 127 126 0 0 0 | ||
254 | 0 0 0 0 0 0 0 0 0 39 39 39 36 36 36 0 0 0 | ||
255 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
256 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
257 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
258 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
259 | 0 0 0 0 0 0 | ||
260 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
261 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
262 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
263 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
264 | 0 0 0 0 0 0 0 0 0 14 14 14 78 81 81 0 0 0 | ||
265 | 243 243 243 89 90 91 0 0 0 36 40 40 201 147 55 241 205 27 | ||
266 | 241 205 27 241 205 27 241 205 27 238 192 33 108 110 110 0 0 0 | ||
267 | 0 0 0 0 0 0 191 190 190 254 254 254 34 34 35 0 0 0 | ||
268 | 0 0 0 0 0 0 0 0 0 42 42 43 42 42 43 0 0 0 | ||
269 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
270 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
271 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
272 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
273 | 0 0 0 0 0 0 | ||
274 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
275 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
276 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
277 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
278 | 0 0 0 0 0 0 0 0 0 10 10 10 75 75 76 0 0 0 | ||
279 | 202 202 203 218 217 217 21 19 17 230 165 41 199 129 48 213 157 40 | ||
280 | 244 212 23 243 206 27 180 121 62 243 206 27 244 209 25 226 179 40 | ||
281 | 15 10 7 103 103 103 254 254 254 251 251 252 0 0 0 0 0 0 | ||
282 | 0 0 0 0 0 0 0 0 0 17 18 18 58 58 58 2 2 2 | ||
283 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
284 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
285 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
286 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
287 | 0 0 0 0 0 0 | ||
288 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
289 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
290 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
291 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
292 | 0 0 0 0 0 0 0 0 0 9 9 9 84 84 84 0 0 0 | ||
293 | 0 0 0 226 226 219 213 157 40 244 209 25 245 211 23 245 211 23 | ||
294 | 245 214 38 245 214 38 245 211 23 245 211 23 245 211 23 244 212 23 | ||
295 | 244 212 23 241 205 27 226 179 40 196 196 197 0 0 0 0 0 0 | ||
296 | 0 0 0 0 0 0 0 0 0 0 0 0 74 74 74 4 6 6 | ||
297 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
298 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
299 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
300 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
301 | 0 0 0 0 0 0 | ||
302 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
303 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
304 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
305 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
306 | 0 0 0 0 0 0 0 0 0 7 7 7 84 84 84 0 0 0 | ||
307 | 54 42 32 213 157 40 243 206 27 245 211 23 245 211 23 245 211 23 | ||
308 | 245 215 41 245 214 35 245 211 23 245 211 23 245 214 35 245 215 41 | ||
309 | 245 214 35 245 211 23 245 211 23 238 204 29 0 0 0 0 0 0 | ||
310 | 0 0 0 0 0 0 0 0 0 0 0 0 81 81 82 12 12 12 | ||
311 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
312 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
313 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
314 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
315 | 0 0 0 0 0 0 | ||
316 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
317 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
318 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
319 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
320 | 0 0 0 0 0 0 0 0 0 4 6 6 74 74 74 0 0 0 | ||
321 | 201 147 55 241 205 27 245 211 23 245 211 23 245 211 23 245 213 29 | ||
322 | 245 214 38 245 211 23 245 211 23 245 214 35 245 215 41 245 215 41 | ||
323 | 245 213 29 142 83 36 142 83 36 244 209 25 1 1 1 0 0 0 | ||
324 | 0 0 0 0 0 0 0 0 0 0 0 0 74 74 74 25 25 26 | ||
325 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
326 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
327 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
328 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
329 | 0 0 0 0 0 0 | ||
330 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
331 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
332 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
333 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
334 | 0 0 0 0 0 0 0 0 0 4 4 4 72 71 71 6 6 6 | ||
335 | 213 157 40 244 209 25 245 211 23 245 211 23 245 211 23 245 213 29 | ||
336 | 244 212 23 245 211 23 245 214 35 245 215 41 245 215 41 245 213 29 | ||
337 | 142 83 36 142 83 36 238 192 33 241 205 27 0 0 0 0 0 0 | ||
338 | 0 0 0 0 0 0 0 0 0 0 0 0 44 44 44 49 50 50 | ||
339 | 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
340 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
341 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
342 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
343 | 0 0 0 0 0 0 | ||
344 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
345 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
346 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
347 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
348 | 0 0 0 0 0 0 0 0 0 3 3 3 65 64 64 17 18 18 | ||
349 | 199 129 48 199 129 48 245 211 23 245 211 23 245 211 23 245 211 23 | ||
350 | 245 211 23 244 212 23 245 214 38 245 214 38 142 83 36 142 83 36 | ||
351 | 142 83 36 245 211 23 244 210 23 230 165 41 0 0 0 0 0 0 | ||
352 | 78 81 81 114 115 115 73 79 79 0 0 0 3 3 3 81 81 82 | ||
353 | 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
354 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
355 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
356 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
357 | 0 0 0 0 0 0 | ||
358 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
359 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
360 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
361 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
362 | 0 0 0 0 0 0 0 0 0 1 1 1 49 50 50 29 29 30 | ||
363 | 90 87 86 199 129 48 173 101 51 173 101 51 245 211 23 245 211 23 | ||
364 | 245 211 23 230 165 41 142 83 36 142 83 36 142 83 36 245 211 23 | ||
365 | 244 210 23 241 205 27 230 165 41 175 173 165 3 3 3 0 0 0 | ||
366 | 44 46 46 118 118 118 118 118 118 108 110 110 0 0 0 75 75 76 | ||
367 | 28 28 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
368 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
369 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
370 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
371 | 0 0 0 0 0 0 | ||
372 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
373 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
374 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
375 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
376 | 0 0 0 0 0 0 0 0 0 1 1 1 52 53 53 26 26 27 | ||
377 | 118 118 118 175 173 165 199 129 48 173 101 51 173 101 51 173 101 51 | ||
378 | 173 101 51 142 83 36 173 101 51 245 211 23 244 209 25 238 204 29 | ||
379 | 213 157 40 214 196 166 227 227 227 214 214 215 120 121 122 0 0 0 | ||
380 | 0 0 0 108 110 110 118 118 118 118 118 118 0 0 0 23 23 23 | ||
381 | 66 66 66 4 6 6 0 0 0 0 0 0 0 0 0 0 0 0 | ||
382 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
383 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
384 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
385 | 0 0 0 0 0 0 | ||
386 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
387 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
388 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
389 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
390 | 0 0 0 0 0 0 0 0 0 7 7 7 75 75 76 4 4 4 | ||
391 | 127 127 126 205 205 205 181 181 181 199 129 48 226 179 40 244 209 25 | ||
392 | 244 209 25 244 209 25 243 206 27 238 192 33 213 157 40 187 166 103 | ||
393 | 234 234 234 248 248 249 251 252 252 248 248 249 214 214 215 0 0 0 | ||
394 | 0 0 0 0 0 0 103 103 103 100 103 103 0 0 0 0 0 0 | ||
395 | 78 81 81 24 24 24 0 0 0 0 0 0 0 0 0 0 0 0 | ||
396 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
397 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
398 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
399 | 0 0 0 0 0 0 | ||
400 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
401 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
402 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
403 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
404 | 0 0 0 0 0 0 0 0 0 26 27 27 82 82 81 0 0 0 | ||
405 | 146 146 147 234 234 234 222 221 221 178 178 179 180 121 62 213 157 40 | ||
406 | 213 157 40 213 157 40 201 147 55 180 121 62 219 219 219 243 243 241 | ||
407 | 253 253 253 255 255 255 255 255 255 255 255 255 250 250 251 120 121 122 | ||
408 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
409 | 20 20 20 72 71 71 8 8 8 0 0 0 0 0 0 0 0 0 | ||
410 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
411 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
412 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
413 | 0 0 0 0 0 0 | ||
414 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
415 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
416 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
417 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
418 | 0 0 0 0 0 0 10 10 10 75 75 76 22 22 22 0 0 0 | ||
419 | 205 205 205 253 253 253 247 248 249 212 211 212 178 178 179 161 161 162 | ||
420 | 165 165 165 181 181 181 205 205 205 227 227 227 244 245 245 254 254 254 | ||
421 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 239 239 240 | ||
422 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
423 | 0 0 0 67 70 70 39 39 39 2 2 2 0 0 0 0 0 0 | ||
424 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
425 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
426 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
427 | 0 0 0 0 0 0 | ||
428 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
429 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
430 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
431 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
432 | 0 0 0 4 4 4 50 51 51 60 60 60 0 0 0 16 16 16 | ||
433 | 249 250 251 255 255 255 255 255 255 240 240 240 209 210 210 193 193 194 | ||
434 | 200 200 197 212 211 212 231 231 231 246 247 248 255 255 255 255 255 255 | ||
435 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 | ||
436 | 153 154 155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
437 | 0 0 0 3 3 3 84 84 84 20 20 20 0 0 0 0 0 0 | ||
438 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
439 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
440 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
441 | 0 0 0 0 0 0 | ||
442 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
443 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
444 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
445 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
446 | 2 2 2 33 33 34 81 81 82 0 0 0 0 0 0 231 231 231 | ||
447 | 255 255 255 255 255 255 255 255 255 253 253 253 234 234 234 222 221 221 | ||
448 | 227 227 227 237 237 238 250 250 251 255 255 255 255 255 255 255 255 255 | ||
449 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
450 | 240 240 240 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
451 | 0 0 0 0 0 0 26 27 27 72 71 71 8 8 8 0 0 0 | ||
452 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
453 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
454 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
455 | 0 0 0 0 0 0 | ||
456 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
457 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
458 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
459 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 | ||
460 | 21 21 22 84 84 84 7 7 7 0 0 0 150 151 151 252 252 252 | ||
461 | 255 255 255 255 255 255 255 255 255 255 255 255 252 252 252 244 245 245 | ||
462 | 246 247 248 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 | ||
463 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
464 | 251 251 252 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 | ||
465 | 0 0 0 0 0 0 0 0 0 65 64 64 47 47 47 3 3 3 | ||
466 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
467 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
468 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
469 | 0 0 0 0 0 0 | ||
470 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
471 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
472 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
473 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 12 12 | ||
474 | 75 75 76 26 26 27 0 0 0 1 1 1 239 239 240 255 255 255 | ||
475 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
476 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
477 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
478 | 255 255 255 202 202 203 0 0 0 0 0 0 0 0 0 0 0 0 | ||
479 | 0 0 0 0 0 0 0 0 0 0 0 0 84 84 84 28 28 29 | ||
480 | 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
481 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
482 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
483 | 0 0 0 0 0 0 | ||
484 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
485 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
486 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
487 | 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 55 55 55 | ||
488 | 60 60 60 0 0 0 0 0 0 95 97 97 248 248 249 255 255 255 | ||
489 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
490 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
491 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
492 | 255 255 255 244 245 245 0 0 0 0 0 0 0 0 0 0 0 0 | ||
493 | 0 0 0 0 0 0 0 0 0 0 0 0 14 14 14 82 82 81 | ||
494 | 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
495 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
496 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
497 | 0 0 0 0 0 0 | ||
498 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
499 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
500 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
501 | 0 0 0 0 0 0 0 0 0 1 1 1 29 29 30 84 84 84 | ||
502 | 0 0 0 0 0 0 0 0 0 156 155 156 247 247 246 255 255 255 | ||
503 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
504 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
505 | 255 255 255 255 255 255 247 247 246 240 240 240 232 232 233 232 232 233 | ||
506 | 243 243 243 253 253 253 53 54 54 0 0 0 0 0 0 0 0 0 | ||
507 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 44 44 | ||
508 | 60 60 60 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 | ||
509 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
510 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
511 | 0 0 0 0 0 0 | ||
512 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
513 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
514 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
515 | 0 0 0 0 0 0 0 0 0 10 10 10 81 81 82 14 14 14 | ||
516 | 0 0 0 0 0 0 6 6 6 150 151 151 214 214 215 250 251 252 | ||
517 | 255 255 255 255 255 255 255 255 255 246 247 248 218 217 217 214 214 215 | ||
518 | 218 217 217 244 245 245 255 255 255 255 255 255 255 255 255 250 248 249 | ||
519 | 232 232 233 214 214 215 196 196 197 182 183 184 181 181 181 181 181 181 | ||
520 | 187 187 188 240 240 240 232 232 233 0 0 0 0 0 0 0 0 0 | ||
521 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
522 | 78 81 81 34 34 35 1 1 1 0 0 0 0 0 0 0 0 0 | ||
523 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
524 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
525 | 0 0 0 0 0 0 | ||
526 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
527 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
528 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
529 | 0 0 0 0 0 0 1 1 1 39 39 39 74 74 74 0 0 0 | ||
530 | 0 0 0 0 0 0 60 60 60 161 161 162 200 200 197 229 229 230 | ||
531 | 251 251 252 255 255 255 255 255 255 255 255 255 243 243 241 214 214 215 | ||
532 | 248 248 249 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 | ||
533 | 239 239 240 214 214 215 193 193 194 182 183 184 178 178 179 176 177 177 | ||
534 | 176 177 177 182 183 184 248 248 249 14 14 14 0 0 0 61 65 66 | ||
535 | 10 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
536 | 10 10 10 84 84 84 13 13 13 0 0 0 0 0 0 0 0 0 | ||
537 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
538 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
539 | 0 0 0 0 0 0 | ||
540 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
541 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
542 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
543 | 0 0 0 0 0 0 10 11 11 82 82 81 7 7 7 0 0 0 | ||
544 | 0 0 0 0 0 0 165 165 165 229 229 230 249 250 251 254 254 254 | ||
545 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
546 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
547 | 255 255 255 255 255 255 253 253 253 240 240 240 227 227 227 205 205 205 | ||
548 | 181 181 181 176 177 177 191 190 190 227 227 227 0 0 0 44 50 50 | ||
549 | 84 89 89 61 65 66 0 0 0 0 0 0 0 0 0 0 0 0 | ||
550 | 0 0 0 58 58 58 49 50 50 3 3 3 0 0 0 0 0 0 | ||
551 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
552 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
553 | 0 0 0 0 0 0 | ||
554 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
555 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
556 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
557 | 0 0 0 1 1 1 36 36 36 66 66 66 0 0 0 29 33 34 | ||
558 | 0 3 3 26 27 27 234 234 234 254 254 254 255 255 255 255 255 255 | ||
559 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
560 | 254 254 254 253 253 254 252 253 253 253 253 254 253 254 254 253 254 254 | ||
561 | 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 251 251 252 | ||
562 | 227 227 227 187 187 188 176 177 177 222 221 221 13 13 13 0 0 0 | ||
563 | 12 15 14 73 79 79 36 40 40 0 0 0 0 0 0 0 0 0 | ||
564 | 0 0 0 1 1 1 90 87 86 17 18 18 0 0 0 0 0 0 | ||
565 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
566 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
567 | 0 0 0 0 0 0 | ||
568 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
569 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
570 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
571 | 0 0 0 7 7 7 78 81 81 12 12 12 23 31 30 52 58 58 | ||
572 | 0 0 0 209 210 210 253 253 253 255 255 255 255 255 255 255 255 255 | ||
573 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 | ||
574 | 251 251 252 150 151 151 103 103 103 129 130 130 196 196 197 250 250 251 | ||
575 | 252 252 253 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 | ||
576 | 255 255 255 240 240 240 193 193 194 196 196 197 229 229 230 0 0 0 | ||
577 | 0 0 0 4 10 10 30 40 40 0 3 3 0 0 0 0 0 0 | ||
578 | 0 0 0 0 0 0 47 47 47 53 54 54 3 3 3 0 0 0 | ||
579 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
580 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
581 | 0 0 0 0 0 0 | ||
582 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
583 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
584 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
585 | 0 0 0 23 23 23 81 81 82 0 0 0 52 58 58 36 40 40 | ||
586 | 42 42 43 250 250 251 255 255 255 255 255 255 255 255 255 255 255 255 | ||
587 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 | ||
588 | 227 227 227 7 7 7 7 7 7 7 7 7 7 7 7 44 44 45 | ||
589 | 156 155 156 249 250 251 253 253 253 254 254 254 255 255 255 255 255 255 | ||
590 | 255 255 255 255 255 255 247 247 246 222 221 221 239 239 240 0 0 0 | ||
591 | 30 40 40 44 50 50 23 31 30 29 33 34 0 0 0 0 0 0 | ||
592 | 0 0 0 0 0 0 0 0 0 90 87 86 16 16 16 0 0 0 | ||
593 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
594 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
595 | 0 0 0 0 0 0 | ||
596 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
597 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
598 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
599 | 2 2 2 50 51 51 42 42 43 29 33 34 52 58 58 0 0 0 | ||
600 | 232 232 233 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
601 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 | ||
602 | 250 251 252 44 44 44 7 7 7 7 7 7 7 7 7 7 7 7 | ||
603 | 7 7 7 56 56 56 209 210 210 252 252 253 254 254 254 255 255 255 | ||
604 | 255 255 255 255 255 255 255 255 255 254 253 253 249 250 251 146 146 147 | ||
605 | 36 40 40 44 50 50 36 40 40 67 70 70 61 65 66 0 0 0 | ||
606 | 0 0 0 0 0 0 0 0 0 55 55 55 44 44 45 1 1 1 | ||
607 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
608 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
609 | 0 0 0 0 0 0 | ||
610 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
611 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
612 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
613 | 10 10 10 81 81 82 1 1 1 52 58 58 44 50 50 52 53 53 | ||
614 | 251 251 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
615 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 | ||
616 | 253 253 253 187 187 188 8 8 8 7 7 7 7 7 7 7 7 7 | ||
617 | 7 7 7 7 7 7 19 19 19 178 178 179 252 252 253 254 254 254 | ||
618 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 237 237 238 | ||
619 | 10 16 16 30 40 40 0 3 3 23 31 30 84 89 89 0 0 0 | ||
620 | 0 0 0 0 0 0 0 0 0 3 3 3 81 81 82 9 9 9 | ||
621 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
622 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
623 | 0 0 0 0 0 0 | ||
624 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
625 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
626 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
627 | 29 29 30 72 71 71 10 16 16 52 58 58 0 0 0 222 221 221 | ||
628 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
629 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
630 | 254 254 254 251 251 252 95 97 97 7 7 7 7 7 7 7 7 7 | ||
631 | 7 7 7 7 7 7 7 7 7 10 10 10 161 161 162 251 252 252 | ||
632 | 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 248 248 249 | ||
633 | 0 0 0 0 0 0 0 0 0 0 0 0 84 89 89 0 3 3 | ||
634 | 0 0 0 0 0 0 0 0 0 0 0 0 74 74 74 26 27 27 | ||
635 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
636 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
637 | 0 0 0 0 0 0 | ||
638 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
639 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
640 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 | ||
641 | 65 64 64 20 20 20 20 25 25 30 40 40 0 0 0 247 247 246 | ||
642 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
643 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
644 | 255 255 255 253 253 254 222 221 221 9 9 9 7 7 7 7 7 7 | ||
645 | 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 149 149 150 | ||
646 | 252 252 253 254 254 254 255 255 255 255 255 255 255 255 255 252 252 252 | ||
647 | 0 0 0 0 0 0 0 0 0 0 0 0 73 79 79 12 15 14 | ||
648 | 0 0 0 0 0 0 0 0 0 0 0 0 36 36 36 58 58 58 | ||
649 | 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
650 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
651 | 0 0 0 0 0 0 | ||
652 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
653 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
654 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 20 | ||
655 | 74 74 74 0 0 0 4 10 10 4 10 10 36 36 36 252 252 252 | ||
656 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
657 | 255 255 255 255 255 255 255 255 255 227 227 227 253 253 253 255 255 255 | ||
658 | 255 255 255 254 254 254 250 251 252 65 64 64 7 7 7 7 7 7 | ||
659 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 | ||
660 | 146 146 147 251 252 252 254 254 254 255 255 255 255 255 255 253 254 254 | ||
661 | 0 0 0 0 0 0 0 0 0 0 0 0 52 58 58 10 16 16 | ||
662 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 82 81 | ||
663 | 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
664 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
665 | 0 0 0 0 0 0 | ||
666 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
667 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
668 | 0 0 0 0 0 0 0 0 0 0 0 0 4 6 6 65 64 64 | ||
669 | 25 25 25 0 3 3 30 40 40 0 0 0 187 187 188 254 254 254 | ||
670 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
671 | 255 255 255 255 255 255 255 255 255 193 193 194 253 252 252 255 255 255 | ||
672 | 255 255 255 255 255 255 252 253 253 129 130 130 7 7 7 7 7 7 | ||
673 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
674 | 8 8 8 149 149 150 252 252 253 254 254 254 255 255 255 254 254 254 | ||
675 | 52 53 53 0 0 0 0 0 0 0 0 0 20 25 25 2 5 4 | ||
676 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 81 81 82 | ||
677 | 20 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
678 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
679 | 0 0 0 0 0 0 | ||
680 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
681 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
682 | 0 0 0 0 0 0 0 0 0 0 0 0 26 26 27 81 81 82 | ||
683 | 0 0 0 18 21 21 73 79 79 0 0 0 237 237 238 255 255 255 | ||
684 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
685 | 255 255 255 255 255 255 255 255 255 182 183 184 255 255 255 255 255 255 | ||
686 | 255 255 255 255 255 255 253 253 253 176 177 177 7 7 7 7 7 7 | ||
687 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
688 | 7 7 7 8 8 8 153 154 155 251 252 252 254 254 254 255 255 255 | ||
689 | 150 151 151 0 0 0 0 0 0 0 0 0 20 25 25 0 0 0 | ||
690 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 65 64 64 | ||
691 | 33 33 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
692 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
693 | 0 0 0 0 0 0 | ||
694 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
695 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
696 | 0 0 0 0 0 0 0 0 0 6 6 6 67 70 70 20 20 20 | ||
697 | 0 0 0 23 31 30 82 85 86 0 0 0 247 247 246 255 255 255 | ||
698 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
699 | 255 255 255 255 255 255 255 255 255 182 183 184 255 255 255 255 255 255 | ||
700 | 255 255 255 255 255 255 253 254 254 214 214 215 7 7 7 7 7 7 | ||
701 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
702 | 7 7 7 7 7 7 8 8 8 156 155 156 252 252 253 254 254 254 | ||
703 | 167 168 167 0 0 0 0 0 0 0 0 0 67 70 70 0 0 0 | ||
704 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 47 47 | ||
705 | 44 44 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
706 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
707 | 0 0 0 0 0 0 | ||
708 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
709 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
710 | 0 0 0 0 0 0 0 0 0 21 21 22 75 75 76 0 0 0 | ||
711 | 0 0 0 29 33 34 84 89 89 0 0 0 248 248 249 255 255 255 | ||
712 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
713 | 255 255 255 255 255 255 248 248 249 181 181 181 255 255 255 255 255 255 | ||
714 | 255 255 255 255 255 255 254 254 254 240 240 240 7 7 7 7 7 7 | ||
715 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
716 | 7 7 7 7 7 7 7 7 7 8 8 8 161 161 162 251 252 252 | ||
717 | 185 185 184 4 4 4 0 0 0 10 11 11 100 103 103 0 0 0 | ||
718 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 36 36 | ||
719 | 55 55 55 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 | ||
720 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
721 | 0 0 0 0 0 0 | ||
722 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
723 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
724 | 0 0 0 0 0 0 0 0 0 33 33 34 50 51 51 0 0 0 | ||
725 | 0 0 0 9 11 11 82 85 86 10 16 16 248 248 249 255 255 255 | ||
726 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
727 | 255 255 255 255 255 255 245 244 245 179 180 181 255 255 255 255 255 255 | ||
728 | 255 255 255 255 255 255 254 254 254 251 252 252 20 20 20 7 7 7 | ||
729 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
730 | 7 7 7 7 7 7 7 7 7 7 7 7 10 10 10 161 161 162 | ||
731 | 205 205 205 17 18 18 0 0 0 95 97 97 78 81 81 0 0 0 | ||
732 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 36 36 | ||
733 | 53 54 54 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 | ||
734 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
735 | 0 0 0 0 0 0 | ||
736 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
737 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
738 | 0 0 0 0 0 0 0 0 0 31 31 31 58 58 58 0 0 0 | ||
739 | 0 0 0 0 0 0 67 70 70 78 81 81 248 248 249 255 255 255 | ||
740 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
741 | 255 255 255 255 255 255 234 234 234 179 180 181 255 255 255 255 255 255 | ||
742 | 255 255 255 255 255 255 254 254 254 251 252 252 23 23 23 7 7 7 | ||
743 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
744 | 10 11 11 84 84 84 161 161 162 209 210 210 229 229 230 237 237 238 | ||
745 | 202 202 203 26 26 27 9 11 11 44 50 50 0 0 0 4 6 6 | ||
746 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 53 53 | ||
747 | 39 39 39 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
748 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
749 | 0 0 0 0 0 0 | ||
750 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
751 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
752 | 0 0 0 0 0 0 0 0 0 23 23 23 78 81 81 213 157 40 | ||
753 | 243 206 27 243 206 27 54 42 32 73 79 79 222 221 221 255 255 255 | ||
754 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
755 | 255 255 255 255 255 255 238 238 236 178 178 179 255 255 255 255 255 255 | ||
756 | 255 255 255 255 255 255 254 254 254 251 252 253 36 36 36 7 7 7 | ||
757 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 84 84 84 | ||
758 | 222 221 221 251 252 252 252 253 253 253 253 253 253 254 254 252 252 253 | ||
759 | 146 146 147 140 142 143 156 155 156 110 114 114 26 27 27 82 85 86 | ||
760 | 84 89 89 95 97 97 36 40 40 0 0 0 0 0 0 74 74 74 | ||
761 | 23 23 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
762 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
763 | 0 0 0 0 0 0 | ||
764 | 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 14 14 14 | ||
765 | 24 24 24 26 26 27 26 26 27 26 26 27 25 25 26 21 21 22 | ||
766 | 7 7 7 0 0 0 1 1 1 34 34 35 238 192 33 244 210 23 | ||
767 | 244 212 23 244 212 23 244 210 23 88 79 47 200 200 197 254 254 254 | ||
768 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
769 | 255 255 255 255 255 255 244 245 245 179 180 181 255 255 255 255 255 255 | ||
770 | 255 255 255 255 255 255 254 254 254 252 252 253 36 36 36 7 7 7 | ||
771 | 7 7 7 7 7 7 7 7 7 8 8 8 149 149 150 251 251 252 | ||
772 | 252 252 253 253 253 253 253 253 253 250 248 249 239 223 156 239 223 156 | ||
773 | 120 121 122 182 183 184 176 177 177 120 121 122 33 33 34 3 3 3 | ||
774 | 0 0 0 67 70 70 146 146 147 20 25 25 1 1 1 82 82 81 | ||
775 | 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
776 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
777 | 0 0 0 0 0 0 | ||
778 | 0 0 0 0 0 0 0 0 0 0 0 0 19 19 19 89 90 91 | ||
779 | 146 146 147 150 151 151 150 151 151 150 151 151 150 151 151 129 130 130 | ||
780 | 58 58 58 6 6 6 14 14 14 201 147 55 245 211 23 245 213 29 | ||
781 | 245 214 35 245 215 41 245 213 29 244 210 23 142 83 36 232 232 233 | ||
782 | 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
783 | 255 255 255 255 255 255 255 255 255 185 185 184 255 255 255 255 255 255 | ||
784 | 255 255 255 255 255 255 254 254 254 251 252 252 50 51 51 7 7 7 | ||
785 | 7 7 7 7 7 7 7 7 7 146 146 147 251 252 252 252 253 253 | ||
786 | 251 252 253 239 239 240 171 168 154 129 130 130 137 136 134 175 173 165 | ||
787 | 221 218 200 65 64 64 22 22 22 186 186 187 114 115 115 26 26 27 | ||
788 | 2 2 2 0 0 0 61 65 66 31 33 27 238 192 33 108 96 91 | ||
789 | 9 9 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
790 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
791 | 0 0 0 0 0 0 | ||
792 | 0 0 0 0 0 0 0 0 0 2 2 2 52 53 53 178 178 179 | ||
793 | 21 21 22 7 7 7 7 7 7 7 7 7 7 7 7 118 118 118 | ||
794 | 137 136 134 36 36 36 65 64 64 243 206 27 244 212 23 245 215 41 | ||
795 | 245 215 41 245 215 41 245 215 41 244 209 25 244 209 25 1 1 1 | ||
796 | 219 219 219 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 | ||
797 | 255 255 255 255 255 255 255 255 255 214 214 215 255 255 255 255 255 255 | ||
798 | 255 255 255 255 255 255 254 254 254 252 252 253 50 51 51 7 7 7 | ||
799 | 7 7 7 7 7 7 84 84 84 250 251 252 252 253 253 251 251 252 | ||
800 | 167 168 167 22 22 22 7 7 7 7 7 7 7 7 7 7 7 7 | ||
801 | 7 7 7 7 7 7 7 7 7 34 34 35 187 187 188 103 103 103 | ||
802 | 29 29 30 3 3 3 7 9 9 238 204 29 245 215 41 245 214 35 | ||
803 | 28 28 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
804 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
805 | 0 0 0 0 0 0 | ||
806 | 0 0 0 0 0 0 0 0 0 7 7 7 90 87 86 178 178 179 | ||
807 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 16 16 16 | ||
808 | 193 193 194 133 133 133 187 166 103 245 218 76 245 218 76 245 216 51 | ||
809 | 245 216 51 245 218 76 246 224 96 245 218 76 245 218 76 245 218 76 | ||
810 | 25 25 25 186 186 187 252 252 252 254 254 254 254 254 254 253 254 254 | ||
811 | 254 254 254 254 254 254 254 254 254 246 247 248 254 254 254 253 254 254 | ||
812 | 254 254 254 254 254 254 253 254 254 251 252 252 36 36 36 7 7 7 | ||
813 | 7 7 7 20 20 20 229 229 230 253 253 253 252 253 253 178 178 179 | ||
814 | 10 10 10 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
815 | 7 7 7 7 7 7 7 7 7 7 7 7 42 42 43 196 196 197 | ||
816 | 118 118 118 33 33 34 238 204 29 245 215 41 245 215 41 245 215 41 | ||
817 | 49 50 50 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 | ||
818 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
819 | 0 0 0 0 0 0 | ||
820 | 0 0 0 0 0 0 0 0 0 17 18 18 120 121 122 137 136 134 | ||
821 | 7 7 7 7 7 7 34 34 35 20 20 20 7 7 7 7 7 7 | ||
822 | 202 202 203 209 206 202 193 187 162 193 187 162 248 234 156 245 218 76 | ||
823 | 245 218 76 248 234 156 193 187 162 193 187 162 193 187 162 214 196 166 | ||
824 | 240 219 129 95 97 97 196 196 197 186 186 187 187 187 188 196 196 197 | ||
825 | 252 252 253 251 252 253 212 211 212 187 187 188 196 196 197 251 252 252 | ||
826 | 218 217 217 187 187 188 191 190 190 250 251 252 24 24 24 7 7 7 | ||
827 | 7 7 7 110 114 114 252 252 253 253 254 254 250 251 252 89 90 91 | ||
828 | 89 90 91 129 130 130 127 127 126 44 44 44 7 7 7 7 7 7 | ||
829 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 49 50 50 | ||
830 | 202 202 203 214 196 166 245 216 51 245 214 38 245 214 35 245 214 38 | ||
831 | 58 58 58 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 | ||
832 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
833 | 0 0 0 0 0 0 | ||
834 | 0 0 0 0 0 0 0 0 0 31 31 31 156 155 156 82 82 81 | ||
835 | 7 7 7 10 10 10 237 237 238 66 66 66 7 7 7 25 25 25 | ||
836 | 247 248 249 81 81 82 7 7 7 31 31 31 247 237 174 245 218 76 | ||
837 | 246 226 108 200 200 197 7 7 7 7 7 7 7 7 7 137 136 134 | ||
838 | 247 237 174 193 193 194 72 71 71 7 7 7 7 7 7 8 8 8 | ||
839 | 196 196 197 250 251 252 67 70 70 7 7 7 84 84 84 244 245 245 | ||
840 | 47 47 47 7 7 7 118 118 118 249 250 251 12 12 12 7 7 7 | ||
841 | 9 9 9 218 217 217 253 253 253 254 254 254 252 253 253 251 251 252 | ||
842 | 249 250 251 237 237 238 95 97 97 9 9 9 15 15 15 95 97 97 | ||
843 | 47 47 47 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
844 | 66 66 66 240 230 197 246 226 108 245 214 38 245 211 23 244 212 23 | ||
845 | 65 64 64 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 | ||
846 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
847 | 0 0 0 0 0 0 | ||
848 | 0 0 0 0 0 0 2 2 2 52 53 53 185 185 184 25 25 25 | ||
849 | 7 7 7 60 60 60 240 240 240 14 14 14 7 7 7 84 84 84 | ||
850 | 247 248 249 23 23 23 7 7 7 94 91 88 248 234 156 245 218 76 | ||
851 | 248 234 156 127 127 126 7 7 7 7 7 7 7 7 7 167 168 167 | ||
852 | 251 248 240 65 64 64 7 7 7 7 7 7 7 7 7 7 7 7 | ||
853 | 84 84 84 243 243 243 15 15 15 7 7 7 140 142 143 146 146 147 | ||
854 | 7 7 7 33 33 34 237 237 238 243 243 243 21 21 22 120 121 122 | ||
855 | 218 217 217 252 252 253 254 254 254 253 253 254 252 253 253 251 252 252 | ||
856 | 247 248 249 72 71 71 7 7 7 58 58 58 222 221 221 248 248 249 | ||
857 | 75 75 76 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
858 | 7 7 7 82 82 81 246 239 193 246 226 108 245 216 51 245 214 38 | ||
859 | 238 192 33 21 21 22 1 1 1 0 0 0 0 0 0 0 0 0 | ||
860 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
861 | 0 0 0 0 0 0 | ||
862 | 0 0 0 0 0 0 8 8 8 90 87 86 182 183 184 7 7 7 | ||
863 | 7 7 7 120 121 122 187 187 188 7 7 7 7 7 7 146 146 147 | ||
864 | 205 205 205 7 7 7 7 7 7 153 153 148 240 219 129 246 224 96 | ||
865 | 246 239 193 39 39 39 60 60 60 108 110 110 7 7 7 202 202 203 | ||
866 | 227 227 227 7 7 7 7 7 7 205 205 205 89 90 91 7 7 7 | ||
867 | 120 121 122 193 193 194 7 7 7 7 7 7 186 186 187 25 25 25 | ||
868 | 7 7 7 167 168 167 251 251 252 243 243 243 214 214 215 250 251 252 | ||
869 | 251 252 253 254 254 254 253 253 253 219 219 219 140 140 139 140 140 139 | ||
870 | 118 118 118 7 7 7 52 53 53 237 237 238 247 247 246 176 177 177 | ||
871 | 8 8 8 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
872 | 7 7 7 7 7 7 95 97 97 246 239 193 246 226 108 245 216 51 | ||
873 | 245 214 38 201 147 55 31 31 31 103 103 103 103 103 103 72 71 71 | ||
874 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
875 | 0 0 0 0 0 0 | ||
876 | 0 0 0 0 0 0 17 18 18 127 127 126 140 140 139 7 7 7 | ||
877 | 7 7 7 17 18 18 17 18 18 7 7 7 95 97 97 244 245 245 | ||
878 | 146 146 147 7 7 7 7 7 7 200 200 197 246 226 108 240 219 129 | ||
879 | 194 194 184 7 7 7 140 140 139 89 90 91 7 7 7 232 232 233 | ||
880 | 165 165 165 7 7 7 31 31 31 249 250 251 39 39 39 7 7 7 | ||
881 | 176 177 177 133 133 133 7 7 7 22 22 22 108 110 110 7 7 7 | ||
882 | 72 71 71 251 252 252 252 253 253 250 251 252 247 248 249 205 205 205 | ||
883 | 251 252 253 254 254 254 252 252 253 84 84 84 7 7 7 7 7 7 | ||
884 | 7 7 7 7 7 7 140 142 143 247 248 249 140 140 139 14 14 14 | ||
885 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 16 16 16 | ||
886 | 14 14 14 7 7 7 7 7 7 114 115 115 246 239 193 246 224 96 | ||
887 | 245 216 51 245 216 51 243 235 220 176 177 177 185 185 184 229 229 230 | ||
888 | 47 47 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
889 | 0 0 0 0 0 0 | ||
890 | 0 0 0 0 0 0 31 31 31 156 155 156 90 87 86 7 7 7 | ||
891 | 7 7 7 7 7 7 7 7 7 31 31 31 243 243 241 247 247 246 | ||
892 | 84 84 84 7 7 7 26 27 27 246 239 193 246 226 108 248 234 156 | ||
893 | 108 110 110 7 7 7 212 211 212 44 44 44 22 22 22 249 250 251 | ||
894 | 108 107 107 7 7 7 89 90 91 238 238 236 114 115 115 118 118 118 | ||
895 | 231 231 231 75 75 76 7 7 7 34 34 35 10 11 11 12 12 12 | ||
896 | 214 214 215 253 253 253 253 253 253 200 200 197 31 31 31 103 103 103 | ||
897 | 252 252 253 252 253 253 218 217 217 9 9 9 7 7 7 7 7 7 | ||
898 | 7 7 7 7 7 7 25 25 25 39 39 39 7 7 7 7 7 7 | ||
899 | 7 7 7 7 7 7 7 7 7 7 7 7 103 103 103 234 234 234 | ||
900 | 181 181 181 7 7 7 7 7 7 7 7 7 133 133 133 247 237 174 | ||
901 | 246 224 96 246 226 108 185 185 184 177 177 174 153 154 155 181 181 181 | ||
902 | 140 140 139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
903 | 0 0 0 0 0 0 | ||
904 | 0 0 0 1 1 1 49 50 50 186 186 187 28 28 28 7 7 7 | ||
905 | 12 12 12 22 22 22 7 7 7 7 7 7 108 107 107 247 247 246 | ||
906 | 25 25 25 7 7 7 90 87 86 247 237 174 246 226 108 246 239 193 | ||
907 | 28 28 28 44 44 44 237 237 238 9 9 9 53 54 54 249 250 251 | ||
908 | 49 50 50 7 7 7 153 153 148 249 241 199 214 196 166 185 185 184 | ||
909 | 229 229 230 19 19 19 7 7 7 7 7 7 7 7 7 103 103 103 | ||
910 | 251 252 253 254 254 254 253 253 253 150 151 151 7 7 7 187 187 188 | ||
911 | 252 252 253 251 251 252 103 103 103 7 7 7 7 7 7 7 7 7 | ||
912 | 7 7 7 23 23 23 17 18 18 7 7 7 7 7 7 7 7 7 | ||
913 | 7 7 7 7 7 7 12 12 12 153 153 148 246 239 193 249 241 199 | ||
914 | 161 161 162 9 9 9 84 84 84 108 110 110 25 25 25 153 153 148 | ||
915 | 247 237 174 246 224 96 218 217 217 165 165 165 182 183 184 193 193 194 | ||
916 | 114 115 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
917 | 0 0 0 0 0 0 | ||
918 | 0 0 0 4 4 4 74 74 74 181 181 181 7 7 7 7 7 7 | ||
919 | 110 114 114 200 200 197 7 7 7 7 7 7 60 60 60 209 210 210 | ||
920 | 7 7 7 7 7 7 146 146 147 248 234 156 248 234 156 177 177 174 | ||
921 | 7 7 7 118 118 118 193 193 194 7 7 7 84 84 84 232 232 233 | ||
922 | 8 8 8 7 7 7 209 210 210 221 218 200 193 187 162 219 219 219 | ||
923 | 200 200 197 7 7 7 7 7 7 7 7 7 7 7 7 95 97 97 | ||
924 | 251 252 252 254 254 254 252 253 253 118 118 118 29 29 30 247 248 249 | ||
925 | 252 252 253 227 227 227 16 16 16 7 7 7 7 7 7 7 7 7 | ||
926 | 100 103 103 218 217 217 219 218 214 7 7 7 7 7 7 7 7 7 | ||
927 | 7 7 7 21 21 22 185 185 184 246 239 193 248 234 156 240 230 197 | ||
928 | 60 60 60 194 194 184 246 239 193 249 241 199 137 136 134 10 10 10 | ||
929 | 171 168 154 248 234 156 248 234 156 226 226 219 209 210 210 249 241 199 | ||
930 | 28 28 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
931 | 0 0 0 0 0 0 | ||
932 | 0 0 0 13 13 13 108 110 110 146 146 147 7 7 7 7 7 7 | ||
933 | 167 168 167 140 140 139 7 7 7 7 7 7 120 121 122 146 146 147 | ||
934 | 7 7 7 7 7 7 194 194 184 240 219 129 247 237 174 95 97 97 | ||
935 | 7 7 7 95 97 97 90 87 86 7 7 7 118 118 118 176 177 177 | ||
936 | 7 7 7 28 28 28 248 248 249 44 44 45 7 7 7 167 168 167 | ||
937 | 140 140 139 7 7 7 36 36 36 74 74 74 7 7 7 65 64 64 | ||
938 | 251 252 253 254 254 254 251 252 252 81 81 82 108 110 110 251 252 252 | ||
939 | 251 251 252 127 127 126 7 7 7 7 7 7 8 8 8 140 140 139 | ||
940 | 181 181 181 140 140 139 221 218 200 7 7 7 7 7 7 7 7 7 | ||
941 | 34 34 35 209 210 210 231 231 231 246 239 193 247 237 174 194 194 184 | ||
942 | 227 227 227 249 241 199 240 219 129 248 234 156 153 153 148 7 7 7 | ||
943 | 13 13 13 185 185 184 248 234 156 245 218 76 245 216 51 245 214 38 | ||
944 | 31 31 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
945 | 0 0 0 0 0 0 | ||
946 | 0 0 0 31 31 31 153 154 155 89 90 91 7 7 7 8 8 8 | ||
947 | 232 232 233 82 82 81 7 7 7 7 7 7 179 180 181 89 90 91 | ||
948 | 7 7 7 24 24 24 243 235 220 248 234 156 240 230 197 20 20 20 | ||
949 | 7 7 7 7 7 7 7 7 7 7 7 7 149 149 150 118 118 118 | ||
950 | 7 7 7 90 87 86 229 229 230 7 7 7 7 7 7 229 229 230 | ||
951 | 82 82 81 7 7 7 95 97 97 100 103 103 7 7 7 34 34 35 | ||
952 | 251 252 252 253 253 254 251 251 252 47 47 47 193 193 194 251 252 252 | ||
953 | 239 239 240 23 23 23 7 7 7 13 13 13 165 165 165 234 234 234 | ||
954 | 149 149 150 146 114 101 200 200 197 7 7 7 7 7 7 52 53 53 | ||
955 | 227 227 227 167 168 167 16 16 16 214 196 166 248 234 156 243 235 220 | ||
956 | 219 219 219 156 155 156 247 237 174 246 239 193 75 75 76 7 7 7 | ||
957 | 60 60 60 227 227 227 243 235 220 240 219 129 245 218 76 245 213 29 | ||
958 | 16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
959 | 0 0 0 0 0 0 | ||
960 | 1 1 1 49 50 50 185 185 184 33 33 34 7 7 7 10 11 11 | ||
961 | 56 56 56 16 16 16 7 7 7 10 10 10 237 237 238 26 27 27 | ||
962 | 7 7 7 55 55 55 185 185 184 221 218 200 167 168 167 7 7 7 | ||
963 | 20 20 20 39 39 39 10 11 11 7 7 7 181 181 181 58 58 58 | ||
964 | 7 7 7 103 103 103 133 133 133 7 7 7 44 44 44 247 248 249 | ||
965 | 24 24 24 7 7 7 156 155 156 129 130 130 7 7 7 9 9 9 | ||
966 | 244 245 245 252 253 253 237 237 238 34 34 35 248 248 249 251 251 252 | ||
967 | 161 161 162 7 7 7 24 24 24 187 187 188 212 211 212 67 70 70 | ||
968 | 187 187 188 173 170 143 209 206 202 10 10 10 95 97 97 237 237 238 | ||
969 | 129 130 130 8 8 8 89 90 91 246 239 193 247 237 174 177 177 174 | ||
970 | 17 18 18 137 136 134 249 241 199 219 218 214 10 10 10 95 97 97 | ||
971 | 243 243 243 150 151 151 31 31 31 221 218 200 240 219 129 53 54 54 | ||
972 | 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
973 | 0 0 0 0 0 0 | ||
974 | 4 4 4 72 71 71 182 183 184 7 7 7 7 7 7 7 7 7 | ||
975 | 7 7 7 7 7 7 12 12 12 161 161 162 209 210 210 7 7 7 | ||
976 | 7 7 7 7 7 7 7 7 7 187 187 188 82 82 81 7 7 7 | ||
977 | 146 146 147 247 248 249 17 18 18 7 7 7 212 211 212 47 47 47 | ||
978 | 7 7 7 7 7 7 7 7 7 8 8 8 146 146 147 205 205 205 | ||
979 | 7 7 7 7 7 7 214 214 215 156 155 156 7 7 7 7 7 7 | ||
980 | 218 217 217 251 252 252 186 186 187 110 114 114 249 250 251 248 248 249 | ||
981 | 75 75 76 34 34 35 205 205 205 129 130 130 16 16 16 7 7 7 | ||
982 | 156 155 156 214 196 166 240 230 197 243 243 241 227 227 227 74 74 74 | ||
983 | 7 7 7 29 29 30 226 226 219 249 241 199 175 173 165 14 14 14 | ||
984 | 9 9 9 221 218 200 246 239 193 153 153 148 146 146 147 246 247 248 | ||
985 | 110 114 114 7 7 7 7 7 7 42 42 43 193 193 194 95 97 97 | ||
986 | 19 19 19 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 | ||
987 | 0 0 0 0 0 0 | ||
988 | 6 6 6 84 84 84 140 142 143 7 7 7 7 7 7 7 7 7 | ||
989 | 7 7 7 20 20 20 177 177 174 249 241 199 149 149 150 7 7 7 | ||
990 | 7 7 7 7 7 7 10 11 11 226 226 219 13 13 13 8 8 8 | ||
991 | 219 218 214 219 218 214 7 7 7 8 8 8 238 238 236 200 200 197 | ||
992 | 13 13 13 7 7 7 13 13 13 161 161 162 243 235 220 146 146 147 | ||
993 | 7 7 7 29 29 30 232 232 233 176 177 177 7 7 7 7 7 7 | ||
994 | 182 183 184 237 237 238 129 130 130 167 168 167 176 177 177 202 202 203 | ||
995 | 10 11 11 95 97 97 44 44 45 7 7 7 7 7 7 7 7 7 | ||
996 | 75 75 76 226 226 219 243 235 220 156 155 156 24 24 24 7 7 7 | ||
997 | 7 7 7 176 177 177 247 247 246 200 200 197 17 18 18 7 7 7 | ||
998 | 49 50 50 246 239 193 248 234 156 251 248 240 239 239 240 84 84 84 | ||
999 | 7 7 7 7 7 7 7 7 7 7 7 7 60 60 60 187 187 188 | ||
1000 | 84 84 84 14 14 14 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1001 | 0 0 0 0 0 0 | ||
1002 | 4 4 4 53 54 54 137 136 134 156 155 156 161 161 162 161 161 162 | ||
1003 | 167 168 167 239 223 156 240 219 129 246 226 108 239 223 156 239 223 156 | ||
1004 | 239 223 156 239 223 156 214 196 166 239 223 156 193 187 162 193 187 162 | ||
1005 | 248 234 156 239 223 156 193 187 162 193 187 162 248 234 156 248 234 156 | ||
1006 | 214 196 166 193 187 162 214 196 166 248 234 156 240 219 129 214 196 166 | ||
1007 | 193 187 162 193 187 162 171 168 154 146 146 147 137 136 134 137 136 134 | ||
1008 | 161 161 162 209 210 210 65 64 64 202 202 203 179 180 181 140 140 139 | ||
1009 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1010 | 7 7 7 60 60 60 39 39 39 7 7 7 7 7 7 7 7 7 | ||
1011 | 66 66 66 249 250 251 202 202 203 16 16 16 7 7 7 7 7 7 | ||
1012 | 23 23 23 243 235 220 246 239 193 226 226 219 52 53 53 7 7 7 | ||
1013 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 75 75 76 | ||
1014 | 176 177 177 66 66 66 9 9 9 0 0 0 0 0 0 0 0 0 | ||
1015 | 0 0 0 0 0 0 | ||
1016 | 0 0 0 10 10 10 28 28 29 34 34 35 36 36 36 36 36 36 | ||
1017 | 44 44 45 146 114 101 241 207 50 241 207 50 241 207 50 241 211 63 | ||
1018 | 241 211 63 241 211 63 241 211 63 241 211 63 241 211 63 245 216 51 | ||
1019 | 245 216 51 245 216 51 241 211 63 241 211 63 245 216 51 241 211 63 | ||
1020 | 245 218 76 245 218 76 245 216 51 245 215 41 245 214 38 241 207 50 | ||
1021 | 241 211 63 201 147 55 88 79 47 29 29 30 34 34 35 42 42 43 | ||
1022 | 103 103 103 191 190 190 75 75 76 196 196 197 200 200 197 65 64 64 | ||
1023 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1024 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1025 | 90 87 86 146 146 147 19 19 19 7 7 7 7 7 7 7 7 7 | ||
1026 | 7 7 7 90 87 86 140 140 139 31 31 31 7 7 7 7 7 7 | ||
1027 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1028 | 103 103 103 161 161 162 53 54 54 7 7 7 0 0 0 0 0 0 | ||
1029 | 0 0 0 0 0 0 | ||
1030 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1031 | 0 0 0 12 12 12 50 51 51 146 114 101 180 121 62 199 129 48 | ||
1032 | 201 147 55 213 157 40 213 157 40 230 165 41 226 179 40 226 179 40 | ||
1033 | 238 192 33 241 205 27 244 209 25 244 210 23 244 212 23 245 211 23 | ||
1034 | 245 211 23 245 211 23 245 211 23 244 209 25 238 204 29 226 179 40 | ||
1035 | 213 157 40 199 129 48 54 42 32 0 0 0 4 6 6 44 44 45 | ||
1036 | 150 151 151 129 130 130 137 136 134 205 205 205 202 202 203 8 8 8 | ||
1037 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1038 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1039 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1040 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1041 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1042 | 7 7 7 129 130 130 146 146 147 47 47 47 4 4 4 0 0 0 | ||
1043 | 0 0 0 0 0 0 | ||
1044 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1045 | 0 0 0 0 0 0 2 2 2 12 12 12 28 28 29 49 50 50 | ||
1046 | 74 74 74 108 96 91 180 121 62 180 121 62 199 129 48 201 147 55 | ||
1047 | 213 157 40 230 165 41 226 179 40 238 192 33 241 205 27 241 205 27 | ||
1048 | 243 206 27 243 206 27 241 205 27 238 204 29 226 179 40 213 157 40 | ||
1049 | 199 129 48 199 129 48 21 19 17 65 64 64 103 103 103 167 168 167 | ||
1050 | 202 202 203 24 24 24 193 193 194 229 229 230 140 140 139 7 7 7 | ||
1051 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1052 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1053 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1054 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1055 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1056 | 7 7 7 8 8 8 156 155 156 133 133 133 36 36 36 3 3 3 | ||
1057 | 0 0 0 0 0 0 | ||
1058 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1059 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 | ||
1060 | 4 4 4 10 11 11 21 21 22 39 39 39 60 60 60 108 96 91 | ||
1061 | 180 121 62 199 129 48 199 129 48 213 157 40 230 165 41 226 179 40 | ||
1062 | 226 179 40 226 179 40 226 179 40 226 179 40 213 157 40 199 129 48 | ||
1063 | 180 121 62 99 91 79 72 71 71 56 56 56 129 130 130 167 168 167 | ||
1064 | 21 21 22 17 18 18 231 231 231 229 229 230 52 53 53 7 7 7 | ||
1065 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1066 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1067 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1068 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1069 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1070 | 7 7 7 7 7 7 13 13 13 176 177 177 120 121 122 33 33 34 | ||
1071 | 2 2 2 0 0 0 | ||
1072 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1073 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1074 | 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 8 8 8 | ||
1075 | 21 21 22 47 47 47 99 91 79 180 121 62 199 129 48 199 129 48 | ||
1076 | 201 147 55 213 157 40 213 157 40 201 147 55 199 129 48 180 121 62 | ||
1077 | 99 91 79 26 26 27 9 9 9 60 60 60 186 186 187 31 31 31 | ||
1078 | 7 7 7 60 60 60 243 243 243 209 210 210 7 7 7 7 7 7 | ||
1079 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1080 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1081 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1082 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1083 | 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 | ||
1084 | 7 7 7 7 7 7 7 7 7 26 27 27 193 193 194 108 110 110 | ||
1085 | 22 22 22 0 0 0 | ||
1086 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1087 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1088 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1089 | 0 0 0 1 1 1 8 8 8 24 24 24 58 58 58 108 96 91 | ||
1090 | 180 121 62 180 121 62 180 121 62 180 121 62 180 121 62 72 71 71 | ||
1091 | 15 15 15 0 0 0 4 6 6 75 75 76 156 155 156 24 24 24 | ||
1092 | 24 24 24 108 107 107 232 232 233 137 136 134 24 24 24 24 24 24 | ||
1093 | 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 | ||
1094 | 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 | ||
1095 | 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 | ||
1096 | 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 | ||
1097 | 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 24 | ||
1098 | 24 24 24 24 24 24 24 24 24 24 24 24 58 58 58 176 177 177 | ||
1099 | 60 60 60 3 3 3 | ||
1100 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1101 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1102 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1103 | 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 12 12 12 | ||
1104 | 26 27 27 44 44 44 55 55 55 50 51 51 29 29 30 8 8 8 | ||
1105 | 0 0 0 0 0 0 3 3 3 47 47 47 127 127 126 150 151 151 | ||
1106 | 150 151 151 140 142 143 129 130 130 140 142 143 150 151 151 150 151 151 | ||
1107 | 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 | ||
1108 | 150 151 151 150 151 151 153 154 155 161 161 162 165 165 165 167 168 167 | ||
1109 | 177 177 174 167 168 167 161 161 162 156 155 156 150 151 151 150 151 151 | ||
1110 | 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 | ||
1111 | 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 150 151 151 | ||
1112 | 150 151 151 150 151 151 150 151 151 150 151 151 149 149 150 127 127 126 | ||
1113 | 44 44 45 2 2 2 | ||
1114 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1115 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1116 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1117 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1118 | 0 0 0 0 0 0 2 2 2 1 1 1 0 0 0 0 0 0 | ||
1119 | 0 0 0 0 0 0 0 0 0 7 7 7 21 21 22 25 25 26 | ||
1120 | 25 25 26 24 24 24 20 20 20 23 23 24 25 25 26 26 26 27 | ||
1121 | 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 | ||
1122 | 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 26 27 27 | ||
1123 | 28 28 29 26 27 27 26 26 27 26 26 27 26 26 27 26 26 27 | ||
1124 | 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 | ||
1125 | 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 26 26 27 | ||
1126 | 26 26 27 26 26 27 26 26 27 26 26 27 25 25 26 21 21 22 | ||
1127 | 7 7 7 0 0 0 | ||
diff --git a/drivers/video/logo/logo_blackfin_vga16.ppm b/drivers/video/logo/logo_blackfin_vga16.ppm new file mode 100644 index 000000000000..1352b02a9d93 --- /dev/null +++ b/drivers/video/logo/logo_blackfin_vga16.ppm | |||
@@ -0,0 +1,1127 @@ | |||
1 | P3 | ||
2 | # This was generated by the GIMP & Netpbm tools | ||
3 | # gimp linux_bf.svg (create 80x80 save as linux_bf.ppm) | ||
4 | # ppmquant -mapfile clut_vga16.ppm linux_bf.ppm | pnmnoraw > logo_blackfin_vga16.ppm | ||
5 | # | ||
6 | 80 80 | ||
7 | 255 | ||
8 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
9 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
10 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
11 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
12 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
13 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
14 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
15 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
16 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
17 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
18 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
19 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
20 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
21 | 0 0 0 0 0 0 | ||
22 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
23 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
24 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
25 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
26 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
27 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
28 | 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 85 | ||
29 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
30 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
31 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
32 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
33 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
34 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
35 | 0 0 0 0 0 0 | ||
36 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
37 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
38 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
39 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
40 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
41 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 | ||
42 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
43 | 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
44 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
45 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
46 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
47 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
48 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
49 | 0 0 0 0 0 0 | ||
50 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
51 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
52 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
53 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
54 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
55 | 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 | ||
56 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
57 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 | ||
58 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
59 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
60 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
61 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
62 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
63 | 0 0 0 0 0 0 | ||
64 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
65 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
66 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
67 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
68 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
69 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
70 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
71 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
72 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
73 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
74 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
75 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
76 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
77 | 0 0 0 0 0 0 | ||
78 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
79 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
80 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
81 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
82 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
83 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
84 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
85 | 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 | ||
86 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
87 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
88 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
89 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
90 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
91 | 0 0 0 0 0 0 | ||
92 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
93 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
94 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
95 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
96 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
97 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
98 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
99 | 0 0 0 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 | ||
100 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
101 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
102 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
103 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
104 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
105 | 0 0 0 0 0 0 | ||
106 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
107 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
108 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
109 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
110 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
111 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
112 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
113 | 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
114 | 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
115 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
116 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
117 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
118 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
119 | 0 0 0 0 0 0 | ||
120 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
121 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
122 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
123 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
124 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
125 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
126 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
127 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
128 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 | ||
129 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
130 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
131 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
132 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
133 | 0 0 0 0 0 0 | ||
134 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
135 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
136 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
137 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
138 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
139 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
140 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
141 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
142 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 | ||
143 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
144 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
145 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
146 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
147 | 0 0 0 0 0 0 | ||
148 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
149 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
150 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
151 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
152 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
153 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
154 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
155 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
156 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
157 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
158 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
159 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
160 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
161 | 0 0 0 0 0 0 | ||
162 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
163 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
164 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
165 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
166 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
167 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
168 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
169 | 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
170 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
171 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
172 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
173 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
174 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
175 | 0 0 0 0 0 0 | ||
176 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
177 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
178 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
179 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
180 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
181 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 85 85 85 | ||
182 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
183 | 170 170 170 85 85 85 85 85 85 170 170 170 0 0 0 0 0 0 | ||
184 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
185 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
186 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
187 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
188 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
189 | 0 0 0 0 0 0 | ||
190 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
191 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
192 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
193 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
194 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
195 | 0 0 0 170 170 170 170 170 170 170 170 170 85 85 85 85 85 85 | ||
196 | 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 255 255 255 | ||
197 | 255 255 255 255 255 255 170 170 170 85 85 85 0 0 0 0 0 0 | ||
198 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
199 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
200 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
201 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
202 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
203 | 0 0 0 0 0 0 | ||
204 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
205 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
206 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
207 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
208 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
209 | 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 | ||
210 | 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 | ||
211 | 255 255 255 255 255 255 255 255 255 170 170 170 0 0 0 0 0 0 | ||
212 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
213 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
214 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
215 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
216 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
217 | 0 0 0 0 0 0 | ||
218 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
219 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
220 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
221 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
222 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
223 | 255 255 255 170 170 170 85 85 85 170 170 170 255 255 255 255 255 255 | ||
224 | 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 85 85 85 | ||
225 | 85 85 85 170 170 170 255 255 255 255 255 255 0 0 0 0 0 0 | ||
226 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
227 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
228 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
229 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
230 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
231 | 0 0 0 0 0 0 | ||
232 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
233 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
234 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
235 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
236 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
237 | 255 255 255 85 85 85 170 170 170 170 170 170 255 255 255 255 255 255 | ||
238 | 85 85 85 85 85 85 170 170 170 255 255 255 170 170 170 0 0 0 | ||
239 | 170 170 170 170 170 170 255 255 255 255 255 255 85 85 85 0 0 0 | ||
240 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
241 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
242 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
243 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
244 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
245 | 0 0 0 0 0 0 | ||
246 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
247 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
248 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
249 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
250 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
251 | 255 255 255 0 0 0 85 85 85 170 170 170 170 170 170 255 255 255 | ||
252 | 0 0 0 85 85 85 85 85 85 255 255 255 85 85 85 0 0 0 | ||
253 | 0 0 0 85 85 85 170 170 170 255 255 255 85 85 85 0 0 0 | ||
254 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
255 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
256 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
257 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
258 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
259 | 0 0 0 0 0 0 | ||
260 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
261 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
262 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
263 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
264 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
265 | 255 255 255 85 85 85 0 0 0 0 0 0 255 85 85 255 255 85 | ||
266 | 255 255 85 255 255 85 255 255 85 255 255 85 85 85 85 0 0 0 | ||
267 | 0 0 0 0 0 0 170 170 170 255 255 255 0 0 0 0 0 0 | ||
268 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
269 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
270 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
271 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
272 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
273 | 0 0 0 0 0 0 | ||
274 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
275 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
276 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
277 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
278 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
279 | 170 170 170 255 255 255 0 0 0 255 85 85 170 85 0 170 85 0 | ||
280 | 255 255 85 255 255 85 170 85 0 255 255 85 255 255 85 255 255 85 | ||
281 | 0 0 0 85 85 85 255 255 255 255 255 255 0 0 0 0 0 0 | ||
282 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
283 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
284 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
285 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
286 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
287 | 0 0 0 0 0 0 | ||
288 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
289 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
290 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
291 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
292 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
293 | 0 0 0 255 255 255 255 85 85 255 255 85 255 255 85 255 255 85 | ||
294 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
295 | 255 255 85 255 255 85 255 255 85 170 170 170 0 0 0 0 0 0 | ||
296 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
297 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
298 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
299 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
300 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
301 | 0 0 0 0 0 0 | ||
302 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
303 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
304 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
305 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
306 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
307 | 0 0 0 255 85 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
308 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
309 | 255 255 85 255 255 85 255 255 85 255 255 85 0 0 0 0 0 0 | ||
310 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
311 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
312 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
313 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
314 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
315 | 0 0 0 0 0 0 | ||
316 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
317 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
318 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
319 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
320 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
321 | 170 85 0 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
322 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
323 | 255 255 85 170 85 0 85 85 85 255 255 85 0 0 0 0 0 0 | ||
324 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
325 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
326 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
327 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
328 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
329 | 0 0 0 0 0 0 | ||
330 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
331 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
332 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
333 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
334 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
335 | 255 85 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
336 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
337 | 170 85 0 85 85 85 255 255 85 255 255 85 0 0 0 0 0 0 | ||
338 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 | ||
339 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
340 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
341 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
342 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
343 | 0 0 0 0 0 0 | ||
344 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
345 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
346 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
347 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
348 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
349 | 170 85 0 170 85 0 255 255 85 255 255 85 255 255 85 255 255 85 | ||
350 | 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0 170 85 0 | ||
351 | 170 85 0 255 255 85 255 255 85 255 85 85 0 0 0 0 0 0 | ||
352 | 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 85 85 85 | ||
353 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
354 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
355 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
356 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
357 | 0 0 0 0 0 0 | ||
358 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
359 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
360 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
361 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
362 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
363 | 85 85 85 170 85 0 170 85 0 170 85 0 255 255 85 255 255 85 | ||
364 | 255 255 85 255 85 85 170 85 0 170 85 0 170 85 0 255 255 85 | ||
365 | 255 255 85 255 255 85 255 85 85 170 170 170 0 0 0 0 0 0 | ||
366 | 85 85 85 85 85 85 85 85 85 85 85 85 0 0 0 85 85 85 | ||
367 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
368 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
369 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
370 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
371 | 0 0 0 0 0 0 | ||
372 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
373 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
374 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
375 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
376 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
377 | 85 85 85 170 170 170 170 85 0 170 85 0 170 85 0 170 85 0 | ||
378 | 170 85 0 170 85 0 170 85 0 255 255 85 255 255 85 255 255 85 | ||
379 | 255 85 85 170 170 170 255 255 255 255 255 255 85 85 85 0 0 0 | ||
380 | 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 | ||
381 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
382 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
383 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
384 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
385 | 0 0 0 0 0 0 | ||
386 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
387 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
388 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
389 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
390 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
391 | 170 170 170 170 170 170 170 170 170 170 85 0 255 255 85 255 255 85 | ||
392 | 255 255 85 255 255 85 255 255 85 255 255 85 255 85 85 170 170 170 | ||
393 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 | ||
394 | 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 | ||
395 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
396 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
397 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
398 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
399 | 0 0 0 0 0 0 | ||
400 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
401 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
402 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
403 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
404 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
405 | 170 170 170 255 255 255 255 255 255 170 170 170 170 85 0 255 85 85 | ||
406 | 255 85 85 255 85 85 255 85 85 255 85 85 255 255 255 255 255 255 | ||
407 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 85 85 85 | ||
408 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
409 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
410 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
411 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
412 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
413 | 0 0 0 0 0 0 | ||
414 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
415 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
416 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
417 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
418 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
419 | 170 170 170 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170 | ||
420 | 170 170 170 170 170 170 170 170 170 255 255 255 255 255 255 255 255 255 | ||
421 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
422 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
423 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
424 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
425 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
426 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
427 | 0 0 0 0 0 0 | ||
428 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
429 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
430 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
431 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
432 | 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 | ||
433 | 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170 | ||
434 | 170 170 170 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 | ||
435 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
436 | 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
437 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 | ||
438 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
439 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
440 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
441 | 0 0 0 0 0 0 | ||
442 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
443 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
444 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
445 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
446 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 255 255 255 | ||
447 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
448 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
449 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
450 | 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
451 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
452 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
453 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
454 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
455 | 0 0 0 0 0 0 | ||
456 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
457 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
458 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
459 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
460 | 0 0 0 85 85 85 0 0 0 0 0 0 170 170 170 255 255 255 | ||
461 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
462 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
463 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
464 | 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
465 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 | ||
466 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
467 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
468 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
469 | 0 0 0 0 0 0 | ||
470 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
471 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
472 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
473 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
474 | 85 85 85 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 | ||
475 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
476 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
477 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
478 | 255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 | ||
479 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
480 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
481 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
482 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
483 | 0 0 0 0 0 0 | ||
484 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
485 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
486 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
487 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
488 | 85 85 85 0 0 0 0 0 0 85 85 85 255 255 255 255 255 255 | ||
489 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
490 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
491 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
492 | 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 | ||
493 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
494 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
495 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
496 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
497 | 0 0 0 0 0 0 | ||
498 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
499 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
500 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
501 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
502 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
503 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
504 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
505 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
506 | 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 | ||
507 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
508 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
509 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
510 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
511 | 0 0 0 0 0 0 | ||
512 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
513 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
514 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
515 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
516 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
517 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
518 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
519 | 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170 170 170 170 | ||
520 | 170 170 170 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 | ||
521 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
522 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
523 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
524 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
525 | 0 0 0 0 0 0 | ||
526 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
527 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
528 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
529 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
530 | 0 0 0 0 0 0 85 85 85 170 170 170 170 170 170 255 255 255 | ||
531 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
532 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
533 | 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170 170 170 170 | ||
534 | 170 170 170 170 170 170 255 255 255 0 0 0 0 0 0 85 85 85 | ||
535 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
536 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
537 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
538 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
539 | 0 0 0 0 0 0 | ||
540 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
541 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
542 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
543 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
544 | 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 | ||
545 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
546 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
547 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 | ||
548 | 170 170 170 170 170 170 170 170 170 255 255 255 0 0 0 85 85 85 | ||
549 | 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
550 | 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
551 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
552 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
553 | 0 0 0 0 0 0 | ||
554 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
555 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
556 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
557 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
558 | 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 | ||
559 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
560 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
561 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
562 | 255 255 255 170 170 170 170 170 170 255 255 255 0 0 0 0 0 0 | ||
563 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
564 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 | ||
565 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
566 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
567 | 0 0 0 0 0 0 | ||
568 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
569 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
570 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
571 | 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 | ||
572 | 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 | ||
573 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
574 | 255 255 255 170 170 170 85 85 85 170 170 170 170 170 170 255 255 255 | ||
575 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
576 | 255 255 255 255 255 255 170 170 170 170 170 170 255 255 255 0 0 0 | ||
577 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
578 | 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 | ||
579 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
580 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
581 | 0 0 0 0 0 0 | ||
582 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
583 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
584 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
585 | 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 | ||
586 | 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
587 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
588 | 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
589 | 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
590 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 | ||
591 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
592 | 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
593 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
594 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
595 | 0 0 0 0 0 0 | ||
596 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
597 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
598 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
599 | 0 0 0 85 85 85 0 0 0 0 0 0 85 85 85 0 0 0 | ||
600 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
601 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
602 | 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
603 | 0 0 0 85 85 85 170 170 170 255 255 255 255 255 255 255 255 255 | ||
604 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 | ||
605 | 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0 | ||
606 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 | ||
607 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
608 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
609 | 0 0 0 0 0 0 | ||
610 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
611 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
612 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
613 | 0 0 0 85 85 85 0 0 0 85 85 85 85 85 85 85 85 85 | ||
614 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
615 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
616 | 255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 | ||
617 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
618 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
619 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
620 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
621 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
622 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
623 | 0 0 0 0 0 0 | ||
624 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
625 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
626 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
627 | 0 0 0 85 85 85 0 0 0 85 85 85 0 0 0 255 255 255 | ||
628 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
629 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
630 | 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 | ||
631 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
632 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
633 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
634 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
635 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
636 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
637 | 0 0 0 0 0 0 | ||
638 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
639 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
640 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
641 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 | ||
642 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
643 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
644 | 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 | ||
645 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 | ||
646 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
647 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
648 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
649 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
650 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
651 | 0 0 0 0 0 0 | ||
652 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
653 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
654 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
655 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 | ||
656 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
657 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
658 | 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 | ||
659 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
660 | 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
661 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
662 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
663 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
664 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
665 | 0 0 0 0 0 0 | ||
666 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
667 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
668 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
669 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
670 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
671 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
672 | 255 255 255 255 255 255 255 255 255 170 170 170 0 0 0 0 0 0 | ||
673 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
674 | 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 | ||
675 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
676 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
677 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
678 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
679 | 0 0 0 0 0 0 | ||
680 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
681 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
682 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
683 | 0 0 0 0 0 0 85 85 85 0 0 0 255 255 255 255 255 255 | ||
684 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
685 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
686 | 255 255 255 255 255 255 255 255 255 170 170 170 0 0 0 0 0 0 | ||
687 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
688 | 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 | ||
689 | 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
690 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
691 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
692 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
693 | 0 0 0 0 0 0 | ||
694 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
695 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
696 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
697 | 0 0 0 0 0 0 85 85 85 0 0 0 255 255 255 255 255 255 | ||
698 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
699 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
700 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
701 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
702 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
703 | 170 170 170 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
704 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
705 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
706 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
707 | 0 0 0 0 0 0 | ||
708 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
709 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
710 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
711 | 0 0 0 0 0 0 85 85 85 0 0 0 255 255 255 255 255 255 | ||
712 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
713 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
714 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
715 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
716 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
717 | 170 170 170 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
718 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
719 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
720 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
721 | 0 0 0 0 0 0 | ||
722 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
723 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
724 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
725 | 0 0 0 0 0 0 85 85 85 0 0 0 255 255 255 255 255 255 | ||
726 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
727 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
728 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
729 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
730 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 | ||
731 | 170 170 170 0 0 0 0 0 0 85 85 85 85 85 85 0 0 0 | ||
732 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
733 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
734 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
735 | 0 0 0 0 0 0 | ||
736 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
737 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
738 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 0 0 0 | ||
739 | 0 0 0 0 0 0 85 85 85 85 85 85 255 255 255 255 255 255 | ||
740 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
741 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
742 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
743 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
744 | 0 0 0 85 85 85 170 170 170 170 170 170 255 255 255 255 255 255 | ||
745 | 170 170 170 0 0 0 0 0 0 85 85 85 0 0 0 0 0 0 | ||
746 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
747 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
748 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
749 | 0 0 0 0 0 0 | ||
750 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
751 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
752 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 85 0 | ||
753 | 255 255 85 255 255 85 0 0 0 85 85 85 255 255 255 255 255 255 | ||
754 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
755 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
756 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
757 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
758 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
759 | 170 170 170 170 170 170 170 170 170 85 85 85 0 0 0 85 85 85 | ||
760 | 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 85 85 85 | ||
761 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
762 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
763 | 0 0 0 0 0 0 | ||
764 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
765 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
766 | 0 0 0 0 0 0 0 0 0 0 0 0 255 255 85 255 255 85 | ||
767 | 255 255 85 255 255 85 255 255 85 85 85 85 170 170 170 255 255 255 | ||
768 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
769 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
770 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
771 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
772 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 85 170 170 170 | ||
773 | 85 85 85 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 | ||
774 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 85 85 85 | ||
775 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
776 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
777 | 0 0 0 0 0 0 | ||
778 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
779 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
780 | 85 85 85 0 0 0 0 0 0 170 85 0 255 255 85 255 255 85 | ||
781 | 255 255 85 255 255 85 255 255 85 255 255 85 170 85 0 255 255 255 | ||
782 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
783 | 255 255 255 255 255 255 255 255 255 170 170 170 255 255 255 255 255 255 | ||
784 | 255 255 255 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 | ||
785 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
786 | 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170 170 170 170 | ||
787 | 255 255 255 85 85 85 0 0 0 170 170 170 85 85 85 0 0 0 | ||
788 | 0 0 0 0 0 0 85 85 85 0 0 0 255 255 85 85 85 85 | ||
789 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
790 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
791 | 0 0 0 0 0 0 | ||
792 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
793 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
794 | 170 170 170 0 0 0 85 85 85 255 255 85 255 255 85 255 255 85 | ||
795 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 0 0 0 | ||
796 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
797 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
798 | 255 255 255 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 | ||
799 | 0 0 0 0 0 0 85 85 85 255 255 255 255 255 255 255 255 255 | ||
800 | 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
801 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
802 | 0 0 0 0 0 0 0 0 0 255 255 85 255 255 85 255 255 85 | ||
803 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
804 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
805 | 0 0 0 0 0 0 | ||
806 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
807 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
808 | 170 170 170 170 170 170 255 255 85 255 255 85 255 255 85 255 255 85 | ||
809 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
810 | 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 | ||
811 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
812 | 255 255 255 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 | ||
813 | 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 170 170 170 | ||
814 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
815 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 | ||
816 | 85 85 85 0 0 0 255 255 85 255 255 85 255 255 85 255 255 85 | ||
817 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
818 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
819 | 0 0 0 0 0 0 | ||
820 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
821 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
822 | 170 170 170 170 170 170 170 170 170 170 170 170 255 255 85 255 255 85 | ||
823 | 255 255 85 255 255 85 170 170 170 170 170 170 170 170 170 170 170 170 | ||
824 | 255 255 85 85 85 85 170 170 170 170 170 170 170 170 170 170 170 170 | ||
825 | 255 255 255 255 255 255 170 170 170 170 170 170 170 170 170 255 255 255 | ||
826 | 255 255 255 170 170 170 170 170 170 255 255 255 0 0 0 0 0 0 | ||
827 | 0 0 0 85 85 85 255 255 255 255 255 255 255 255 255 85 85 85 | ||
828 | 85 85 85 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 | ||
829 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
830 | 170 170 170 170 170 170 255 255 85 255 255 85 255 255 85 255 255 85 | ||
831 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
832 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
833 | 0 0 0 0 0 0 | ||
834 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
835 | 0 0 0 0 0 0 255 255 255 85 85 85 0 0 0 0 0 0 | ||
836 | 255 255 255 85 85 85 0 0 0 0 0 0 255 255 255 255 255 85 | ||
837 | 255 255 85 170 170 170 0 0 0 0 0 0 0 0 0 170 170 170 | ||
838 | 255 255 255 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 | ||
839 | 170 170 170 255 255 255 85 85 85 0 0 0 85 85 85 255 255 255 | ||
840 | 85 85 85 0 0 0 85 85 85 255 255 255 0 0 0 0 0 0 | ||
841 | 0 0 0 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
842 | 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 85 85 85 | ||
843 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
844 | 85 85 85 255 255 255 255 255 85 255 255 85 255 255 85 255 255 85 | ||
845 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
846 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
847 | 0 0 0 0 0 0 | ||
848 | 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 | ||
849 | 0 0 0 85 85 85 255 255 255 0 0 0 0 0 0 85 85 85 | ||
850 | 255 255 255 0 0 0 0 0 0 85 85 85 255 255 85 255 255 85 | ||
851 | 255 255 85 85 85 85 0 0 0 0 0 0 0 0 0 170 170 170 | ||
852 | 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
853 | 85 85 85 255 255 255 0 0 0 0 0 0 170 170 170 170 170 170 | ||
854 | 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 85 85 85 | ||
855 | 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 | ||
856 | 255 255 255 85 85 85 0 0 0 85 85 85 255 255 255 255 255 255 | ||
857 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
858 | 0 0 0 85 85 85 255 255 255 255 255 85 255 255 85 255 255 85 | ||
859 | 255 255 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
860 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
861 | 0 0 0 0 0 0 | ||
862 | 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 | ||
863 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 170 170 170 | ||
864 | 170 170 170 0 0 0 0 0 0 170 170 170 255 255 85 255 255 85 | ||
865 | 255 255 255 0 0 0 85 85 85 85 85 85 0 0 0 170 170 170 | ||
866 | 255 255 255 0 0 0 0 0 0 170 170 170 85 85 85 0 0 0 | ||
867 | 85 85 85 170 170 170 0 0 0 0 0 0 170 170 170 0 0 0 | ||
868 | 0 0 0 170 170 170 255 255 255 255 255 255 255 255 255 255 255 255 | ||
869 | 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 170 170 170 | ||
870 | 85 85 85 0 0 0 85 85 85 255 255 255 255 255 255 170 170 170 | ||
871 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
872 | 0 0 0 0 0 0 85 85 85 255 255 255 255 255 85 255 255 85 | ||
873 | 255 255 85 170 85 0 0 0 0 85 85 85 85 85 85 85 85 85 | ||
874 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
875 | 0 0 0 0 0 0 | ||
876 | 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 | ||
877 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255 | ||
878 | 170 170 170 0 0 0 0 0 0 170 170 170 255 255 85 255 255 85 | ||
879 | 170 170 170 0 0 0 170 170 170 85 85 85 0 0 0 255 255 255 | ||
880 | 170 170 170 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 | ||
881 | 170 170 170 170 170 170 0 0 0 0 0 0 85 85 85 0 0 0 | ||
882 | 85 85 85 255 255 255 255 255 255 255 255 255 255 255 255 170 170 170 | ||
883 | 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 | ||
884 | 0 0 0 0 0 0 170 170 170 255 255 255 170 170 170 0 0 0 | ||
885 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
886 | 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255 255 255 85 | ||
887 | 255 255 85 255 255 85 255 255 255 170 170 170 170 170 170 255 255 255 | ||
888 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
889 | 0 0 0 0 0 0 | ||
890 | 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 0 0 0 | ||
891 | 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 | ||
892 | 85 85 85 0 0 0 0 0 0 255 255 255 255 255 85 255 255 85 | ||
893 | 85 85 85 0 0 0 255 255 255 85 85 85 0 0 0 255 255 255 | ||
894 | 85 85 85 0 0 0 85 85 85 255 255 255 85 85 85 85 85 85 | ||
895 | 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
896 | 255 255 255 255 255 255 255 255 255 170 170 170 0 0 0 85 85 85 | ||
897 | 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 | ||
898 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
899 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255 | ||
900 | 170 170 170 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
901 | 255 255 85 255 255 85 170 170 170 170 170 170 170 170 170 170 170 170 | ||
902 | 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
903 | 0 0 0 0 0 0 | ||
904 | 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 | ||
905 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 255 255 255 | ||
906 | 0 0 0 0 0 0 85 85 85 255 255 85 255 255 85 255 255 255 | ||
907 | 0 0 0 85 85 85 255 255 255 0 0 0 85 85 85 255 255 255 | ||
908 | 85 85 85 0 0 0 170 170 170 255 255 255 170 170 170 170 170 170 | ||
909 | 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
910 | 255 255 255 255 255 255 255 255 255 170 170 170 0 0 0 170 170 170 | ||
911 | 255 255 255 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 | ||
912 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
913 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 255 255 255 | ||
914 | 170 170 170 0 0 0 85 85 85 85 85 85 0 0 0 170 170 170 | ||
915 | 255 255 85 255 255 85 255 255 255 170 170 170 170 170 170 170 170 170 | ||
916 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
917 | 0 0 0 0 0 0 | ||
918 | 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 | ||
919 | 85 85 85 170 170 170 0 0 0 0 0 0 85 85 85 170 170 170 | ||
920 | 0 0 0 0 0 0 170 170 170 255 255 85 255 255 85 170 170 170 | ||
921 | 0 0 0 85 85 85 170 170 170 0 0 0 85 85 85 255 255 255 | ||
922 | 0 0 0 0 0 0 170 170 170 170 170 170 170 170 170 255 255 255 | ||
923 | 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
924 | 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 255 255 255 | ||
925 | 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 | ||
926 | 85 85 85 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 | ||
927 | 0 0 0 0 0 0 170 170 170 255 255 255 255 255 85 255 255 255 | ||
928 | 85 85 85 170 170 170 255 255 255 255 255 255 170 170 170 0 0 0 | ||
929 | 170 170 170 255 255 85 255 255 85 255 255 255 170 170 170 255 255 255 | ||
930 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
931 | 0 0 0 0 0 0 | ||
932 | 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 | ||
933 | 170 170 170 170 170 170 0 0 0 0 0 0 85 85 85 170 170 170 | ||
934 | 0 0 0 0 0 0 170 170 170 255 255 85 255 255 255 85 85 85 | ||
935 | 0 0 0 85 85 85 85 85 85 0 0 0 85 85 85 170 170 170 | ||
936 | 0 0 0 0 0 0 255 255 255 85 85 85 0 0 0 170 170 170 | ||
937 | 170 170 170 0 0 0 0 0 0 85 85 85 0 0 0 85 85 85 | ||
938 | 255 255 255 255 255 255 255 255 255 85 85 85 85 85 85 255 255 255 | ||
939 | 255 255 255 85 85 85 0 0 0 0 0 0 0 0 0 170 170 170 | ||
940 | 170 170 170 170 170 170 255 255 255 0 0 0 0 0 0 0 0 0 | ||
941 | 0 0 0 170 170 170 255 255 255 255 255 255 255 255 85 170 170 170 | ||
942 | 255 255 255 255 255 255 255 255 85 255 255 85 170 170 170 0 0 0 | ||
943 | 0 0 0 170 170 170 255 255 85 255 255 85 255 255 85 255 255 85 | ||
944 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
945 | 0 0 0 0 0 0 | ||
946 | 0 0 0 0 0 0 170 170 170 85 85 85 0 0 0 0 0 0 | ||
947 | 255 255 255 85 85 85 0 0 0 0 0 0 170 170 170 85 85 85 | ||
948 | 0 0 0 0 0 0 255 255 255 255 255 85 255 255 255 0 0 0 | ||
949 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
950 | 0 0 0 85 85 85 255 255 255 0 0 0 0 0 0 255 255 255 | ||
951 | 85 85 85 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 | ||
952 | 255 255 255 255 255 255 255 255 255 85 85 85 170 170 170 255 255 255 | ||
953 | 255 255 255 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 | ||
954 | 170 170 170 85 85 85 170 170 170 0 0 0 0 0 0 85 85 85 | ||
955 | 255 255 255 170 170 170 0 0 0 170 170 170 255 255 85 255 255 255 | ||
956 | 255 255 255 170 170 170 255 255 255 255 255 255 85 85 85 0 0 0 | ||
957 | 85 85 85 255 255 255 255 255 255 255 255 85 255 255 85 255 255 85 | ||
958 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
959 | 0 0 0 0 0 0 | ||
960 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 | ||
961 | 85 85 85 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 | ||
962 | 0 0 0 85 85 85 170 170 170 255 255 255 170 170 170 0 0 0 | ||
963 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
964 | 0 0 0 85 85 85 170 170 170 0 0 0 85 85 85 255 255 255 | ||
965 | 0 0 0 0 0 0 170 170 170 170 170 170 0 0 0 0 0 0 | ||
966 | 255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 255 255 255 | ||
967 | 170 170 170 0 0 0 0 0 0 170 170 170 255 255 255 85 85 85 | ||
968 | 170 170 170 170 170 170 170 170 170 0 0 0 85 85 85 255 255 255 | ||
969 | 170 170 170 0 0 0 85 85 85 255 255 255 255 255 85 170 170 170 | ||
970 | 0 0 0 170 170 170 255 255 255 255 255 255 0 0 0 85 85 85 | ||
971 | 255 255 255 170 170 170 0 0 0 170 170 170 255 255 85 85 85 85 | ||
972 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
973 | 0 0 0 0 0 0 | ||
974 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 | ||
975 | 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170 0 0 0 | ||
976 | 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 0 0 0 | ||
977 | 170 170 170 255 255 255 0 0 0 0 0 0 170 170 170 85 85 85 | ||
978 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 170 170 170 | ||
979 | 0 0 0 0 0 0 255 255 255 170 170 170 0 0 0 0 0 0 | ||
980 | 255 255 255 255 255 255 170 170 170 85 85 85 255 255 255 255 255 255 | ||
981 | 85 85 85 0 0 0 170 170 170 170 170 170 0 0 0 0 0 0 | ||
982 | 170 170 170 170 170 170 255 255 255 255 255 255 255 255 255 85 85 85 | ||
983 | 0 0 0 0 0 0 255 255 255 255 255 255 170 170 170 0 0 0 | ||
984 | 0 0 0 170 170 170 255 255 255 170 170 170 170 170 170 255 255 255 | ||
985 | 85 85 85 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
986 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
987 | 0 0 0 0 0 0 | ||
988 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 | ||
989 | 0 0 0 0 0 0 170 170 170 255 255 255 170 170 170 0 0 0 | ||
990 | 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 | ||
991 | 255 255 255 255 255 255 0 0 0 0 0 0 255 255 255 170 170 170 | ||
992 | 0 0 0 0 0 0 0 0 0 170 170 170 255 255 255 170 170 170 | ||
993 | 0 0 0 0 0 0 255 255 255 170 170 170 0 0 0 0 0 0 | ||
994 | 170 170 170 255 255 255 170 170 170 170 170 170 170 170 170 170 170 170 | ||
995 | 0 0 0 85 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
996 | 85 85 85 255 255 255 255 255 255 170 170 170 0 0 0 0 0 0 | ||
997 | 0 0 0 170 170 170 255 255 255 170 170 170 0 0 0 0 0 0 | ||
998 | 85 85 85 255 255 255 255 255 85 255 255 255 255 255 255 85 85 85 | ||
999 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
1000 | 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1001 | 0 0 0 0 0 0 | ||
1002 | 0 0 0 85 85 85 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1003 | 170 170 170 170 170 170 255 255 85 255 255 85 255 255 85 170 170 170 | ||
1004 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1005 | 255 255 85 170 170 170 170 170 170 170 170 170 255 255 85 255 255 85 | ||
1006 | 170 170 170 170 170 170 170 170 170 255 255 85 255 255 85 170 170 170 | ||
1007 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1008 | 170 170 170 170 170 170 85 85 85 170 170 170 170 170 170 170 170 170 | ||
1009 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1010 | 0 0 0 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1011 | 85 85 85 255 255 255 170 170 170 0 0 0 0 0 0 0 0 0 | ||
1012 | 0 0 0 255 255 255 255 255 255 255 255 255 85 85 85 0 0 0 | ||
1013 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
1014 | 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1015 | 0 0 0 0 0 0 | ||
1016 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1017 | 85 85 85 85 85 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1018 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1019 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1020 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1021 | 255 255 85 255 85 85 85 85 85 0 0 0 0 0 0 0 0 0 | ||
1022 | 85 85 85 170 170 170 85 85 85 170 170 170 170 170 170 85 85 85 | ||
1023 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1024 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1025 | 85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1026 | 0 0 0 85 85 85 170 170 170 0 0 0 0 0 0 0 0 0 | ||
1027 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1028 | 85 85 85 170 170 170 85 85 85 0 0 0 0 0 0 0 0 0 | ||
1029 | 0 0 0 0 0 0 | ||
1030 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1031 | 0 0 0 0 0 0 85 85 85 85 85 85 170 85 0 170 85 0 | ||
1032 | 170 85 0 255 85 85 255 85 85 255 85 85 255 255 85 255 255 85 | ||
1033 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1034 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1035 | 255 85 85 170 85 0 85 85 85 0 0 0 0 0 0 85 85 85 | ||
1036 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 0 0 0 | ||
1037 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1038 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1039 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1040 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1041 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1042 | 0 0 0 170 170 170 170 170 170 85 85 85 0 0 0 0 0 0 | ||
1043 | 0 0 0 0 0 0 | ||
1044 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1045 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 | ||
1046 | 85 85 85 85 85 85 170 85 0 170 85 0 170 85 0 170 85 0 | ||
1047 | 255 85 85 255 85 85 255 255 85 255 255 85 255 255 85 255 255 85 | ||
1048 | 255 255 85 255 255 85 255 255 85 255 255 85 255 255 85 255 85 85 | ||
1049 | 170 85 0 170 85 0 0 0 0 85 85 85 85 85 85 170 170 170 | ||
1050 | 170 170 170 0 0 0 170 170 170 255 255 255 170 170 170 0 0 0 | ||
1051 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1052 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1053 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1054 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1055 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1056 | 0 0 0 0 0 0 170 170 170 170 170 170 0 0 0 0 0 0 | ||
1057 | 0 0 0 0 0 0 | ||
1058 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1059 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1060 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 | ||
1061 | 170 85 0 170 85 0 170 85 0 255 85 85 255 85 85 255 255 85 | ||
1062 | 255 255 85 255 255 85 255 255 85 255 255 85 255 85 85 170 85 0 | ||
1063 | 170 85 0 85 85 85 85 85 85 85 85 85 170 170 170 170 170 170 | ||
1064 | 0 0 0 0 0 0 255 255 255 255 255 255 85 85 85 0 0 0 | ||
1065 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1066 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1067 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1068 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1069 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1070 | 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 0 0 0 | ||
1071 | 0 0 0 0 0 0 | ||
1072 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1073 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1074 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1075 | 0 0 0 85 85 85 85 85 85 170 85 0 170 85 0 170 85 0 | ||
1076 | 170 85 0 255 85 85 255 85 85 255 85 85 170 85 0 170 85 0 | ||
1077 | 85 85 85 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 | ||
1078 | 0 0 0 85 85 85 255 255 255 170 170 170 0 0 0 0 0 0 | ||
1079 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1080 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1081 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1082 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1083 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1084 | 0 0 0 0 0 0 0 0 0 0 0 0 170 170 170 85 85 85 | ||
1085 | 0 0 0 0 0 0 | ||
1086 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1087 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1088 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1089 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 | ||
1090 | 170 85 0 170 85 0 170 85 0 170 85 0 170 85 0 85 85 85 | ||
1091 | 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 0 0 0 | ||
1092 | 0 0 0 85 85 85 255 255 255 170 170 170 0 0 0 0 0 0 | ||
1093 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1094 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1095 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1096 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1097 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1098 | 0 0 0 0 0 0 0 0 0 0 0 0 85 85 85 170 170 170 | ||
1099 | 85 85 85 0 0 0 | ||
1100 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1101 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1102 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1103 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1104 | 0 0 0 85 85 85 85 85 85 85 85 85 0 0 0 0 0 0 | ||
1105 | 0 0 0 0 0 0 0 0 0 85 85 85 85 85 85 170 170 170 | ||
1106 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1107 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1108 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1109 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1110 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1111 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 | ||
1112 | 170 170 170 170 170 170 170 170 170 170 170 170 170 170 170 85 85 85 | ||
1113 | 85 85 85 0 0 0 | ||
1114 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1115 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1116 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1117 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1118 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1119 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1120 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1121 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1122 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1123 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1124 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1125 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1126 | 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | ||
1127 | 0 0 0 0 0 0 | ||
diff --git a/drivers/video/p9100.c b/drivers/video/p9100.c index c95874fe9076..9e903454ffc1 100644 --- a/drivers/video/p9100.c +++ b/drivers/video/p9100.c | |||
@@ -15,10 +15,9 @@ | |||
15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
16 | #include <linux/fb.h> | 16 | #include <linux/fb.h> |
17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
18 | #include <linux/of_device.h> | ||
18 | 19 | ||
19 | #include <asm/io.h> | 20 | #include <asm/io.h> |
20 | #include <asm/prom.h> | ||
21 | #include <asm/of_device.h> | ||
22 | #include <asm/fbio.h> | 21 | #include <asm/fbio.h> |
23 | 22 | ||
24 | #include "sbuslib.h" | 23 | #include "sbuslib.h" |
@@ -275,7 +274,7 @@ static int __devinit p9100_probe(struct of_device *op, const struct of_device_id | |||
275 | par->physbase = op->resource[2].start; | 274 | par->physbase = op->resource[2].start; |
276 | par->which_io = op->resource[2].flags & IORESOURCE_BITS; | 275 | par->which_io = op->resource[2].flags & IORESOURCE_BITS; |
277 | 276 | ||
278 | sbusfb_fill_var(&info->var, dp->node, 8); | 277 | sbusfb_fill_var(&info->var, dp, 8); |
279 | info->var.red.length = 8; | 278 | info->var.red.length = 8; |
280 | info->var.green.length = 8; | 279 | info->var.green.length = 8; |
281 | info->var.blue.length = 8; | 280 | info->var.blue.length = 8; |
@@ -295,7 +294,7 @@ static int __devinit p9100_probe(struct of_device *op, const struct of_device_id | |||
295 | if (!info->screen_base) | 294 | if (!info->screen_base) |
296 | goto out_unmap_regs; | 295 | goto out_unmap_regs; |
297 | 296 | ||
298 | p9100_blank(0, info); | 297 | p9100_blank(FB_BLANK_UNBLANK, info); |
299 | 298 | ||
300 | if (fb_alloc_cmap(&info->cmap, 256, 0)) | 299 | if (fb_alloc_cmap(&info->cmap, 256, 0)) |
301 | goto out_unmap_screen; | 300 | goto out_unmap_screen; |
diff --git a/drivers/video/pnx4008/pnxrgbfb.c b/drivers/video/pnx4008/pnxrgbfb.c index 685761a0732c..4db6b48a8715 100644 --- a/drivers/video/pnx4008/pnxrgbfb.c +++ b/drivers/video/pnx4008/pnxrgbfb.c | |||
@@ -100,7 +100,6 @@ static int rgbfb_remove(struct platform_device *pdev) | |||
100 | fb_dealloc_cmap(&info->cmap); | 100 | fb_dealloc_cmap(&info->cmap); |
101 | framebuffer_release(info); | 101 | framebuffer_release(info); |
102 | platform_set_drvdata(pdev, NULL); | 102 | platform_set_drvdata(pdev, NULL); |
103 | kfree(info); | ||
104 | } | 103 | } |
105 | 104 | ||
106 | pnx4008_free_dum_channel(channel_owned, pdev->id); | 105 | pnx4008_free_dum_channel(channel_owned, pdev->id); |
@@ -168,23 +167,21 @@ static int __devinit rgbfb_probe(struct platform_device *pdev) | |||
168 | 167 | ||
169 | ret = fb_alloc_cmap(&info->cmap, 256, 0); | 168 | ret = fb_alloc_cmap(&info->cmap, 256, 0); |
170 | if (ret < 0) | 169 | if (ret < 0) |
171 | goto err2; | 170 | goto err1; |
172 | 171 | ||
173 | ret = register_framebuffer(info); | 172 | ret = register_framebuffer(info); |
174 | if (ret < 0) | 173 | if (ret < 0) |
175 | goto err3; | 174 | goto err2; |
176 | platform_set_drvdata(pdev, info); | 175 | platform_set_drvdata(pdev, info); |
177 | 176 | ||
178 | return 0; | 177 | return 0; |
179 | 178 | ||
180 | err3: | ||
181 | fb_dealloc_cmap(&info->cmap); | ||
182 | err2: | 179 | err2: |
183 | framebuffer_release(info); | 180 | fb_dealloc_cmap(&info->cmap); |
184 | err1: | 181 | err1: |
185 | pnx4008_free_dum_channel(channel_owned, pdev->id); | 182 | pnx4008_free_dum_channel(channel_owned, pdev->id); |
186 | err0: | 183 | err0: |
187 | kfree(info); | 184 | framebuffer_release(info); |
188 | err: | 185 | err: |
189 | return ret; | 186 | return ret; |
190 | } | 187 | } |
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c index 3ab6e3d973a1..48aea39c35a5 100644 --- a/drivers/video/pxafb.c +++ b/drivers/video/pxafb.c | |||
@@ -1301,8 +1301,8 @@ static void pxafb_decode_mode_info(struct pxafb_info *fbi, | |||
1301 | } | 1301 | } |
1302 | } | 1302 | } |
1303 | 1303 | ||
1304 | static int pxafb_decode_mach_info(struct pxafb_info *fbi, | 1304 | static void pxafb_decode_mach_info(struct pxafb_info *fbi, |
1305 | struct pxafb_mach_info *inf) | 1305 | struct pxafb_mach_info *inf) |
1306 | { | 1306 | { |
1307 | unsigned int lcd_conn = inf->lcd_conn; | 1307 | unsigned int lcd_conn = inf->lcd_conn; |
1308 | 1308 | ||
@@ -1333,7 +1333,7 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
1333 | fbi->lccr0 = inf->lccr0; | 1333 | fbi->lccr0 = inf->lccr0; |
1334 | fbi->lccr3 = inf->lccr3; | 1334 | fbi->lccr3 = inf->lccr3; |
1335 | fbi->lccr4 = inf->lccr4; | 1335 | fbi->lccr4 = inf->lccr4; |
1336 | return -EINVAL; | 1336 | goto decode_mode; |
1337 | } | 1337 | } |
1338 | 1338 | ||
1339 | if (lcd_conn == LCD_MONO_STN_8BPP) | 1339 | if (lcd_conn == LCD_MONO_STN_8BPP) |
@@ -1343,8 +1343,8 @@ static int pxafb_decode_mach_info(struct pxafb_info *fbi, | |||
1343 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; | 1343 | fbi->lccr3 |= (lcd_conn & LCD_BIAS_ACTIVE_LOW) ? LCCR3_OEP : 0; |
1344 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; | 1344 | fbi->lccr3 |= (lcd_conn & LCD_PCLK_EDGE_FALL) ? LCCR3_PCP : 0; |
1345 | 1345 | ||
1346 | decode_mode: | ||
1346 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); | 1347 | pxafb_decode_mode_info(fbi, inf->modes, inf->num_modes); |
1347 | return 0; | ||
1348 | } | 1348 | } |
1349 | 1349 | ||
1350 | static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) | 1350 | static struct pxafb_info * __init pxafb_init_fbinfo(struct device *dev) |
diff --git a/drivers/video/sbuslib.c b/drivers/video/sbuslib.c index 4deaac05b938..37d764ad56b0 100644 --- a/drivers/video/sbuslib.c +++ b/drivers/video/sbuslib.c | |||
@@ -10,18 +10,19 @@ | |||
10 | #include <linux/fb.h> | 10 | #include <linux/fb.h> |
11 | #include <linux/mm.h> | 11 | #include <linux/mm.h> |
12 | #include <linux/uaccess.h> | 12 | #include <linux/uaccess.h> |
13 | #include <linux/of_device.h> | ||
13 | 14 | ||
14 | #include <asm/oplib.h> | ||
15 | #include <asm/fbio.h> | 15 | #include <asm/fbio.h> |
16 | 16 | ||
17 | #include "sbuslib.h" | 17 | #include "sbuslib.h" |
18 | 18 | ||
19 | void sbusfb_fill_var(struct fb_var_screeninfo *var, int prom_node, int bpp) | 19 | void sbusfb_fill_var(struct fb_var_screeninfo *var, struct device_node *dp, |
20 | int bpp) | ||
20 | { | 21 | { |
21 | memset(var, 0, sizeof(*var)); | 22 | memset(var, 0, sizeof(*var)); |
22 | 23 | ||
23 | var->xres = prom_getintdefault(prom_node, "width", 1152); | 24 | var->xres = of_getintprop_default(dp, "width", 1152); |
24 | var->yres = prom_getintdefault(prom_node, "height", 900); | 25 | var->yres = of_getintprop_default(dp, "height", 900); |
25 | var->xres_virtual = var->xres; | 26 | var->xres_virtual = var->xres; |
26 | var->yres_virtual = var->yres; | 27 | var->yres_virtual = var->yres; |
27 | var->bits_per_pixel = bpp; | 28 | var->bits_per_pixel = bpp; |
diff --git a/drivers/video/sbuslib.h b/drivers/video/sbuslib.h index 492828c3fe8f..7ba3250236bd 100644 --- a/drivers/video/sbuslib.h +++ b/drivers/video/sbuslib.h | |||
@@ -11,7 +11,8 @@ struct sbus_mmap_map { | |||
11 | #define SBUS_MMAP_FBSIZE(n) (-n) | 11 | #define SBUS_MMAP_FBSIZE(n) (-n) |
12 | #define SBUS_MMAP_EMPTY 0x80000000 | 12 | #define SBUS_MMAP_EMPTY 0x80000000 |
13 | 13 | ||
14 | extern void sbusfb_fill_var(struct fb_var_screeninfo *var, int prom_node, int bpp); | 14 | extern void sbusfb_fill_var(struct fb_var_screeninfo *var, |
15 | struct device_node *dp, int bpp); | ||
15 | struct vm_area_struct; | 16 | struct vm_area_struct; |
16 | extern int sbusfb_mmap_helper(struct sbus_mmap_map *map, | 17 | extern int sbusfb_mmap_helper(struct sbus_mmap_map *map, |
17 | unsigned long physbase, unsigned long fbsize, | 18 | unsigned long physbase, unsigned long fbsize, |
@@ -21,6 +22,6 @@ int sbusfb_ioctl_helper(unsigned long cmd, unsigned long arg, | |||
21 | struct fb_info *info, | 22 | struct fb_info *info, |
22 | int type, int fb_depth, unsigned long fb_size); | 23 | int type, int fb_depth, unsigned long fb_size); |
23 | int sbusfb_compat_ioctl(struct fb_info *info, unsigned int cmd, | 24 | int sbusfb_compat_ioctl(struct fb_info *info, unsigned int cmd, |
24 | unsigned long arg); | 25 | unsigned long arg); |
25 | 26 | ||
26 | #endif /* _SBUSLIB_H */ | 27 | #endif /* _SBUSLIB_H */ |
diff --git a/drivers/video/sunxvr2500.c b/drivers/video/sunxvr2500.c index c3869a96ab58..b1dde09e7015 100644 --- a/drivers/video/sunxvr2500.c +++ b/drivers/video/sunxvr2500.c | |||
@@ -9,10 +9,9 @@ | |||
9 | #include <linux/fb.h> | 9 | #include <linux/fb.h> |
10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/of_device.h> | ||
12 | 13 | ||
13 | #include <asm/io.h> | 14 | #include <asm/io.h> |
14 | #include <asm/prom.h> | ||
15 | #include <asm/of_device.h> | ||
16 | 15 | ||
17 | struct s3d_info { | 16 | struct s3d_info { |
18 | struct fb_info *info; | 17 | struct fb_info *info; |
diff --git a/drivers/video/sunxvr500.c b/drivers/video/sunxvr500.c index 71bf3f1f00bc..c2ba51b7ea18 100644 --- a/drivers/video/sunxvr500.c +++ b/drivers/video/sunxvr500.c | |||
@@ -9,10 +9,9 @@ | |||
9 | #include <linux/fb.h> | 9 | #include <linux/fb.h> |
10 | #include <linux/pci.h> | 10 | #include <linux/pci.h> |
11 | #include <linux/init.h> | 11 | #include <linux/init.h> |
12 | #include <linux/of_device.h> | ||
12 | 13 | ||
13 | #include <asm/io.h> | 14 | #include <asm/io.h> |
14 | #include <asm/prom.h> | ||
15 | #include <asm/of_device.h> | ||
16 | 15 | ||
17 | /* XXX This device has a 'dev-comm' property which aparently is | 16 | /* XXX This device has a 'dev-comm' property which aparently is |
18 | * XXX a pointer into the openfirmware's address space which is | 17 | * XXX a pointer into the openfirmware's address space which is |
diff --git a/drivers/video/tcx.c b/drivers/video/tcx.c index a71774305772..2a03f78bbb0d 100644 --- a/drivers/video/tcx.c +++ b/drivers/video/tcx.c | |||
@@ -17,10 +17,9 @@ | |||
17 | #include <linux/init.h> | 17 | #include <linux/init.h> |
18 | #include <linux/fb.h> | 18 | #include <linux/fb.h> |
19 | #include <linux/mm.h> | 19 | #include <linux/mm.h> |
20 | #include <linux/of_device.h> | ||
20 | 21 | ||
21 | #include <asm/io.h> | 22 | #include <asm/io.h> |
22 | #include <asm/prom.h> | ||
23 | #include <asm/of_device.h> | ||
24 | #include <asm/fbio.h> | 23 | #include <asm/fbio.h> |
25 | 24 | ||
26 | #include "sbuslib.h" | 25 | #include "sbuslib.h" |
@@ -84,7 +83,7 @@ struct tcx_tec { | |||
84 | 83 | ||
85 | struct tcx_thc { | 84 | struct tcx_thc { |
86 | u32 thc_rev; | 85 | u32 thc_rev; |
87 | u32 thc_pad0[511]; | 86 | u32 thc_pad0[511]; |
88 | u32 thc_hs; /* hsync timing */ | 87 | u32 thc_hs; /* hsync timing */ |
89 | u32 thc_hsdvs; | 88 | u32 thc_hsdvs; |
90 | u32 thc_hd; | 89 | u32 thc_hd; |
@@ -126,10 +125,10 @@ struct tcx_par { | |||
126 | }; | 125 | }; |
127 | 126 | ||
128 | /* Reset control plane so that WID is 8-bit plane. */ | 127 | /* Reset control plane so that WID is 8-bit plane. */ |
129 | static void __tcx_set_control_plane (struct tcx_par *par) | 128 | static void __tcx_set_control_plane(struct tcx_par *par) |
130 | { | 129 | { |
131 | u32 __iomem *p, *pend; | 130 | u32 __iomem *p, *pend; |
132 | 131 | ||
133 | if (par->lowdepth) | 132 | if (par->lowdepth) |
134 | return; | 133 | return; |
135 | 134 | ||
@@ -143,8 +142,8 @@ static void __tcx_set_control_plane (struct tcx_par *par) | |||
143 | sbus_writel(tmp, p); | 142 | sbus_writel(tmp, p); |
144 | } | 143 | } |
145 | } | 144 | } |
146 | 145 | ||
147 | static void tcx_reset (struct fb_info *info) | 146 | static void tcx_reset(struct fb_info *info) |
148 | { | 147 | { |
149 | struct tcx_par *par = (struct tcx_par *) info->par; | 148 | struct tcx_par *par = (struct tcx_par *) info->par; |
150 | unsigned long flags; | 149 | unsigned long flags; |
@@ -365,7 +364,8 @@ static void tcx_unmap_regs(struct of_device *op, struct fb_info *info, | |||
365 | info->screen_base, par->fbsize); | 364 | info->screen_base, par->fbsize); |
366 | } | 365 | } |
367 | 366 | ||
368 | static int __devinit tcx_init_one(struct of_device *op) | 367 | static int __devinit tcx_probe(struct of_device *op, |
368 | const struct of_device_id *match) | ||
369 | { | 369 | { |
370 | struct device_node *dp = op->node; | 370 | struct device_node *dp = op->node; |
371 | struct fb_info *info; | 371 | struct fb_info *info; |
@@ -384,7 +384,7 @@ static int __devinit tcx_init_one(struct of_device *op) | |||
384 | par->lowdepth = | 384 | par->lowdepth = |
385 | (of_find_property(dp, "tcx-8-bit", NULL) != NULL); | 385 | (of_find_property(dp, "tcx-8-bit", NULL) != NULL); |
386 | 386 | ||
387 | sbusfb_fill_var(&info->var, dp->node, 8); | 387 | sbusfb_fill_var(&info->var, dp, 8); |
388 | info->var.red.length = 8; | 388 | info->var.red.length = 8; |
389 | info->var.green.length = 8; | 389 | info->var.green.length = 8; |
390 | info->var.blue.length = 8; | 390 | info->var.blue.length = 8; |
@@ -488,13 +488,6 @@ out_err: | |||
488 | return err; | 488 | return err; |
489 | } | 489 | } |
490 | 490 | ||
491 | static int __devinit tcx_probe(struct of_device *dev, const struct of_device_id *match) | ||
492 | { | ||
493 | struct of_device *op = to_of_device(&dev->dev); | ||
494 | |||
495 | return tcx_init_one(op); | ||
496 | } | ||
497 | |||
498 | static int __devexit tcx_remove(struct of_device *op) | 491 | static int __devexit tcx_remove(struct of_device *op) |
499 | { | 492 | { |
500 | struct fb_info *info = dev_get_drvdata(&op->dev); | 493 | struct fb_info *info = dev_get_drvdata(&op->dev); |
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c index bd54cd0de39a..beefab2992c0 100644 --- a/drivers/video/tridentfb.c +++ b/drivers/video/tridentfb.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #define VERSION "0.7.8-NEWAPI" | 27 | #define VERSION "0.7.8-NEWAPI" |
28 | 28 | ||
29 | struct tridentfb_par { | 29 | struct tridentfb_par { |
30 | int vclk; /* in MHz */ | ||
31 | void __iomem *io_virt; /* iospace virtual memory address */ | 30 | void __iomem *io_virt; /* iospace virtual memory address */ |
32 | }; | 31 | }; |
33 | 32 | ||
@@ -669,27 +668,26 @@ static void set_screen_start(int base) | |||
669 | (read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17)); | 668 | (read3X4(CRTHiOrd) & 0xF8) | ((base & 0xE0000) >> 17)); |
670 | } | 669 | } |
671 | 670 | ||
672 | /* Use 20.12 fixed-point for NTSC value and frequency calculation */ | ||
673 | #define calc_freq(n, m, k) ( ((unsigned long)0xE517 * (n + 8) / ((m + 2) * (1 << k))) >> 12 ) | ||
674 | |||
675 | /* Set dotclock frequency */ | 671 | /* Set dotclock frequency */ |
676 | static void set_vclk(int freq) | 672 | static void set_vclk(unsigned long freq) |
677 | { | 673 | { |
678 | int m, n, k; | 674 | int m, n, k; |
679 | int f, fi, d, di; | 675 | unsigned long f, fi, d, di; |
680 | unsigned char lo = 0, hi = 0; | 676 | unsigned char lo = 0, hi = 0; |
681 | 677 | ||
682 | d = 20; | 678 | d = 20000; |
683 | for (k = 2; k >= 0; k--) | 679 | for (k = 2; k >= 0; k--) |
684 | for (m = 0; m < 63; m++) | 680 | for (m = 0; m < 63; m++) |
685 | for (n = 0; n < 128; n++) { | 681 | for (n = 0; n < 128; n++) { |
686 | fi = calc_freq(n, m, k); | 682 | fi = ((14318l * (n + 8)) / (m + 2)) >> k; |
687 | if ((di = abs(fi - freq)) < d) { | 683 | if ((di = abs(fi - freq)) < d) { |
688 | d = di; | 684 | d = di; |
689 | f = fi; | 685 | f = fi; |
690 | lo = n; | 686 | lo = n; |
691 | hi = (k << 6) | m; | 687 | hi = (k << 6) | m; |
692 | } | 688 | } |
689 | if (fi > freq) | ||
690 | break; | ||
693 | } | 691 | } |
694 | if (chip3D) { | 692 | if (chip3D) { |
695 | write3C4(ClockHigh, hi); | 693 | write3C4(ClockHigh, hi); |
@@ -888,6 +886,8 @@ static int tridentfb_set_par(struct fb_info *info) | |||
888 | struct fb_var_screeninfo *var = &info->var; | 886 | struct fb_var_screeninfo *var = &info->var; |
889 | int bpp = var->bits_per_pixel; | 887 | int bpp = var->bits_per_pixel; |
890 | unsigned char tmp; | 888 | unsigned char tmp; |
889 | unsigned long vclk; | ||
890 | |||
891 | debug("enter\n"); | 891 | debug("enter\n"); |
892 | hdispend = var->xres / 8 - 1; | 892 | hdispend = var->xres / 8 - 1; |
893 | hsyncstart = (var->xres + var->right_margin) / 8; | 893 | hsyncstart = (var->xres + var->right_margin) / 8; |
@@ -905,7 +905,6 @@ static int tridentfb_set_par(struct fb_info *info) | |||
905 | vblankstart = var->yres; | 905 | vblankstart = var->yres; |
906 | vblankend = vtotal + 2; | 906 | vblankend = vtotal + 2; |
907 | 907 | ||
908 | enable_mmio(); | ||
909 | crtc_unlock(); | 908 | crtc_unlock(); |
910 | write3CE(CyberControl, 8); | 909 | write3CE(CyberControl, 8); |
911 | 910 | ||
@@ -1015,11 +1014,11 @@ static int tridentfb_set_par(struct fb_info *info) | |||
1015 | write3X4(Performance, 0x92); | 1014 | write3X4(Performance, 0x92); |
1016 | write3X4(PCIReg, 0x07); /* MMIO & PCI read and write burst enable */ | 1015 | write3X4(PCIReg, 0x07); /* MMIO & PCI read and write burst enable */ |
1017 | 1016 | ||
1018 | /* convert from picoseconds to MHz */ | 1017 | /* convert from picoseconds to kHz */ |
1019 | par->vclk = 1000000 / info->var.pixclock; | 1018 | vclk = PICOS2KHZ(info->var.pixclock); |
1020 | if (bpp == 32) | 1019 | if (bpp == 32) |
1021 | par->vclk *= 2; | 1020 | vclk *= 2; |
1022 | set_vclk(par->vclk); | 1021 | set_vclk(vclk); |
1023 | 1022 | ||
1024 | write3C4(0, 3); | 1023 | write3C4(0, 3); |
1025 | write3C4(1, 1); /* set char clock 8 dots wide */ | 1024 | write3C4(1, 1); /* set char clock 8 dots wide */ |