Commit abe8806901086b6cb29b4d4d4c616bbff3f0e7e1
Committed by
David S. Miller
1 parent
7ad6848c7e
Exists in
master
and in
7 other branches
pcnet_cs: add cis of KTI PE520 pcmcia network card
pcnet_cs,serial_cs: add cis of KTI PE520 pcmcia network card, and serial card(Sierra Wireless AC860). Signed-off-by: Ken Kawasaki <ken_kawasaki@spring.nifty.jp> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 5 changed files with 28 additions and 4 deletions Inline Diff
drivers/net/pcmcia/pcnet_cs.c
1 | /*====================================================================== | 1 | /*====================================================================== |
2 | 2 | ||
3 | A PCMCIA ethernet driver for NS8390-based cards | 3 | A PCMCIA ethernet driver for NS8390-based cards |
4 | 4 | ||
5 | This driver supports the D-Link DE-650 and Linksys EthernetCard | 5 | This driver supports the D-Link DE-650 and Linksys EthernetCard |
6 | cards, the newer D-Link and Linksys combo cards, Accton EN2212 | 6 | cards, the newer D-Link and Linksys combo cards, Accton EN2212 |
7 | cards, the RPTI EP400, and the PreMax PE-200 in non-shared-memory | 7 | cards, the RPTI EP400, and the PreMax PE-200 in non-shared-memory |
8 | mode, and the IBM Credit Card Adapter, the NE4100, the Thomas | 8 | mode, and the IBM Credit Card Adapter, the NE4100, the Thomas |
9 | Conrad ethernet card, and the Kingston KNE-PCM/x in shared-memory | 9 | Conrad ethernet card, and the Kingston KNE-PCM/x in shared-memory |
10 | mode. It will also handle the Socket EA card in either mode. | 10 | mode. It will also handle the Socket EA card in either mode. |
11 | 11 | ||
12 | Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net | 12 | Copyright (C) 1999 David A. Hinds -- dahinds@users.sourceforge.net |
13 | 13 | ||
14 | pcnet_cs.c 1.153 2003/11/09 18:53:09 | 14 | pcnet_cs.c 1.153 2003/11/09 18:53:09 |
15 | 15 | ||
16 | The network driver code is based on Donald Becker's NE2000 code: | 16 | The network driver code is based on Donald Becker's NE2000 code: |
17 | 17 | ||
18 | Written 1992,1993 by Donald Becker. | 18 | Written 1992,1993 by Donald Becker. |
19 | Copyright 1993 United States Government as represented by the | 19 | Copyright 1993 United States Government as represented by the |
20 | Director, National Security Agency. This software may be used and | 20 | Director, National Security Agency. This software may be used and |
21 | distributed according to the terms of the GNU General Public License, | 21 | distributed according to the terms of the GNU General Public License, |
22 | incorporated herein by reference. | 22 | incorporated herein by reference. |
23 | Donald Becker may be reached at becker@scyld.com | 23 | Donald Becker may be reached at becker@scyld.com |
24 | 24 | ||
25 | Based also on Keith Moore's changes to Don Becker's code, for IBM | 25 | Based also on Keith Moore's changes to Don Becker's code, for IBM |
26 | CCAE support. Drivers merged back together, and shared-memory | 26 | CCAE support. Drivers merged back together, and shared-memory |
27 | Socket EA support added, by Ken Raeburn, September 1995. | 27 | Socket EA support added, by Ken Raeburn, September 1995. |
28 | 28 | ||
29 | ======================================================================*/ | 29 | ======================================================================*/ |
30 | 30 | ||
31 | #include <linux/kernel.h> | 31 | #include <linux/kernel.h> |
32 | #include <linux/module.h> | 32 | #include <linux/module.h> |
33 | #include <linux/init.h> | 33 | #include <linux/init.h> |
34 | #include <linux/ptrace.h> | 34 | #include <linux/ptrace.h> |
35 | #include <linux/slab.h> | 35 | #include <linux/slab.h> |
36 | #include <linux/string.h> | 36 | #include <linux/string.h> |
37 | #include <linux/timer.h> | 37 | #include <linux/timer.h> |
38 | #include <linux/delay.h> | 38 | #include <linux/delay.h> |
39 | #include <linux/ethtool.h> | 39 | #include <linux/ethtool.h> |
40 | #include <linux/netdevice.h> | 40 | #include <linux/netdevice.h> |
41 | #include <linux/log2.h> | 41 | #include <linux/log2.h> |
42 | #include <linux/etherdevice.h> | 42 | #include <linux/etherdevice.h> |
43 | #include <linux/mii.h> | 43 | #include <linux/mii.h> |
44 | #include "../8390.h" | 44 | #include "../8390.h" |
45 | 45 | ||
46 | #include <pcmcia/cs_types.h> | 46 | #include <pcmcia/cs_types.h> |
47 | #include <pcmcia/cs.h> | 47 | #include <pcmcia/cs.h> |
48 | #include <pcmcia/cistpl.h> | 48 | #include <pcmcia/cistpl.h> |
49 | #include <pcmcia/ciscode.h> | 49 | #include <pcmcia/ciscode.h> |
50 | #include <pcmcia/ds.h> | 50 | #include <pcmcia/ds.h> |
51 | #include <pcmcia/cisreg.h> | 51 | #include <pcmcia/cisreg.h> |
52 | 52 | ||
53 | #include <asm/io.h> | 53 | #include <asm/io.h> |
54 | #include <asm/system.h> | 54 | #include <asm/system.h> |
55 | #include <asm/byteorder.h> | 55 | #include <asm/byteorder.h> |
56 | #include <asm/uaccess.h> | 56 | #include <asm/uaccess.h> |
57 | 57 | ||
58 | #define PCNET_CMD 0x00 | 58 | #define PCNET_CMD 0x00 |
59 | #define PCNET_DATAPORT 0x10 /* NatSemi-defined port window offset. */ | 59 | #define PCNET_DATAPORT 0x10 /* NatSemi-defined port window offset. */ |
60 | #define PCNET_RESET 0x1f /* Issue a read to reset, a write to clear. */ | 60 | #define PCNET_RESET 0x1f /* Issue a read to reset, a write to clear. */ |
61 | #define PCNET_MISC 0x18 /* For IBM CCAE and Socket EA cards */ | 61 | #define PCNET_MISC 0x18 /* For IBM CCAE and Socket EA cards */ |
62 | 62 | ||
63 | #define PCNET_START_PG 0x40 /* First page of TX buffer */ | 63 | #define PCNET_START_PG 0x40 /* First page of TX buffer */ |
64 | #define PCNET_STOP_PG 0x80 /* Last page +1 of RX ring */ | 64 | #define PCNET_STOP_PG 0x80 /* Last page +1 of RX ring */ |
65 | 65 | ||
66 | /* Socket EA cards have a larger packet buffer */ | 66 | /* Socket EA cards have a larger packet buffer */ |
67 | #define SOCKET_START_PG 0x01 | 67 | #define SOCKET_START_PG 0x01 |
68 | #define SOCKET_STOP_PG 0xff | 68 | #define SOCKET_STOP_PG 0xff |
69 | 69 | ||
70 | #define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */ | 70 | #define PCNET_RDC_TIMEOUT (2*HZ/100) /* Max wait in jiffies for Tx RDC */ |
71 | 71 | ||
72 | static const char *if_names[] = { "auto", "10baseT", "10base2"}; | 72 | static const char *if_names[] = { "auto", "10baseT", "10base2"}; |
73 | 73 | ||
74 | 74 | ||
75 | /*====================================================================*/ | 75 | /*====================================================================*/ |
76 | 76 | ||
77 | /* Module parameters */ | 77 | /* Module parameters */ |
78 | 78 | ||
79 | MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>"); | 79 | MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>"); |
80 | MODULE_DESCRIPTION("NE2000 compatible PCMCIA ethernet driver"); | 80 | MODULE_DESCRIPTION("NE2000 compatible PCMCIA ethernet driver"); |
81 | MODULE_LICENSE("GPL"); | 81 | MODULE_LICENSE("GPL"); |
82 | 82 | ||
83 | #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0) | 83 | #define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0) |
84 | 84 | ||
85 | INT_MODULE_PARM(if_port, 1); /* Transceiver type */ | 85 | INT_MODULE_PARM(if_port, 1); /* Transceiver type */ |
86 | INT_MODULE_PARM(use_big_buf, 1); /* use 64K packet buffer? */ | 86 | INT_MODULE_PARM(use_big_buf, 1); /* use 64K packet buffer? */ |
87 | INT_MODULE_PARM(mem_speed, 0); /* shared mem speed, in ns */ | 87 | INT_MODULE_PARM(mem_speed, 0); /* shared mem speed, in ns */ |
88 | INT_MODULE_PARM(delay_output, 0); /* pause after xmit? */ | 88 | INT_MODULE_PARM(delay_output, 0); /* pause after xmit? */ |
89 | INT_MODULE_PARM(delay_time, 4); /* in usec */ | 89 | INT_MODULE_PARM(delay_time, 4); /* in usec */ |
90 | INT_MODULE_PARM(use_shmem, -1); /* use shared memory? */ | 90 | INT_MODULE_PARM(use_shmem, -1); /* use shared memory? */ |
91 | INT_MODULE_PARM(full_duplex, 0); /* full duplex? */ | 91 | INT_MODULE_PARM(full_duplex, 0); /* full duplex? */ |
92 | 92 | ||
93 | /* Ugh! Let the user hardwire the hardware address for queer cards */ | 93 | /* Ugh! Let the user hardwire the hardware address for queer cards */ |
94 | static int hw_addr[6] = { 0, /* ... */ }; | 94 | static int hw_addr[6] = { 0, /* ... */ }; |
95 | module_param_array(hw_addr, int, NULL, 0); | 95 | module_param_array(hw_addr, int, NULL, 0); |
96 | 96 | ||
97 | /*====================================================================*/ | 97 | /*====================================================================*/ |
98 | 98 | ||
99 | static void mii_phy_probe(struct net_device *dev); | 99 | static void mii_phy_probe(struct net_device *dev); |
100 | static int pcnet_config(struct pcmcia_device *link); | 100 | static int pcnet_config(struct pcmcia_device *link); |
101 | static void pcnet_release(struct pcmcia_device *link); | 101 | static void pcnet_release(struct pcmcia_device *link); |
102 | static int pcnet_open(struct net_device *dev); | 102 | static int pcnet_open(struct net_device *dev); |
103 | static int pcnet_close(struct net_device *dev); | 103 | static int pcnet_close(struct net_device *dev); |
104 | static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); | 104 | static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
105 | static const struct ethtool_ops netdev_ethtool_ops; | 105 | static const struct ethtool_ops netdev_ethtool_ops; |
106 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id); | 106 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id); |
107 | static void ei_watchdog(u_long arg); | 107 | static void ei_watchdog(u_long arg); |
108 | static void pcnet_reset_8390(struct net_device *dev); | 108 | static void pcnet_reset_8390(struct net_device *dev); |
109 | static int set_config(struct net_device *dev, struct ifmap *map); | 109 | static int set_config(struct net_device *dev, struct ifmap *map); |
110 | static int setup_shmem_window(struct pcmcia_device *link, int start_pg, | 110 | static int setup_shmem_window(struct pcmcia_device *link, int start_pg, |
111 | int stop_pg, int cm_offset); | 111 | int stop_pg, int cm_offset); |
112 | static int setup_dma_config(struct pcmcia_device *link, int start_pg, | 112 | static int setup_dma_config(struct pcmcia_device *link, int start_pg, |
113 | int stop_pg); | 113 | int stop_pg); |
114 | 114 | ||
115 | static void pcnet_detach(struct pcmcia_device *p_dev); | 115 | static void pcnet_detach(struct pcmcia_device *p_dev); |
116 | 116 | ||
117 | static dev_info_t dev_info = "pcnet_cs"; | 117 | static dev_info_t dev_info = "pcnet_cs"; |
118 | 118 | ||
119 | /*====================================================================*/ | 119 | /*====================================================================*/ |
120 | 120 | ||
121 | typedef struct hw_info_t { | 121 | typedef struct hw_info_t { |
122 | u_int offset; | 122 | u_int offset; |
123 | u_char a0, a1, a2; | 123 | u_char a0, a1, a2; |
124 | u_int flags; | 124 | u_int flags; |
125 | } hw_info_t; | 125 | } hw_info_t; |
126 | 126 | ||
127 | #define DELAY_OUTPUT 0x01 | 127 | #define DELAY_OUTPUT 0x01 |
128 | #define HAS_MISC_REG 0x02 | 128 | #define HAS_MISC_REG 0x02 |
129 | #define USE_BIG_BUF 0x04 | 129 | #define USE_BIG_BUF 0x04 |
130 | #define HAS_IBM_MISC 0x08 | 130 | #define HAS_IBM_MISC 0x08 |
131 | #define IS_DL10019 0x10 | 131 | #define IS_DL10019 0x10 |
132 | #define IS_DL10022 0x20 | 132 | #define IS_DL10022 0x20 |
133 | #define HAS_MII 0x40 | 133 | #define HAS_MII 0x40 |
134 | #define USE_SHMEM 0x80 /* autodetected */ | 134 | #define USE_SHMEM 0x80 /* autodetected */ |
135 | 135 | ||
136 | #define AM79C9XX_HOME_PHY 0x00006B90 /* HomePNA PHY */ | 136 | #define AM79C9XX_HOME_PHY 0x00006B90 /* HomePNA PHY */ |
137 | #define AM79C9XX_ETH_PHY 0x00006B70 /* 10baseT PHY */ | 137 | #define AM79C9XX_ETH_PHY 0x00006B70 /* 10baseT PHY */ |
138 | #define MII_PHYID_REV_MASK 0xfffffff0 | 138 | #define MII_PHYID_REV_MASK 0xfffffff0 |
139 | #define MII_PHYID_REG1 0x02 | 139 | #define MII_PHYID_REG1 0x02 |
140 | #define MII_PHYID_REG2 0x03 | 140 | #define MII_PHYID_REG2 0x03 |
141 | 141 | ||
142 | static hw_info_t hw_info[] = { | 142 | static hw_info_t hw_info[] = { |
143 | { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, | 143 | { /* Accton EN2212 */ 0x0ff0, 0x00, 0x00, 0xe8, DELAY_OUTPUT }, |
144 | { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 }, | 144 | { /* Allied Telesis LA-PCM */ 0x0ff0, 0x00, 0x00, 0xf4, 0 }, |
145 | { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 }, | 145 | { /* APEX MultiCard */ 0x03f4, 0x00, 0x20, 0xe5, 0 }, |
146 | { /* ASANTE FriendlyNet */ 0x4910, 0x00, 0x00, 0x94, | 146 | { /* ASANTE FriendlyNet */ 0x4910, 0x00, 0x00, 0x94, |
147 | DELAY_OUTPUT | HAS_IBM_MISC }, | 147 | DELAY_OUTPUT | HAS_IBM_MISC }, |
148 | { /* Danpex EN-6200P2 */ 0x0110, 0x00, 0x40, 0xc7, 0 }, | 148 | { /* Danpex EN-6200P2 */ 0x0110, 0x00, 0x40, 0xc7, 0 }, |
149 | { /* DataTrek NetCard */ 0x0ff0, 0x00, 0x20, 0xe8, 0 }, | 149 | { /* DataTrek NetCard */ 0x0ff0, 0x00, 0x20, 0xe8, 0 }, |
150 | { /* Dayna CommuniCard E */ 0x0110, 0x00, 0x80, 0x19, 0 }, | 150 | { /* Dayna CommuniCard E */ 0x0110, 0x00, 0x80, 0x19, 0 }, |
151 | { /* D-Link DE-650 */ 0x0040, 0x00, 0x80, 0xc8, 0 }, | 151 | { /* D-Link DE-650 */ 0x0040, 0x00, 0x80, 0xc8, 0 }, |
152 | { /* EP-210 Ethernet */ 0x0110, 0x00, 0x40, 0x33, 0 }, | 152 | { /* EP-210 Ethernet */ 0x0110, 0x00, 0x40, 0x33, 0 }, |
153 | { /* EP4000 Ethernet */ 0x01c0, 0x00, 0x00, 0xb4, 0 }, | 153 | { /* EP4000 Ethernet */ 0x01c0, 0x00, 0x00, 0xb4, 0 }, |
154 | { /* Epson EEN10B */ 0x0ff0, 0x00, 0x00, 0x48, | 154 | { /* Epson EEN10B */ 0x0ff0, 0x00, 0x00, 0x48, |
155 | HAS_MISC_REG | HAS_IBM_MISC }, | 155 | HAS_MISC_REG | HAS_IBM_MISC }, |
156 | { /* ELECOM Laneed LD-CDWA */ 0xb8, 0x08, 0x00, 0x42, 0 }, | 156 | { /* ELECOM Laneed LD-CDWA */ 0xb8, 0x08, 0x00, 0x42, 0 }, |
157 | { /* Hypertec Ethernet */ 0x01c0, 0x00, 0x40, 0x4c, 0 }, | 157 | { /* Hypertec Ethernet */ 0x01c0, 0x00, 0x40, 0x4c, 0 }, |
158 | { /* IBM CCAE */ 0x0ff0, 0x08, 0x00, 0x5a, | 158 | { /* IBM CCAE */ 0x0ff0, 0x08, 0x00, 0x5a, |
159 | HAS_MISC_REG | HAS_IBM_MISC }, | 159 | HAS_MISC_REG | HAS_IBM_MISC }, |
160 | { /* IBM CCAE */ 0x0ff0, 0x00, 0x04, 0xac, | 160 | { /* IBM CCAE */ 0x0ff0, 0x00, 0x04, 0xac, |
161 | HAS_MISC_REG | HAS_IBM_MISC }, | 161 | HAS_MISC_REG | HAS_IBM_MISC }, |
162 | { /* IBM CCAE */ 0x0ff0, 0x00, 0x06, 0x29, | 162 | { /* IBM CCAE */ 0x0ff0, 0x00, 0x06, 0x29, |
163 | HAS_MISC_REG | HAS_IBM_MISC }, | 163 | HAS_MISC_REG | HAS_IBM_MISC }, |
164 | { /* IBM FME */ 0x0374, 0x08, 0x00, 0x5a, | 164 | { /* IBM FME */ 0x0374, 0x08, 0x00, 0x5a, |
165 | HAS_MISC_REG | HAS_IBM_MISC }, | 165 | HAS_MISC_REG | HAS_IBM_MISC }, |
166 | { /* IBM FME */ 0x0374, 0x00, 0x04, 0xac, | 166 | { /* IBM FME */ 0x0374, 0x00, 0x04, 0xac, |
167 | HAS_MISC_REG | HAS_IBM_MISC }, | 167 | HAS_MISC_REG | HAS_IBM_MISC }, |
168 | { /* Kansai KLA-PCM/T */ 0x0ff0, 0x00, 0x60, 0x87, | 168 | { /* Kansai KLA-PCM/T */ 0x0ff0, 0x00, 0x60, 0x87, |
169 | HAS_MISC_REG | HAS_IBM_MISC }, | 169 | HAS_MISC_REG | HAS_IBM_MISC }, |
170 | { /* NSC DP83903 */ 0x0374, 0x08, 0x00, 0x17, | 170 | { /* NSC DP83903 */ 0x0374, 0x08, 0x00, 0x17, |
171 | HAS_MISC_REG | HAS_IBM_MISC }, | 171 | HAS_MISC_REG | HAS_IBM_MISC }, |
172 | { /* NSC DP83903 */ 0x0374, 0x00, 0xc0, 0xa8, | 172 | { /* NSC DP83903 */ 0x0374, 0x00, 0xc0, 0xa8, |
173 | HAS_MISC_REG | HAS_IBM_MISC }, | 173 | HAS_MISC_REG | HAS_IBM_MISC }, |
174 | { /* NSC DP83903 */ 0x0374, 0x00, 0xa0, 0xb0, | 174 | { /* NSC DP83903 */ 0x0374, 0x00, 0xa0, 0xb0, |
175 | HAS_MISC_REG | HAS_IBM_MISC }, | 175 | HAS_MISC_REG | HAS_IBM_MISC }, |
176 | { /* NSC DP83903 */ 0x0198, 0x00, 0x20, 0xe0, | 176 | { /* NSC DP83903 */ 0x0198, 0x00, 0x20, 0xe0, |
177 | HAS_MISC_REG | HAS_IBM_MISC }, | 177 | HAS_MISC_REG | HAS_IBM_MISC }, |
178 | { /* I-O DATA PCLA/T */ 0x0ff0, 0x00, 0xa0, 0xb0, 0 }, | 178 | { /* I-O DATA PCLA/T */ 0x0ff0, 0x00, 0xa0, 0xb0, 0 }, |
179 | { /* Katron PE-520 */ 0x0110, 0x00, 0x40, 0xf6, 0 }, | 179 | { /* Katron PE-520 */ 0x0110, 0x00, 0x40, 0xf6, 0 }, |
180 | { /* Kingston KNE-PCM/x */ 0x0ff0, 0x00, 0xc0, 0xf0, | 180 | { /* Kingston KNE-PCM/x */ 0x0ff0, 0x00, 0xc0, 0xf0, |
181 | HAS_MISC_REG | HAS_IBM_MISC }, | 181 | HAS_MISC_REG | HAS_IBM_MISC }, |
182 | { /* Kingston KNE-PCM/x */ 0x0ff0, 0xe2, 0x0c, 0x0f, | 182 | { /* Kingston KNE-PCM/x */ 0x0ff0, 0xe2, 0x0c, 0x0f, |
183 | HAS_MISC_REG | HAS_IBM_MISC }, | 183 | HAS_MISC_REG | HAS_IBM_MISC }, |
184 | { /* Kingston KNE-PC2 */ 0x0180, 0x00, 0xc0, 0xf0, 0 }, | 184 | { /* Kingston KNE-PC2 */ 0x0180, 0x00, 0xc0, 0xf0, 0 }, |
185 | { /* Maxtech PCN2000 */ 0x5000, 0x00, 0x00, 0xe8, 0 }, | 185 | { /* Maxtech PCN2000 */ 0x5000, 0x00, 0x00, 0xe8, 0 }, |
186 | { /* NDC Instant-Link */ 0x003a, 0x00, 0x80, 0xc6, 0 }, | 186 | { /* NDC Instant-Link */ 0x003a, 0x00, 0x80, 0xc6, 0 }, |
187 | { /* NE2000 Compatible */ 0x0ff0, 0x00, 0xa0, 0x0c, 0 }, | 187 | { /* NE2000 Compatible */ 0x0ff0, 0x00, 0xa0, 0x0c, 0 }, |
188 | { /* Network General Sniffer */ 0x0ff0, 0x00, 0x00, 0x65, | 188 | { /* Network General Sniffer */ 0x0ff0, 0x00, 0x00, 0x65, |
189 | HAS_MISC_REG | HAS_IBM_MISC }, | 189 | HAS_MISC_REG | HAS_IBM_MISC }, |
190 | { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45, | 190 | { /* Panasonic VEL211 */ 0x0ff0, 0x00, 0x80, 0x45, |
191 | HAS_MISC_REG | HAS_IBM_MISC }, | 191 | HAS_MISC_REG | HAS_IBM_MISC }, |
192 | { /* PreMax PE-200 */ 0x07f0, 0x00, 0x20, 0xe0, 0 }, | 192 | { /* PreMax PE-200 */ 0x07f0, 0x00, 0x20, 0xe0, 0 }, |
193 | { /* RPTI EP400 */ 0x0110, 0x00, 0x40, 0x95, 0 }, | 193 | { /* RPTI EP400 */ 0x0110, 0x00, 0x40, 0x95, 0 }, |
194 | { /* SCM Ethernet */ 0x0ff0, 0x00, 0x20, 0xcb, 0 }, | 194 | { /* SCM Ethernet */ 0x0ff0, 0x00, 0x20, 0xcb, 0 }, |
195 | { /* Socket EA */ 0x4000, 0x00, 0xc0, 0x1b, | 195 | { /* Socket EA */ 0x4000, 0x00, 0xc0, 0x1b, |
196 | DELAY_OUTPUT | HAS_MISC_REG | USE_BIG_BUF }, | 196 | DELAY_OUTPUT | HAS_MISC_REG | USE_BIG_BUF }, |
197 | { /* Socket LP-E CF+ */ 0x01c0, 0x00, 0xc0, 0x1b, 0 }, | 197 | { /* Socket LP-E CF+ */ 0x01c0, 0x00, 0xc0, 0x1b, 0 }, |
198 | { /* SuperSocket RE450T */ 0x0110, 0x00, 0xe0, 0x98, 0 }, | 198 | { /* SuperSocket RE450T */ 0x0110, 0x00, 0xe0, 0x98, 0 }, |
199 | { /* Volktek NPL-402CT */ 0x0060, 0x00, 0x40, 0x05, 0 }, | 199 | { /* Volktek NPL-402CT */ 0x0060, 0x00, 0x40, 0x05, 0 }, |
200 | { /* NEC PC-9801N-J12 */ 0x0ff0, 0x00, 0x00, 0x4c, 0 }, | 200 | { /* NEC PC-9801N-J12 */ 0x0ff0, 0x00, 0x00, 0x4c, 0 }, |
201 | { /* PCMCIA Technology OEM */ 0x01c8, 0x00, 0xa0, 0x0c, 0 } | 201 | { /* PCMCIA Technology OEM */ 0x01c8, 0x00, 0xa0, 0x0c, 0 } |
202 | }; | 202 | }; |
203 | 203 | ||
204 | #define NR_INFO ARRAY_SIZE(hw_info) | 204 | #define NR_INFO ARRAY_SIZE(hw_info) |
205 | 205 | ||
206 | static hw_info_t default_info = { 0, 0, 0, 0, 0 }; | 206 | static hw_info_t default_info = { 0, 0, 0, 0, 0 }; |
207 | static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII }; | 207 | static hw_info_t dl10019_info = { 0, 0, 0, 0, IS_DL10019|HAS_MII }; |
208 | static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII }; | 208 | static hw_info_t dl10022_info = { 0, 0, 0, 0, IS_DL10022|HAS_MII }; |
209 | 209 | ||
210 | typedef struct pcnet_dev_t { | 210 | typedef struct pcnet_dev_t { |
211 | struct pcmcia_device *p_dev; | 211 | struct pcmcia_device *p_dev; |
212 | dev_node_t node; | 212 | dev_node_t node; |
213 | u_int flags; | 213 | u_int flags; |
214 | void __iomem *base; | 214 | void __iomem *base; |
215 | struct timer_list watchdog; | 215 | struct timer_list watchdog; |
216 | int stale, fast_poll; | 216 | int stale, fast_poll; |
217 | u_char phy_id; | 217 | u_char phy_id; |
218 | u_char eth_phy, pna_phy; | 218 | u_char eth_phy, pna_phy; |
219 | u_short link_status; | 219 | u_short link_status; |
220 | u_long mii_reset; | 220 | u_long mii_reset; |
221 | } pcnet_dev_t; | 221 | } pcnet_dev_t; |
222 | 222 | ||
223 | static inline pcnet_dev_t *PRIV(struct net_device *dev) | 223 | static inline pcnet_dev_t *PRIV(struct net_device *dev) |
224 | { | 224 | { |
225 | char *p = netdev_priv(dev); | 225 | char *p = netdev_priv(dev); |
226 | return (pcnet_dev_t *)(p + sizeof(struct ei_device)); | 226 | return (pcnet_dev_t *)(p + sizeof(struct ei_device)); |
227 | } | 227 | } |
228 | 228 | ||
229 | static const struct net_device_ops pcnet_netdev_ops = { | 229 | static const struct net_device_ops pcnet_netdev_ops = { |
230 | .ndo_open = pcnet_open, | 230 | .ndo_open = pcnet_open, |
231 | .ndo_stop = pcnet_close, | 231 | .ndo_stop = pcnet_close, |
232 | .ndo_set_config = set_config, | 232 | .ndo_set_config = set_config, |
233 | .ndo_start_xmit = ei_start_xmit, | 233 | .ndo_start_xmit = ei_start_xmit, |
234 | .ndo_get_stats = ei_get_stats, | 234 | .ndo_get_stats = ei_get_stats, |
235 | .ndo_do_ioctl = ei_ioctl, | 235 | .ndo_do_ioctl = ei_ioctl, |
236 | .ndo_set_multicast_list = ei_set_multicast_list, | 236 | .ndo_set_multicast_list = ei_set_multicast_list, |
237 | .ndo_tx_timeout = ei_tx_timeout, | 237 | .ndo_tx_timeout = ei_tx_timeout, |
238 | .ndo_change_mtu = eth_change_mtu, | 238 | .ndo_change_mtu = eth_change_mtu, |
239 | .ndo_set_mac_address = eth_mac_addr, | 239 | .ndo_set_mac_address = eth_mac_addr, |
240 | .ndo_validate_addr = eth_validate_addr, | 240 | .ndo_validate_addr = eth_validate_addr, |
241 | #ifdef CONFIG_NET_POLL_CONTROLLER | 241 | #ifdef CONFIG_NET_POLL_CONTROLLER |
242 | .ndo_poll_controller = ei_poll, | 242 | .ndo_poll_controller = ei_poll, |
243 | #endif | 243 | #endif |
244 | }; | 244 | }; |
245 | 245 | ||
246 | /*====================================================================== | 246 | /*====================================================================== |
247 | 247 | ||
248 | pcnet_attach() creates an "instance" of the driver, allocating | 248 | pcnet_attach() creates an "instance" of the driver, allocating |
249 | local data structures for one device. The device is registered | 249 | local data structures for one device. The device is registered |
250 | with Card Services. | 250 | with Card Services. |
251 | 251 | ||
252 | ======================================================================*/ | 252 | ======================================================================*/ |
253 | 253 | ||
254 | static int pcnet_probe(struct pcmcia_device *link) | 254 | static int pcnet_probe(struct pcmcia_device *link) |
255 | { | 255 | { |
256 | pcnet_dev_t *info; | 256 | pcnet_dev_t *info; |
257 | struct net_device *dev; | 257 | struct net_device *dev; |
258 | 258 | ||
259 | dev_dbg(&link->dev, "pcnet_attach()\n"); | 259 | dev_dbg(&link->dev, "pcnet_attach()\n"); |
260 | 260 | ||
261 | /* Create new ethernet device */ | 261 | /* Create new ethernet device */ |
262 | dev = __alloc_ei_netdev(sizeof(pcnet_dev_t)); | 262 | dev = __alloc_ei_netdev(sizeof(pcnet_dev_t)); |
263 | if (!dev) return -ENOMEM; | 263 | if (!dev) return -ENOMEM; |
264 | info = PRIV(dev); | 264 | info = PRIV(dev); |
265 | info->p_dev = link; | 265 | info->p_dev = link; |
266 | link->priv = dev; | 266 | link->priv = dev; |
267 | 267 | ||
268 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | 268 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
269 | link->conf.Attributes = CONF_ENABLE_IRQ; | 269 | link->conf.Attributes = CONF_ENABLE_IRQ; |
270 | link->conf.IntType = INT_MEMORY_AND_IO; | 270 | link->conf.IntType = INT_MEMORY_AND_IO; |
271 | 271 | ||
272 | dev->netdev_ops = &pcnet_netdev_ops; | 272 | dev->netdev_ops = &pcnet_netdev_ops; |
273 | 273 | ||
274 | return pcnet_config(link); | 274 | return pcnet_config(link); |
275 | } /* pcnet_attach */ | 275 | } /* pcnet_attach */ |
276 | 276 | ||
277 | /*====================================================================== | 277 | /*====================================================================== |
278 | 278 | ||
279 | This deletes a driver "instance". The device is de-registered | 279 | This deletes a driver "instance". The device is de-registered |
280 | with Card Services. If it has been released, all local data | 280 | with Card Services. If it has been released, all local data |
281 | structures are freed. Otherwise, the structures will be freed | 281 | structures are freed. Otherwise, the structures will be freed |
282 | when the device is released. | 282 | when the device is released. |
283 | 283 | ||
284 | ======================================================================*/ | 284 | ======================================================================*/ |
285 | 285 | ||
286 | static void pcnet_detach(struct pcmcia_device *link) | 286 | static void pcnet_detach(struct pcmcia_device *link) |
287 | { | 287 | { |
288 | struct net_device *dev = link->priv; | 288 | struct net_device *dev = link->priv; |
289 | 289 | ||
290 | dev_dbg(&link->dev, "pcnet_detach\n"); | 290 | dev_dbg(&link->dev, "pcnet_detach\n"); |
291 | 291 | ||
292 | if (link->dev_node) | 292 | if (link->dev_node) |
293 | unregister_netdev(dev); | 293 | unregister_netdev(dev); |
294 | 294 | ||
295 | pcnet_release(link); | 295 | pcnet_release(link); |
296 | 296 | ||
297 | free_netdev(dev); | 297 | free_netdev(dev); |
298 | } /* pcnet_detach */ | 298 | } /* pcnet_detach */ |
299 | 299 | ||
300 | /*====================================================================== | 300 | /*====================================================================== |
301 | 301 | ||
302 | This probes for a card's hardware address, for card types that | 302 | This probes for a card's hardware address, for card types that |
303 | encode this information in their CIS. | 303 | encode this information in their CIS. |
304 | 304 | ||
305 | ======================================================================*/ | 305 | ======================================================================*/ |
306 | 306 | ||
307 | static hw_info_t *get_hwinfo(struct pcmcia_device *link) | 307 | static hw_info_t *get_hwinfo(struct pcmcia_device *link) |
308 | { | 308 | { |
309 | struct net_device *dev = link->priv; | 309 | struct net_device *dev = link->priv; |
310 | win_req_t req; | 310 | win_req_t req; |
311 | memreq_t mem; | 311 | memreq_t mem; |
312 | u_char __iomem *base, *virt; | 312 | u_char __iomem *base, *virt; |
313 | int i, j; | 313 | int i, j; |
314 | 314 | ||
315 | /* Allocate a small memory window */ | 315 | /* Allocate a small memory window */ |
316 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; | 316 | req.Attributes = WIN_DATA_WIDTH_8|WIN_MEMORY_TYPE_AM|WIN_ENABLE; |
317 | req.Base = 0; req.Size = 0; | 317 | req.Base = 0; req.Size = 0; |
318 | req.AccessSpeed = 0; | 318 | req.AccessSpeed = 0; |
319 | i = pcmcia_request_window(link, &req, &link->win); | 319 | i = pcmcia_request_window(link, &req, &link->win); |
320 | if (i != 0) | 320 | if (i != 0) |
321 | return NULL; | 321 | return NULL; |
322 | 322 | ||
323 | virt = ioremap(req.Base, req.Size); | 323 | virt = ioremap(req.Base, req.Size); |
324 | mem.Page = 0; | 324 | mem.Page = 0; |
325 | for (i = 0; i < NR_INFO; i++) { | 325 | for (i = 0; i < NR_INFO; i++) { |
326 | mem.CardOffset = hw_info[i].offset & ~(req.Size-1); | 326 | mem.CardOffset = hw_info[i].offset & ~(req.Size-1); |
327 | pcmcia_map_mem_page(link, link->win, &mem); | 327 | pcmcia_map_mem_page(link, link->win, &mem); |
328 | base = &virt[hw_info[i].offset & (req.Size-1)]; | 328 | base = &virt[hw_info[i].offset & (req.Size-1)]; |
329 | if ((readb(base+0) == hw_info[i].a0) && | 329 | if ((readb(base+0) == hw_info[i].a0) && |
330 | (readb(base+2) == hw_info[i].a1) && | 330 | (readb(base+2) == hw_info[i].a1) && |
331 | (readb(base+4) == hw_info[i].a2)) { | 331 | (readb(base+4) == hw_info[i].a2)) { |
332 | for (j = 0; j < 6; j++) | 332 | for (j = 0; j < 6; j++) |
333 | dev->dev_addr[j] = readb(base + (j<<1)); | 333 | dev->dev_addr[j] = readb(base + (j<<1)); |
334 | break; | 334 | break; |
335 | } | 335 | } |
336 | } | 336 | } |
337 | 337 | ||
338 | iounmap(virt); | 338 | iounmap(virt); |
339 | j = pcmcia_release_window(link, link->win); | 339 | j = pcmcia_release_window(link, link->win); |
340 | return (i < NR_INFO) ? hw_info+i : NULL; | 340 | return (i < NR_INFO) ? hw_info+i : NULL; |
341 | } /* get_hwinfo */ | 341 | } /* get_hwinfo */ |
342 | 342 | ||
343 | /*====================================================================== | 343 | /*====================================================================== |
344 | 344 | ||
345 | This probes for a card's hardware address by reading the PROM. | 345 | This probes for a card's hardware address by reading the PROM. |
346 | It checks the address against a list of known types, then falls | 346 | It checks the address against a list of known types, then falls |
347 | back to a simple NE2000 clone signature check. | 347 | back to a simple NE2000 clone signature check. |
348 | 348 | ||
349 | ======================================================================*/ | 349 | ======================================================================*/ |
350 | 350 | ||
351 | static hw_info_t *get_prom(struct pcmcia_device *link) | 351 | static hw_info_t *get_prom(struct pcmcia_device *link) |
352 | { | 352 | { |
353 | struct net_device *dev = link->priv; | 353 | struct net_device *dev = link->priv; |
354 | unsigned int ioaddr = dev->base_addr; | 354 | unsigned int ioaddr = dev->base_addr; |
355 | u_char prom[32]; | 355 | u_char prom[32]; |
356 | int i, j; | 356 | int i, j; |
357 | 357 | ||
358 | /* This is lifted straight from drivers/net/ne.c */ | 358 | /* This is lifted straight from drivers/net/ne.c */ |
359 | struct { | 359 | struct { |
360 | u_char value, offset; | 360 | u_char value, offset; |
361 | } program_seq[] = { | 361 | } program_seq[] = { |
362 | {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ | 362 | {E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ |
363 | {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */ | 363 | {0x48, EN0_DCFG}, /* Set byte-wide (0x48) access. */ |
364 | {0x00, EN0_RCNTLO}, /* Clear the count regs. */ | 364 | {0x00, EN0_RCNTLO}, /* Clear the count regs. */ |
365 | {0x00, EN0_RCNTHI}, | 365 | {0x00, EN0_RCNTHI}, |
366 | {0x00, EN0_IMR}, /* Mask completion irq. */ | 366 | {0x00, EN0_IMR}, /* Mask completion irq. */ |
367 | {0xFF, EN0_ISR}, | 367 | {0xFF, EN0_ISR}, |
368 | {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */ | 368 | {E8390_RXOFF, EN0_RXCR}, /* 0x20 Set to monitor */ |
369 | {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */ | 369 | {E8390_TXOFF, EN0_TXCR}, /* 0x02 and loopback mode. */ |
370 | {32, EN0_RCNTLO}, | 370 | {32, EN0_RCNTLO}, |
371 | {0x00, EN0_RCNTHI}, | 371 | {0x00, EN0_RCNTHI}, |
372 | {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */ | 372 | {0x00, EN0_RSARLO}, /* DMA starting at 0x0000. */ |
373 | {0x00, EN0_RSARHI}, | 373 | {0x00, EN0_RSARHI}, |
374 | {E8390_RREAD+E8390_START, E8390_CMD}, | 374 | {E8390_RREAD+E8390_START, E8390_CMD}, |
375 | }; | 375 | }; |
376 | 376 | ||
377 | pcnet_reset_8390(dev); | 377 | pcnet_reset_8390(dev); |
378 | mdelay(10); | 378 | mdelay(10); |
379 | 379 | ||
380 | for (i = 0; i < ARRAY_SIZE(program_seq); i++) | 380 | for (i = 0; i < ARRAY_SIZE(program_seq); i++) |
381 | outb_p(program_seq[i].value, ioaddr + program_seq[i].offset); | 381 | outb_p(program_seq[i].value, ioaddr + program_seq[i].offset); |
382 | 382 | ||
383 | for (i = 0; i < 32; i++) | 383 | for (i = 0; i < 32; i++) |
384 | prom[i] = inb(ioaddr + PCNET_DATAPORT); | 384 | prom[i] = inb(ioaddr + PCNET_DATAPORT); |
385 | for (i = 0; i < NR_INFO; i++) { | 385 | for (i = 0; i < NR_INFO; i++) { |
386 | if ((prom[0] == hw_info[i].a0) && | 386 | if ((prom[0] == hw_info[i].a0) && |
387 | (prom[2] == hw_info[i].a1) && | 387 | (prom[2] == hw_info[i].a1) && |
388 | (prom[4] == hw_info[i].a2)) | 388 | (prom[4] == hw_info[i].a2)) |
389 | break; | 389 | break; |
390 | } | 390 | } |
391 | if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) { | 391 | if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) { |
392 | for (j = 0; j < 6; j++) | 392 | for (j = 0; j < 6; j++) |
393 | dev->dev_addr[j] = prom[j<<1]; | 393 | dev->dev_addr[j] = prom[j<<1]; |
394 | return (i < NR_INFO) ? hw_info+i : &default_info; | 394 | return (i < NR_INFO) ? hw_info+i : &default_info; |
395 | } | 395 | } |
396 | return NULL; | 396 | return NULL; |
397 | } /* get_prom */ | 397 | } /* get_prom */ |
398 | 398 | ||
399 | /*====================================================================== | 399 | /*====================================================================== |
400 | 400 | ||
401 | For DL10019 based cards, like the Linksys EtherFast | 401 | For DL10019 based cards, like the Linksys EtherFast |
402 | 402 | ||
403 | ======================================================================*/ | 403 | ======================================================================*/ |
404 | 404 | ||
405 | static hw_info_t *get_dl10019(struct pcmcia_device *link) | 405 | static hw_info_t *get_dl10019(struct pcmcia_device *link) |
406 | { | 406 | { |
407 | struct net_device *dev = link->priv; | 407 | struct net_device *dev = link->priv; |
408 | int i; | 408 | int i; |
409 | u_char sum; | 409 | u_char sum; |
410 | 410 | ||
411 | for (sum = 0, i = 0x14; i < 0x1c; i++) | 411 | for (sum = 0, i = 0x14; i < 0x1c; i++) |
412 | sum += inb_p(dev->base_addr + i); | 412 | sum += inb_p(dev->base_addr + i); |
413 | if (sum != 0xff) | 413 | if (sum != 0xff) |
414 | return NULL; | 414 | return NULL; |
415 | for (i = 0; i < 6; i++) | 415 | for (i = 0; i < 6; i++) |
416 | dev->dev_addr[i] = inb_p(dev->base_addr + 0x14 + i); | 416 | dev->dev_addr[i] = inb_p(dev->base_addr + 0x14 + i); |
417 | i = inb(dev->base_addr + 0x1f); | 417 | i = inb(dev->base_addr + 0x1f); |
418 | return ((i == 0x91)||(i == 0x99)) ? &dl10022_info : &dl10019_info; | 418 | return ((i == 0x91)||(i == 0x99)) ? &dl10022_info : &dl10019_info; |
419 | } | 419 | } |
420 | 420 | ||
421 | /*====================================================================== | 421 | /*====================================================================== |
422 | 422 | ||
423 | For Asix AX88190 based cards | 423 | For Asix AX88190 based cards |
424 | 424 | ||
425 | ======================================================================*/ | 425 | ======================================================================*/ |
426 | 426 | ||
427 | static hw_info_t *get_ax88190(struct pcmcia_device *link) | 427 | static hw_info_t *get_ax88190(struct pcmcia_device *link) |
428 | { | 428 | { |
429 | struct net_device *dev = link->priv; | 429 | struct net_device *dev = link->priv; |
430 | unsigned int ioaddr = dev->base_addr; | 430 | unsigned int ioaddr = dev->base_addr; |
431 | int i, j; | 431 | int i, j; |
432 | 432 | ||
433 | /* Not much of a test, but the alternatives are messy */ | 433 | /* Not much of a test, but the alternatives are messy */ |
434 | if (link->conf.ConfigBase != 0x03c0) | 434 | if (link->conf.ConfigBase != 0x03c0) |
435 | return NULL; | 435 | return NULL; |
436 | 436 | ||
437 | outb_p(0x01, ioaddr + EN0_DCFG); /* Set word-wide access. */ | 437 | outb_p(0x01, ioaddr + EN0_DCFG); /* Set word-wide access. */ |
438 | outb_p(0x00, ioaddr + EN0_RSARLO); /* DMA starting at 0x0400. */ | 438 | outb_p(0x00, ioaddr + EN0_RSARLO); /* DMA starting at 0x0400. */ |
439 | outb_p(0x04, ioaddr + EN0_RSARHI); | 439 | outb_p(0x04, ioaddr + EN0_RSARHI); |
440 | outb_p(E8390_RREAD+E8390_START, ioaddr + E8390_CMD); | 440 | outb_p(E8390_RREAD+E8390_START, ioaddr + E8390_CMD); |
441 | 441 | ||
442 | for (i = 0; i < 6; i += 2) { | 442 | for (i = 0; i < 6; i += 2) { |
443 | j = inw(ioaddr + PCNET_DATAPORT); | 443 | j = inw(ioaddr + PCNET_DATAPORT); |
444 | dev->dev_addr[i] = j & 0xff; | 444 | dev->dev_addr[i] = j & 0xff; |
445 | dev->dev_addr[i+1] = j >> 8; | 445 | dev->dev_addr[i+1] = j >> 8; |
446 | } | 446 | } |
447 | printk(KERN_NOTICE "pcnet_cs: this is an AX88190 card!\n"); | 447 | printk(KERN_NOTICE "pcnet_cs: this is an AX88190 card!\n"); |
448 | printk(KERN_NOTICE "pcnet_cs: use axnet_cs instead.\n"); | 448 | printk(KERN_NOTICE "pcnet_cs: use axnet_cs instead.\n"); |
449 | return NULL; | 449 | return NULL; |
450 | } | 450 | } |
451 | 451 | ||
452 | /*====================================================================== | 452 | /*====================================================================== |
453 | 453 | ||
454 | This should be totally unnecessary... but when we can't figure | 454 | This should be totally unnecessary... but when we can't figure |
455 | out the hardware address any other way, we'll let the user hard | 455 | out the hardware address any other way, we'll let the user hard |
456 | wire it when the module is initialized. | 456 | wire it when the module is initialized. |
457 | 457 | ||
458 | ======================================================================*/ | 458 | ======================================================================*/ |
459 | 459 | ||
460 | static hw_info_t *get_hwired(struct pcmcia_device *link) | 460 | static hw_info_t *get_hwired(struct pcmcia_device *link) |
461 | { | 461 | { |
462 | struct net_device *dev = link->priv; | 462 | struct net_device *dev = link->priv; |
463 | int i; | 463 | int i; |
464 | 464 | ||
465 | for (i = 0; i < 6; i++) | 465 | for (i = 0; i < 6; i++) |
466 | if (hw_addr[i] != 0) break; | 466 | if (hw_addr[i] != 0) break; |
467 | if (i == 6) | 467 | if (i == 6) |
468 | return NULL; | 468 | return NULL; |
469 | 469 | ||
470 | for (i = 0; i < 6; i++) | 470 | for (i = 0; i < 6; i++) |
471 | dev->dev_addr[i] = hw_addr[i]; | 471 | dev->dev_addr[i] = hw_addr[i]; |
472 | 472 | ||
473 | return &default_info; | 473 | return &default_info; |
474 | } /* get_hwired */ | 474 | } /* get_hwired */ |
475 | 475 | ||
476 | /*====================================================================== | 476 | /*====================================================================== |
477 | 477 | ||
478 | pcnet_config() is scheduled to run after a CARD_INSERTION event | 478 | pcnet_config() is scheduled to run after a CARD_INSERTION event |
479 | is received, to configure the PCMCIA socket, and to make the | 479 | is received, to configure the PCMCIA socket, and to make the |
480 | ethernet device available to the system. | 480 | ethernet device available to the system. |
481 | 481 | ||
482 | ======================================================================*/ | 482 | ======================================================================*/ |
483 | 483 | ||
484 | static int try_io_port(struct pcmcia_device *link) | 484 | static int try_io_port(struct pcmcia_device *link) |
485 | { | 485 | { |
486 | int j, ret; | 486 | int j, ret; |
487 | if (link->io.NumPorts1 == 32) { | 487 | if (link->io.NumPorts1 == 32) { |
488 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; | 488 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO; |
489 | if (link->io.NumPorts2 > 0) { | 489 | if (link->io.NumPorts2 > 0) { |
490 | /* for master/slave multifunction cards */ | 490 | /* for master/slave multifunction cards */ |
491 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; | 491 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_8; |
492 | link->irq.Attributes = | 492 | link->irq.Attributes = |
493 | IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; | 493 | IRQ_TYPE_DYNAMIC_SHARING|IRQ_FIRST_SHARED; |
494 | } | 494 | } |
495 | } else { | 495 | } else { |
496 | /* This should be two 16-port windows */ | 496 | /* This should be two 16-port windows */ |
497 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 497 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
498 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; | 498 | link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; |
499 | } | 499 | } |
500 | if (link->io.BasePort1 == 0) { | 500 | if (link->io.BasePort1 == 0) { |
501 | link->io.IOAddrLines = 16; | 501 | link->io.IOAddrLines = 16; |
502 | for (j = 0; j < 0x400; j += 0x20) { | 502 | for (j = 0; j < 0x400; j += 0x20) { |
503 | link->io.BasePort1 = j ^ 0x300; | 503 | link->io.BasePort1 = j ^ 0x300; |
504 | link->io.BasePort2 = (j ^ 0x300) + 0x10; | 504 | link->io.BasePort2 = (j ^ 0x300) + 0x10; |
505 | ret = pcmcia_request_io(link, &link->io); | 505 | ret = pcmcia_request_io(link, &link->io); |
506 | if (ret == 0) | 506 | if (ret == 0) |
507 | return ret; | 507 | return ret; |
508 | } | 508 | } |
509 | return ret; | 509 | return ret; |
510 | } else { | 510 | } else { |
511 | return pcmcia_request_io(link, &link->io); | 511 | return pcmcia_request_io(link, &link->io); |
512 | } | 512 | } |
513 | } | 513 | } |
514 | 514 | ||
515 | static int pcnet_confcheck(struct pcmcia_device *p_dev, | 515 | static int pcnet_confcheck(struct pcmcia_device *p_dev, |
516 | cistpl_cftable_entry_t *cfg, | 516 | cistpl_cftable_entry_t *cfg, |
517 | cistpl_cftable_entry_t *dflt, | 517 | cistpl_cftable_entry_t *dflt, |
518 | unsigned int vcc, | 518 | unsigned int vcc, |
519 | void *priv_data) | 519 | void *priv_data) |
520 | { | 520 | { |
521 | int *has_shmem = priv_data; | 521 | int *has_shmem = priv_data; |
522 | int i; | 522 | int i; |
523 | cistpl_io_t *io = &cfg->io; | 523 | cistpl_io_t *io = &cfg->io; |
524 | 524 | ||
525 | if (cfg->index == 0 || cfg->io.nwin == 0) | 525 | if (cfg->index == 0 || cfg->io.nwin == 0) |
526 | return -EINVAL; | 526 | return -EINVAL; |
527 | 527 | ||
528 | /* For multifunction cards, by convention, we configure the | 528 | /* For multifunction cards, by convention, we configure the |
529 | network function with window 0, and serial with window 1 */ | 529 | network function with window 0, and serial with window 1 */ |
530 | if (io->nwin > 1) { | 530 | if (io->nwin > 1) { |
531 | i = (io->win[1].len > io->win[0].len); | 531 | i = (io->win[1].len > io->win[0].len); |
532 | p_dev->io.BasePort2 = io->win[1-i].base; | 532 | p_dev->io.BasePort2 = io->win[1-i].base; |
533 | p_dev->io.NumPorts2 = io->win[1-i].len; | 533 | p_dev->io.NumPorts2 = io->win[1-i].len; |
534 | } else { | 534 | } else { |
535 | i = p_dev->io.NumPorts2 = 0; | 535 | i = p_dev->io.NumPorts2 = 0; |
536 | } | 536 | } |
537 | 537 | ||
538 | *has_shmem = ((cfg->mem.nwin == 1) && | 538 | *has_shmem = ((cfg->mem.nwin == 1) && |
539 | (cfg->mem.win[0].len >= 0x4000)); | 539 | (cfg->mem.win[0].len >= 0x4000)); |
540 | p_dev->io.BasePort1 = io->win[i].base; | 540 | p_dev->io.BasePort1 = io->win[i].base; |
541 | p_dev->io.NumPorts1 = io->win[i].len; | 541 | p_dev->io.NumPorts1 = io->win[i].len; |
542 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; | 542 | p_dev->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK; |
543 | if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32) | 543 | if (p_dev->io.NumPorts1 + p_dev->io.NumPorts2 >= 32) |
544 | return try_io_port(p_dev); | 544 | return try_io_port(p_dev); |
545 | 545 | ||
546 | return 0; | 546 | return 0; |
547 | } | 547 | } |
548 | 548 | ||
549 | static int pcnet_config(struct pcmcia_device *link) | 549 | static int pcnet_config(struct pcmcia_device *link) |
550 | { | 550 | { |
551 | struct net_device *dev = link->priv; | 551 | struct net_device *dev = link->priv; |
552 | pcnet_dev_t *info = PRIV(dev); | 552 | pcnet_dev_t *info = PRIV(dev); |
553 | int ret, start_pg, stop_pg, cm_offset; | 553 | int ret, start_pg, stop_pg, cm_offset; |
554 | int has_shmem = 0; | 554 | int has_shmem = 0; |
555 | hw_info_t *local_hw_info; | 555 | hw_info_t *local_hw_info; |
556 | 556 | ||
557 | dev_dbg(&link->dev, "pcnet_config\n"); | 557 | dev_dbg(&link->dev, "pcnet_config\n"); |
558 | 558 | ||
559 | ret = pcmcia_loop_config(link, pcnet_confcheck, &has_shmem); | 559 | ret = pcmcia_loop_config(link, pcnet_confcheck, &has_shmem); |
560 | if (ret) | 560 | if (ret) |
561 | goto failed; | 561 | goto failed; |
562 | 562 | ||
563 | ret = pcmcia_request_irq(link, &link->irq); | 563 | ret = pcmcia_request_irq(link, &link->irq); |
564 | if (ret) | 564 | if (ret) |
565 | goto failed; | 565 | goto failed; |
566 | 566 | ||
567 | if (link->io.NumPorts2 == 8) { | 567 | if (link->io.NumPorts2 == 8) { |
568 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 568 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
569 | link->conf.Status = CCSR_AUDIO_ENA; | 569 | link->conf.Status = CCSR_AUDIO_ENA; |
570 | } | 570 | } |
571 | if ((link->manf_id == MANFID_IBM) && | 571 | if ((link->manf_id == MANFID_IBM) && |
572 | (link->card_id == PRODID_IBM_HOME_AND_AWAY)) | 572 | (link->card_id == PRODID_IBM_HOME_AND_AWAY)) |
573 | link->conf.ConfigIndex |= 0x10; | 573 | link->conf.ConfigIndex |= 0x10; |
574 | 574 | ||
575 | ret = pcmcia_request_configuration(link, &link->conf); | 575 | ret = pcmcia_request_configuration(link, &link->conf); |
576 | if (ret) | 576 | if (ret) |
577 | goto failed; | 577 | goto failed; |
578 | dev->irq = link->irq.AssignedIRQ; | 578 | dev->irq = link->irq.AssignedIRQ; |
579 | dev->base_addr = link->io.BasePort1; | 579 | dev->base_addr = link->io.BasePort1; |
580 | if (info->flags & HAS_MISC_REG) { | 580 | if (info->flags & HAS_MISC_REG) { |
581 | if ((if_port == 1) || (if_port == 2)) | 581 | if ((if_port == 1) || (if_port == 2)) |
582 | dev->if_port = if_port; | 582 | dev->if_port = if_port; |
583 | else | 583 | else |
584 | printk(KERN_NOTICE "pcnet_cs: invalid if_port requested\n"); | 584 | printk(KERN_NOTICE "pcnet_cs: invalid if_port requested\n"); |
585 | } else { | 585 | } else { |
586 | dev->if_port = 0; | 586 | dev->if_port = 0; |
587 | } | 587 | } |
588 | 588 | ||
589 | if ((link->conf.ConfigBase == 0x03c0) && | 589 | if ((link->conf.ConfigBase == 0x03c0) && |
590 | (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) { | 590 | (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) { |
591 | printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n"); | 591 | printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n"); |
592 | printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n"); | 592 | printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n"); |
593 | goto failed; | 593 | goto failed; |
594 | } | 594 | } |
595 | 595 | ||
596 | local_hw_info = get_hwinfo(link); | 596 | local_hw_info = get_hwinfo(link); |
597 | if (local_hw_info == NULL) | 597 | if (local_hw_info == NULL) |
598 | local_hw_info = get_prom(link); | 598 | local_hw_info = get_prom(link); |
599 | if (local_hw_info == NULL) | 599 | if (local_hw_info == NULL) |
600 | local_hw_info = get_dl10019(link); | 600 | local_hw_info = get_dl10019(link); |
601 | if (local_hw_info == NULL) | 601 | if (local_hw_info == NULL) |
602 | local_hw_info = get_ax88190(link); | 602 | local_hw_info = get_ax88190(link); |
603 | if (local_hw_info == NULL) | 603 | if (local_hw_info == NULL) |
604 | local_hw_info = get_hwired(link); | 604 | local_hw_info = get_hwired(link); |
605 | 605 | ||
606 | if (local_hw_info == NULL) { | 606 | if (local_hw_info == NULL) { |
607 | printk(KERN_NOTICE "pcnet_cs: unable to read hardware net" | 607 | printk(KERN_NOTICE "pcnet_cs: unable to read hardware net" |
608 | " address for io base %#3lx\n", dev->base_addr); | 608 | " address for io base %#3lx\n", dev->base_addr); |
609 | goto failed; | 609 | goto failed; |
610 | } | 610 | } |
611 | 611 | ||
612 | info->flags = local_hw_info->flags; | 612 | info->flags = local_hw_info->flags; |
613 | /* Check for user overrides */ | 613 | /* Check for user overrides */ |
614 | info->flags |= (delay_output) ? DELAY_OUTPUT : 0; | 614 | info->flags |= (delay_output) ? DELAY_OUTPUT : 0; |
615 | if ((link->manf_id == MANFID_SOCKET) && | 615 | if ((link->manf_id == MANFID_SOCKET) && |
616 | ((link->card_id == PRODID_SOCKET_LPE) || | 616 | ((link->card_id == PRODID_SOCKET_LPE) || |
617 | (link->card_id == PRODID_SOCKET_LPE_CF) || | 617 | (link->card_id == PRODID_SOCKET_LPE_CF) || |
618 | (link->card_id == PRODID_SOCKET_EIO))) | 618 | (link->card_id == PRODID_SOCKET_EIO))) |
619 | info->flags &= ~USE_BIG_BUF; | 619 | info->flags &= ~USE_BIG_BUF; |
620 | if (!use_big_buf) | 620 | if (!use_big_buf) |
621 | info->flags &= ~USE_BIG_BUF; | 621 | info->flags &= ~USE_BIG_BUF; |
622 | 622 | ||
623 | if (info->flags & USE_BIG_BUF) { | 623 | if (info->flags & USE_BIG_BUF) { |
624 | start_pg = SOCKET_START_PG; | 624 | start_pg = SOCKET_START_PG; |
625 | stop_pg = SOCKET_STOP_PG; | 625 | stop_pg = SOCKET_STOP_PG; |
626 | cm_offset = 0x10000; | 626 | cm_offset = 0x10000; |
627 | } else { | 627 | } else { |
628 | start_pg = PCNET_START_PG; | 628 | start_pg = PCNET_START_PG; |
629 | stop_pg = PCNET_STOP_PG; | 629 | stop_pg = PCNET_STOP_PG; |
630 | cm_offset = 0; | 630 | cm_offset = 0; |
631 | } | 631 | } |
632 | 632 | ||
633 | /* has_shmem is ignored if use_shmem != -1 */ | 633 | /* has_shmem is ignored if use_shmem != -1 */ |
634 | if ((use_shmem == 0) || (!has_shmem && (use_shmem == -1)) || | 634 | if ((use_shmem == 0) || (!has_shmem && (use_shmem == -1)) || |
635 | (setup_shmem_window(link, start_pg, stop_pg, cm_offset) != 0)) | 635 | (setup_shmem_window(link, start_pg, stop_pg, cm_offset) != 0)) |
636 | setup_dma_config(link, start_pg, stop_pg); | 636 | setup_dma_config(link, start_pg, stop_pg); |
637 | 637 | ||
638 | ei_status.name = "NE2000"; | 638 | ei_status.name = "NE2000"; |
639 | ei_status.word16 = 1; | 639 | ei_status.word16 = 1; |
640 | ei_status.reset_8390 = &pcnet_reset_8390; | 640 | ei_status.reset_8390 = &pcnet_reset_8390; |
641 | 641 | ||
642 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); | 642 | SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); |
643 | 643 | ||
644 | if (info->flags & (IS_DL10019|IS_DL10022)) | 644 | if (info->flags & (IS_DL10019|IS_DL10022)) |
645 | mii_phy_probe(dev); | 645 | mii_phy_probe(dev); |
646 | 646 | ||
647 | link->dev_node = &info->node; | 647 | link->dev_node = &info->node; |
648 | SET_NETDEV_DEV(dev, &link->dev); | 648 | SET_NETDEV_DEV(dev, &link->dev); |
649 | 649 | ||
650 | if (register_netdev(dev) != 0) { | 650 | if (register_netdev(dev) != 0) { |
651 | printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n"); | 651 | printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n"); |
652 | link->dev_node = NULL; | 652 | link->dev_node = NULL; |
653 | goto failed; | 653 | goto failed; |
654 | } | 654 | } |
655 | 655 | ||
656 | strcpy(info->node.dev_name, dev->name); | 656 | strcpy(info->node.dev_name, dev->name); |
657 | 657 | ||
658 | if (info->flags & (IS_DL10019|IS_DL10022)) { | 658 | if (info->flags & (IS_DL10019|IS_DL10022)) { |
659 | u_char id = inb(dev->base_addr + 0x1a); | 659 | u_char id = inb(dev->base_addr + 0x1a); |
660 | printk(KERN_INFO "%s: NE2000 (DL100%d rev %02x): ", | 660 | printk(KERN_INFO "%s: NE2000 (DL100%d rev %02x): ", |
661 | dev->name, ((info->flags & IS_DL10022) ? 22 : 19), id); | 661 | dev->name, ((info->flags & IS_DL10022) ? 22 : 19), id); |
662 | if (info->pna_phy) | 662 | if (info->pna_phy) |
663 | printk("PNA, "); | 663 | printk("PNA, "); |
664 | } else { | 664 | } else { |
665 | printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name); | 665 | printk(KERN_INFO "%s: NE2000 Compatible: ", dev->name); |
666 | } | 666 | } |
667 | printk("io %#3lx, irq %d,", dev->base_addr, dev->irq); | 667 | printk("io %#3lx, irq %d,", dev->base_addr, dev->irq); |
668 | if (info->flags & USE_SHMEM) | 668 | if (info->flags & USE_SHMEM) |
669 | printk (" mem %#5lx,", dev->mem_start); | 669 | printk (" mem %#5lx,", dev->mem_start); |
670 | if (info->flags & HAS_MISC_REG) | 670 | if (info->flags & HAS_MISC_REG) |
671 | printk(" %s xcvr,", if_names[dev->if_port]); | 671 | printk(" %s xcvr,", if_names[dev->if_port]); |
672 | printk(" hw_addr %pM\n", dev->dev_addr); | 672 | printk(" hw_addr %pM\n", dev->dev_addr); |
673 | return 0; | 673 | return 0; |
674 | 674 | ||
675 | failed: | 675 | failed: |
676 | pcnet_release(link); | 676 | pcnet_release(link); |
677 | return -ENODEV; | 677 | return -ENODEV; |
678 | } /* pcnet_config */ | 678 | } /* pcnet_config */ |
679 | 679 | ||
680 | /*====================================================================== | 680 | /*====================================================================== |
681 | 681 | ||
682 | After a card is removed, pcnet_release() will unregister the net | 682 | After a card is removed, pcnet_release() will unregister the net |
683 | device, and release the PCMCIA configuration. If the device is | 683 | device, and release the PCMCIA configuration. If the device is |
684 | still open, this will be postponed until it is closed. | 684 | still open, this will be postponed until it is closed. |
685 | 685 | ||
686 | ======================================================================*/ | 686 | ======================================================================*/ |
687 | 687 | ||
688 | static void pcnet_release(struct pcmcia_device *link) | 688 | static void pcnet_release(struct pcmcia_device *link) |
689 | { | 689 | { |
690 | pcnet_dev_t *info = PRIV(link->priv); | 690 | pcnet_dev_t *info = PRIV(link->priv); |
691 | 691 | ||
692 | dev_dbg(&link->dev, "pcnet_release\n"); | 692 | dev_dbg(&link->dev, "pcnet_release\n"); |
693 | 693 | ||
694 | if (info->flags & USE_SHMEM) | 694 | if (info->flags & USE_SHMEM) |
695 | iounmap(info->base); | 695 | iounmap(info->base); |
696 | 696 | ||
697 | pcmcia_disable_device(link); | 697 | pcmcia_disable_device(link); |
698 | } | 698 | } |
699 | 699 | ||
700 | /*====================================================================== | 700 | /*====================================================================== |
701 | 701 | ||
702 | The card status event handler. Mostly, this schedules other | 702 | The card status event handler. Mostly, this schedules other |
703 | stuff to run after an event is received. A CARD_REMOVAL event | 703 | stuff to run after an event is received. A CARD_REMOVAL event |
704 | also sets some flags to discourage the net drivers from trying | 704 | also sets some flags to discourage the net drivers from trying |
705 | to talk to the card any more. | 705 | to talk to the card any more. |
706 | 706 | ||
707 | ======================================================================*/ | 707 | ======================================================================*/ |
708 | 708 | ||
709 | static int pcnet_suspend(struct pcmcia_device *link) | 709 | static int pcnet_suspend(struct pcmcia_device *link) |
710 | { | 710 | { |
711 | struct net_device *dev = link->priv; | 711 | struct net_device *dev = link->priv; |
712 | 712 | ||
713 | if (link->open) | 713 | if (link->open) |
714 | netif_device_detach(dev); | 714 | netif_device_detach(dev); |
715 | 715 | ||
716 | return 0; | 716 | return 0; |
717 | } | 717 | } |
718 | 718 | ||
719 | static int pcnet_resume(struct pcmcia_device *link) | 719 | static int pcnet_resume(struct pcmcia_device *link) |
720 | { | 720 | { |
721 | struct net_device *dev = link->priv; | 721 | struct net_device *dev = link->priv; |
722 | 722 | ||
723 | if (link->open) { | 723 | if (link->open) { |
724 | pcnet_reset_8390(dev); | 724 | pcnet_reset_8390(dev); |
725 | NS8390_init(dev, 1); | 725 | NS8390_init(dev, 1); |
726 | netif_device_attach(dev); | 726 | netif_device_attach(dev); |
727 | } | 727 | } |
728 | 728 | ||
729 | return 0; | 729 | return 0; |
730 | } | 730 | } |
731 | 731 | ||
732 | 732 | ||
733 | /*====================================================================== | 733 | /*====================================================================== |
734 | 734 | ||
735 | MII interface support for DL10019 and DL10022 based cards | 735 | MII interface support for DL10019 and DL10022 based cards |
736 | 736 | ||
737 | On the DL10019, the MII IO direction bit is 0x10; on the DL10022 | 737 | On the DL10019, the MII IO direction bit is 0x10; on the DL10022 |
738 | it is 0x20. Setting both bits seems to work on both card types. | 738 | it is 0x20. Setting both bits seems to work on both card types. |
739 | 739 | ||
740 | ======================================================================*/ | 740 | ======================================================================*/ |
741 | 741 | ||
742 | #define DLINK_GPIO 0x1c | 742 | #define DLINK_GPIO 0x1c |
743 | #define DLINK_DIAG 0x1d | 743 | #define DLINK_DIAG 0x1d |
744 | #define DLINK_EEPROM 0x1e | 744 | #define DLINK_EEPROM 0x1e |
745 | 745 | ||
746 | #define MDIO_SHIFT_CLK 0x80 | 746 | #define MDIO_SHIFT_CLK 0x80 |
747 | #define MDIO_DATA_OUT 0x40 | 747 | #define MDIO_DATA_OUT 0x40 |
748 | #define MDIO_DIR_WRITE 0x30 | 748 | #define MDIO_DIR_WRITE 0x30 |
749 | #define MDIO_DATA_WRITE0 (MDIO_DIR_WRITE) | 749 | #define MDIO_DATA_WRITE0 (MDIO_DIR_WRITE) |
750 | #define MDIO_DATA_WRITE1 (MDIO_DIR_WRITE | MDIO_DATA_OUT) | 750 | #define MDIO_DATA_WRITE1 (MDIO_DIR_WRITE | MDIO_DATA_OUT) |
751 | #define MDIO_DATA_READ 0x10 | 751 | #define MDIO_DATA_READ 0x10 |
752 | #define MDIO_MASK 0x0f | 752 | #define MDIO_MASK 0x0f |
753 | 753 | ||
754 | static void mdio_sync(unsigned int addr) | 754 | static void mdio_sync(unsigned int addr) |
755 | { | 755 | { |
756 | int bits, mask = inb(addr) & MDIO_MASK; | 756 | int bits, mask = inb(addr) & MDIO_MASK; |
757 | for (bits = 0; bits < 32; bits++) { | 757 | for (bits = 0; bits < 32; bits++) { |
758 | outb(mask | MDIO_DATA_WRITE1, addr); | 758 | outb(mask | MDIO_DATA_WRITE1, addr); |
759 | outb(mask | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr); | 759 | outb(mask | MDIO_DATA_WRITE1 | MDIO_SHIFT_CLK, addr); |
760 | } | 760 | } |
761 | } | 761 | } |
762 | 762 | ||
763 | static int mdio_read(unsigned int addr, int phy_id, int loc) | 763 | static int mdio_read(unsigned int addr, int phy_id, int loc) |
764 | { | 764 | { |
765 | u_int cmd = (0x06<<10)|(phy_id<<5)|loc; | 765 | u_int cmd = (0x06<<10)|(phy_id<<5)|loc; |
766 | int i, retval = 0, mask = inb(addr) & MDIO_MASK; | 766 | int i, retval = 0, mask = inb(addr) & MDIO_MASK; |
767 | 767 | ||
768 | mdio_sync(addr); | 768 | mdio_sync(addr); |
769 | for (i = 13; i >= 0; i--) { | 769 | for (i = 13; i >= 0; i--) { |
770 | int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0; | 770 | int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0; |
771 | outb(mask | dat, addr); | 771 | outb(mask | dat, addr); |
772 | outb(mask | dat | MDIO_SHIFT_CLK, addr); | 772 | outb(mask | dat | MDIO_SHIFT_CLK, addr); |
773 | } | 773 | } |
774 | for (i = 19; i > 0; i--) { | 774 | for (i = 19; i > 0; i--) { |
775 | outb(mask, addr); | 775 | outb(mask, addr); |
776 | retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0); | 776 | retval = (retval << 1) | ((inb(addr) & MDIO_DATA_READ) != 0); |
777 | outb(mask | MDIO_SHIFT_CLK, addr); | 777 | outb(mask | MDIO_SHIFT_CLK, addr); |
778 | } | 778 | } |
779 | return (retval>>1) & 0xffff; | 779 | return (retval>>1) & 0xffff; |
780 | } | 780 | } |
781 | 781 | ||
782 | static void mdio_write(unsigned int addr, int phy_id, int loc, int value) | 782 | static void mdio_write(unsigned int addr, int phy_id, int loc, int value) |
783 | { | 783 | { |
784 | u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value; | 784 | u_int cmd = (0x05<<28)|(phy_id<<23)|(loc<<18)|(1<<17)|value; |
785 | int i, mask = inb(addr) & MDIO_MASK; | 785 | int i, mask = inb(addr) & MDIO_MASK; |
786 | 786 | ||
787 | mdio_sync(addr); | 787 | mdio_sync(addr); |
788 | for (i = 31; i >= 0; i--) { | 788 | for (i = 31; i >= 0; i--) { |
789 | int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0; | 789 | int dat = (cmd&(1<<i)) ? MDIO_DATA_WRITE1 : MDIO_DATA_WRITE0; |
790 | outb(mask | dat, addr); | 790 | outb(mask | dat, addr); |
791 | outb(mask | dat | MDIO_SHIFT_CLK, addr); | 791 | outb(mask | dat | MDIO_SHIFT_CLK, addr); |
792 | } | 792 | } |
793 | for (i = 1; i >= 0; i--) { | 793 | for (i = 1; i >= 0; i--) { |
794 | outb(mask, addr); | 794 | outb(mask, addr); |
795 | outb(mask | MDIO_SHIFT_CLK, addr); | 795 | outb(mask | MDIO_SHIFT_CLK, addr); |
796 | } | 796 | } |
797 | } | 797 | } |
798 | 798 | ||
799 | /*====================================================================== | 799 | /*====================================================================== |
800 | 800 | ||
801 | EEPROM access routines for DL10019 and DL10022 based cards | 801 | EEPROM access routines for DL10019 and DL10022 based cards |
802 | 802 | ||
803 | ======================================================================*/ | 803 | ======================================================================*/ |
804 | 804 | ||
805 | #define EE_EEP 0x40 | 805 | #define EE_EEP 0x40 |
806 | #define EE_ASIC 0x10 | 806 | #define EE_ASIC 0x10 |
807 | #define EE_CS 0x08 | 807 | #define EE_CS 0x08 |
808 | #define EE_CK 0x04 | 808 | #define EE_CK 0x04 |
809 | #define EE_DO 0x02 | 809 | #define EE_DO 0x02 |
810 | #define EE_DI 0x01 | 810 | #define EE_DI 0x01 |
811 | #define EE_ADOT 0x01 /* DataOut for ASIC */ | 811 | #define EE_ADOT 0x01 /* DataOut for ASIC */ |
812 | #define EE_READ_CMD 0x06 | 812 | #define EE_READ_CMD 0x06 |
813 | 813 | ||
814 | #define DL19FDUPLX 0x0400 /* DL10019 Full duplex mode */ | 814 | #define DL19FDUPLX 0x0400 /* DL10019 Full duplex mode */ |
815 | 815 | ||
816 | static int read_eeprom(unsigned int ioaddr, int location) | 816 | static int read_eeprom(unsigned int ioaddr, int location) |
817 | { | 817 | { |
818 | int i, retval = 0; | 818 | int i, retval = 0; |
819 | unsigned int ee_addr = ioaddr + DLINK_EEPROM; | 819 | unsigned int ee_addr = ioaddr + DLINK_EEPROM; |
820 | int read_cmd = location | (EE_READ_CMD << 8); | 820 | int read_cmd = location | (EE_READ_CMD << 8); |
821 | 821 | ||
822 | outb(0, ee_addr); | 822 | outb(0, ee_addr); |
823 | outb(EE_EEP|EE_CS, ee_addr); | 823 | outb(EE_EEP|EE_CS, ee_addr); |
824 | 824 | ||
825 | /* Shift the read command bits out. */ | 825 | /* Shift the read command bits out. */ |
826 | for (i = 10; i >= 0; i--) { | 826 | for (i = 10; i >= 0; i--) { |
827 | short dataval = (read_cmd & (1 << i)) ? EE_DO : 0; | 827 | short dataval = (read_cmd & (1 << i)) ? EE_DO : 0; |
828 | outb_p(EE_EEP|EE_CS|dataval, ee_addr); | 828 | outb_p(EE_EEP|EE_CS|dataval, ee_addr); |
829 | outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr); | 829 | outb_p(EE_EEP|EE_CS|dataval|EE_CK, ee_addr); |
830 | } | 830 | } |
831 | outb(EE_EEP|EE_CS, ee_addr); | 831 | outb(EE_EEP|EE_CS, ee_addr); |
832 | 832 | ||
833 | for (i = 16; i > 0; i--) { | 833 | for (i = 16; i > 0; i--) { |
834 | outb_p(EE_EEP|EE_CS | EE_CK, ee_addr); | 834 | outb_p(EE_EEP|EE_CS | EE_CK, ee_addr); |
835 | retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0); | 835 | retval = (retval << 1) | ((inb(ee_addr) & EE_DI) ? 1 : 0); |
836 | outb_p(EE_EEP|EE_CS, ee_addr); | 836 | outb_p(EE_EEP|EE_CS, ee_addr); |
837 | } | 837 | } |
838 | 838 | ||
839 | /* Terminate the EEPROM access. */ | 839 | /* Terminate the EEPROM access. */ |
840 | outb(0, ee_addr); | 840 | outb(0, ee_addr); |
841 | return retval; | 841 | return retval; |
842 | } | 842 | } |
843 | 843 | ||
844 | /* | 844 | /* |
845 | The internal ASIC registers can be changed by EEPROM READ access | 845 | The internal ASIC registers can be changed by EEPROM READ access |
846 | with EE_ASIC bit set. | 846 | with EE_ASIC bit set. |
847 | In ASIC mode, EE_ADOT is used to output the data to the ASIC. | 847 | In ASIC mode, EE_ADOT is used to output the data to the ASIC. |
848 | */ | 848 | */ |
849 | 849 | ||
850 | static void write_asic(unsigned int ioaddr, int location, short asic_data) | 850 | static void write_asic(unsigned int ioaddr, int location, short asic_data) |
851 | { | 851 | { |
852 | int i; | 852 | int i; |
853 | unsigned int ee_addr = ioaddr + DLINK_EEPROM; | 853 | unsigned int ee_addr = ioaddr + DLINK_EEPROM; |
854 | short dataval; | 854 | short dataval; |
855 | int read_cmd = location | (EE_READ_CMD << 8); | 855 | int read_cmd = location | (EE_READ_CMD << 8); |
856 | 856 | ||
857 | asic_data |= read_eeprom(ioaddr, location); | 857 | asic_data |= read_eeprom(ioaddr, location); |
858 | 858 | ||
859 | outb(0, ee_addr); | 859 | outb(0, ee_addr); |
860 | outb(EE_ASIC|EE_CS|EE_DI, ee_addr); | 860 | outb(EE_ASIC|EE_CS|EE_DI, ee_addr); |
861 | 861 | ||
862 | read_cmd = read_cmd >> 1; | 862 | read_cmd = read_cmd >> 1; |
863 | 863 | ||
864 | /* Shift the read command bits out. */ | 864 | /* Shift the read command bits out. */ |
865 | for (i = 9; i >= 0; i--) { | 865 | for (i = 9; i >= 0; i--) { |
866 | dataval = (read_cmd & (1 << i)) ? EE_DO : 0; | 866 | dataval = (read_cmd & (1 << i)) ? EE_DO : 0; |
867 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr); | 867 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr); |
868 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr); | 868 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval|EE_CK, ee_addr); |
869 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr); | 869 | outb_p(EE_ASIC|EE_CS|EE_DI|dataval, ee_addr); |
870 | } | 870 | } |
871 | // sync | 871 | // sync |
872 | outb(EE_ASIC|EE_CS, ee_addr); | 872 | outb(EE_ASIC|EE_CS, ee_addr); |
873 | outb(EE_ASIC|EE_CS|EE_CK, ee_addr); | 873 | outb(EE_ASIC|EE_CS|EE_CK, ee_addr); |
874 | outb(EE_ASIC|EE_CS, ee_addr); | 874 | outb(EE_ASIC|EE_CS, ee_addr); |
875 | 875 | ||
876 | for (i = 15; i >= 0; i--) { | 876 | for (i = 15; i >= 0; i--) { |
877 | dataval = (asic_data & (1 << i)) ? EE_ADOT : 0; | 877 | dataval = (asic_data & (1 << i)) ? EE_ADOT : 0; |
878 | outb_p(EE_ASIC|EE_CS|dataval, ee_addr); | 878 | outb_p(EE_ASIC|EE_CS|dataval, ee_addr); |
879 | outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr); | 879 | outb_p(EE_ASIC|EE_CS|dataval|EE_CK, ee_addr); |
880 | outb_p(EE_ASIC|EE_CS|dataval, ee_addr); | 880 | outb_p(EE_ASIC|EE_CS|dataval, ee_addr); |
881 | } | 881 | } |
882 | 882 | ||
883 | /* Terminate the ASIC access. */ | 883 | /* Terminate the ASIC access. */ |
884 | outb(EE_ASIC|EE_DI, ee_addr); | 884 | outb(EE_ASIC|EE_DI, ee_addr); |
885 | outb(EE_ASIC|EE_DI| EE_CK, ee_addr); | 885 | outb(EE_ASIC|EE_DI| EE_CK, ee_addr); |
886 | outb(EE_ASIC|EE_DI, ee_addr); | 886 | outb(EE_ASIC|EE_DI, ee_addr); |
887 | 887 | ||
888 | outb(0, ee_addr); | 888 | outb(0, ee_addr); |
889 | } | 889 | } |
890 | 890 | ||
891 | /*====================================================================*/ | 891 | /*====================================================================*/ |
892 | 892 | ||
893 | static void set_misc_reg(struct net_device *dev) | 893 | static void set_misc_reg(struct net_device *dev) |
894 | { | 894 | { |
895 | unsigned int nic_base = dev->base_addr; | 895 | unsigned int nic_base = dev->base_addr; |
896 | pcnet_dev_t *info = PRIV(dev); | 896 | pcnet_dev_t *info = PRIV(dev); |
897 | u_char tmp; | 897 | u_char tmp; |
898 | 898 | ||
899 | if (info->flags & HAS_MISC_REG) { | 899 | if (info->flags & HAS_MISC_REG) { |
900 | tmp = inb_p(nic_base + PCNET_MISC) & ~3; | 900 | tmp = inb_p(nic_base + PCNET_MISC) & ~3; |
901 | if (dev->if_port == 2) | 901 | if (dev->if_port == 2) |
902 | tmp |= 1; | 902 | tmp |= 1; |
903 | if (info->flags & USE_BIG_BUF) | 903 | if (info->flags & USE_BIG_BUF) |
904 | tmp |= 2; | 904 | tmp |= 2; |
905 | if (info->flags & HAS_IBM_MISC) | 905 | if (info->flags & HAS_IBM_MISC) |
906 | tmp |= 8; | 906 | tmp |= 8; |
907 | outb_p(tmp, nic_base + PCNET_MISC); | 907 | outb_p(tmp, nic_base + PCNET_MISC); |
908 | } | 908 | } |
909 | if (info->flags & IS_DL10022) { | 909 | if (info->flags & IS_DL10022) { |
910 | if (info->flags & HAS_MII) { | 910 | if (info->flags & HAS_MII) { |
911 | /* Advertise 100F, 100H, 10F, 10H */ | 911 | /* Advertise 100F, 100H, 10F, 10H */ |
912 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1); | 912 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1); |
913 | /* Restart MII autonegotiation */ | 913 | /* Restart MII autonegotiation */ |
914 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000); | 914 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000); |
915 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200); | 915 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200); |
916 | info->mii_reset = jiffies; | 916 | info->mii_reset = jiffies; |
917 | } else { | 917 | } else { |
918 | outb(full_duplex ? 4 : 0, nic_base + DLINK_DIAG); | 918 | outb(full_duplex ? 4 : 0, nic_base + DLINK_DIAG); |
919 | } | 919 | } |
920 | } else if (info->flags & IS_DL10019) { | 920 | } else if (info->flags & IS_DL10019) { |
921 | /* Advertise 100F, 100H, 10F, 10H */ | 921 | /* Advertise 100F, 100H, 10F, 10H */ |
922 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1); | 922 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 4, 0x01e1); |
923 | /* Restart MII autonegotiation */ | 923 | /* Restart MII autonegotiation */ |
924 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000); | 924 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x0000); |
925 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200); | 925 | mdio_write(nic_base + DLINK_GPIO, info->eth_phy, 0, 0x1200); |
926 | } | 926 | } |
927 | } | 927 | } |
928 | 928 | ||
929 | /*====================================================================*/ | 929 | /*====================================================================*/ |
930 | 930 | ||
931 | static void mii_phy_probe(struct net_device *dev) | 931 | static void mii_phy_probe(struct net_device *dev) |
932 | { | 932 | { |
933 | pcnet_dev_t *info = PRIV(dev); | 933 | pcnet_dev_t *info = PRIV(dev); |
934 | unsigned int mii_addr = dev->base_addr + DLINK_GPIO; | 934 | unsigned int mii_addr = dev->base_addr + DLINK_GPIO; |
935 | int i; | 935 | int i; |
936 | u_int tmp, phyid; | 936 | u_int tmp, phyid; |
937 | 937 | ||
938 | for (i = 31; i >= 0; i--) { | 938 | for (i = 31; i >= 0; i--) { |
939 | tmp = mdio_read(mii_addr, i, 1); | 939 | tmp = mdio_read(mii_addr, i, 1); |
940 | if ((tmp == 0) || (tmp == 0xffff)) | 940 | if ((tmp == 0) || (tmp == 0xffff)) |
941 | continue; | 941 | continue; |
942 | tmp = mdio_read(mii_addr, i, MII_PHYID_REG1); | 942 | tmp = mdio_read(mii_addr, i, MII_PHYID_REG1); |
943 | phyid = tmp << 16; | 943 | phyid = tmp << 16; |
944 | phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2); | 944 | phyid |= mdio_read(mii_addr, i, MII_PHYID_REG2); |
945 | phyid &= MII_PHYID_REV_MASK; | 945 | phyid &= MII_PHYID_REV_MASK; |
946 | pr_debug("%s: MII at %d is 0x%08x\n", dev->name, i, phyid); | 946 | pr_debug("%s: MII at %d is 0x%08x\n", dev->name, i, phyid); |
947 | if (phyid == AM79C9XX_HOME_PHY) { | 947 | if (phyid == AM79C9XX_HOME_PHY) { |
948 | info->pna_phy = i; | 948 | info->pna_phy = i; |
949 | } else if (phyid != AM79C9XX_ETH_PHY) { | 949 | } else if (phyid != AM79C9XX_ETH_PHY) { |
950 | info->eth_phy = i; | 950 | info->eth_phy = i; |
951 | } | 951 | } |
952 | } | 952 | } |
953 | } | 953 | } |
954 | 954 | ||
955 | static int pcnet_open(struct net_device *dev) | 955 | static int pcnet_open(struct net_device *dev) |
956 | { | 956 | { |
957 | int ret; | 957 | int ret; |
958 | pcnet_dev_t *info = PRIV(dev); | 958 | pcnet_dev_t *info = PRIV(dev); |
959 | struct pcmcia_device *link = info->p_dev; | 959 | struct pcmcia_device *link = info->p_dev; |
960 | unsigned int nic_base = dev->base_addr; | 960 | unsigned int nic_base = dev->base_addr; |
961 | 961 | ||
962 | dev_dbg(&link->dev, "pcnet_open('%s')\n", dev->name); | 962 | dev_dbg(&link->dev, "pcnet_open('%s')\n", dev->name); |
963 | 963 | ||
964 | if (!pcmcia_dev_present(link)) | 964 | if (!pcmcia_dev_present(link)) |
965 | return -ENODEV; | 965 | return -ENODEV; |
966 | 966 | ||
967 | set_misc_reg(dev); | 967 | set_misc_reg(dev); |
968 | 968 | ||
969 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ | 969 | outb_p(0xFF, nic_base + EN0_ISR); /* Clear bogus intr. */ |
970 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); | 970 | ret = request_irq(dev->irq, ei_irq_wrapper, IRQF_SHARED, dev_info, dev); |
971 | if (ret) | 971 | if (ret) |
972 | return ret; | 972 | return ret; |
973 | 973 | ||
974 | link->open++; | 974 | link->open++; |
975 | 975 | ||
976 | info->phy_id = info->eth_phy; | 976 | info->phy_id = info->eth_phy; |
977 | info->link_status = 0x00; | 977 | info->link_status = 0x00; |
978 | init_timer(&info->watchdog); | 978 | init_timer(&info->watchdog); |
979 | info->watchdog.function = &ei_watchdog; | 979 | info->watchdog.function = &ei_watchdog; |
980 | info->watchdog.data = (u_long)dev; | 980 | info->watchdog.data = (u_long)dev; |
981 | info->watchdog.expires = jiffies + HZ; | 981 | info->watchdog.expires = jiffies + HZ; |
982 | add_timer(&info->watchdog); | 982 | add_timer(&info->watchdog); |
983 | 983 | ||
984 | return ei_open(dev); | 984 | return ei_open(dev); |
985 | } /* pcnet_open */ | 985 | } /* pcnet_open */ |
986 | 986 | ||
987 | /*====================================================================*/ | 987 | /*====================================================================*/ |
988 | 988 | ||
989 | static int pcnet_close(struct net_device *dev) | 989 | static int pcnet_close(struct net_device *dev) |
990 | { | 990 | { |
991 | pcnet_dev_t *info = PRIV(dev); | 991 | pcnet_dev_t *info = PRIV(dev); |
992 | struct pcmcia_device *link = info->p_dev; | 992 | struct pcmcia_device *link = info->p_dev; |
993 | 993 | ||
994 | dev_dbg(&link->dev, "pcnet_close('%s')\n", dev->name); | 994 | dev_dbg(&link->dev, "pcnet_close('%s')\n", dev->name); |
995 | 995 | ||
996 | ei_close(dev); | 996 | ei_close(dev); |
997 | free_irq(dev->irq, dev); | 997 | free_irq(dev->irq, dev); |
998 | 998 | ||
999 | link->open--; | 999 | link->open--; |
1000 | netif_stop_queue(dev); | 1000 | netif_stop_queue(dev); |
1001 | del_timer_sync(&info->watchdog); | 1001 | del_timer_sync(&info->watchdog); |
1002 | 1002 | ||
1003 | return 0; | 1003 | return 0; |
1004 | } /* pcnet_close */ | 1004 | } /* pcnet_close */ |
1005 | 1005 | ||
1006 | /*====================================================================== | 1006 | /*====================================================================== |
1007 | 1007 | ||
1008 | Hard reset the card. This used to pause for the same period that | 1008 | Hard reset the card. This used to pause for the same period that |
1009 | a 8390 reset command required, but that shouldn't be necessary. | 1009 | a 8390 reset command required, but that shouldn't be necessary. |
1010 | 1010 | ||
1011 | ======================================================================*/ | 1011 | ======================================================================*/ |
1012 | 1012 | ||
1013 | static void pcnet_reset_8390(struct net_device *dev) | 1013 | static void pcnet_reset_8390(struct net_device *dev) |
1014 | { | 1014 | { |
1015 | unsigned int nic_base = dev->base_addr; | 1015 | unsigned int nic_base = dev->base_addr; |
1016 | int i; | 1016 | int i; |
1017 | 1017 | ||
1018 | ei_status.txing = ei_status.dmaing = 0; | 1018 | ei_status.txing = ei_status.dmaing = 0; |
1019 | 1019 | ||
1020 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD); | 1020 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, nic_base + E8390_CMD); |
1021 | 1021 | ||
1022 | outb(inb(nic_base + PCNET_RESET), nic_base + PCNET_RESET); | 1022 | outb(inb(nic_base + PCNET_RESET), nic_base + PCNET_RESET); |
1023 | 1023 | ||
1024 | for (i = 0; i < 100; i++) { | 1024 | for (i = 0; i < 100; i++) { |
1025 | if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0) | 1025 | if ((inb_p(nic_base+EN0_ISR) & ENISR_RESET) != 0) |
1026 | break; | 1026 | break; |
1027 | udelay(100); | 1027 | udelay(100); |
1028 | } | 1028 | } |
1029 | outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */ | 1029 | outb_p(ENISR_RESET, nic_base + EN0_ISR); /* Ack intr. */ |
1030 | 1030 | ||
1031 | if (i == 100) | 1031 | if (i == 100) |
1032 | printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n", | 1032 | printk(KERN_ERR "%s: pcnet_reset_8390() did not complete.\n", |
1033 | dev->name); | 1033 | dev->name); |
1034 | set_misc_reg(dev); | 1034 | set_misc_reg(dev); |
1035 | 1035 | ||
1036 | } /* pcnet_reset_8390 */ | 1036 | } /* pcnet_reset_8390 */ |
1037 | 1037 | ||
1038 | /*====================================================================*/ | 1038 | /*====================================================================*/ |
1039 | 1039 | ||
1040 | static int set_config(struct net_device *dev, struct ifmap *map) | 1040 | static int set_config(struct net_device *dev, struct ifmap *map) |
1041 | { | 1041 | { |
1042 | pcnet_dev_t *info = PRIV(dev); | 1042 | pcnet_dev_t *info = PRIV(dev); |
1043 | if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { | 1043 | if ((map->port != (u_char)(-1)) && (map->port != dev->if_port)) { |
1044 | if (!(info->flags & HAS_MISC_REG)) | 1044 | if (!(info->flags & HAS_MISC_REG)) |
1045 | return -EOPNOTSUPP; | 1045 | return -EOPNOTSUPP; |
1046 | else if ((map->port < 1) || (map->port > 2)) | 1046 | else if ((map->port < 1) || (map->port > 2)) |
1047 | return -EINVAL; | 1047 | return -EINVAL; |
1048 | dev->if_port = map->port; | 1048 | dev->if_port = map->port; |
1049 | printk(KERN_INFO "%s: switched to %s port\n", | 1049 | printk(KERN_INFO "%s: switched to %s port\n", |
1050 | dev->name, if_names[dev->if_port]); | 1050 | dev->name, if_names[dev->if_port]); |
1051 | NS8390_init(dev, 1); | 1051 | NS8390_init(dev, 1); |
1052 | } | 1052 | } |
1053 | return 0; | 1053 | return 0; |
1054 | } | 1054 | } |
1055 | 1055 | ||
1056 | /*====================================================================*/ | 1056 | /*====================================================================*/ |
1057 | 1057 | ||
1058 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id) | 1058 | static irqreturn_t ei_irq_wrapper(int irq, void *dev_id) |
1059 | { | 1059 | { |
1060 | struct net_device *dev = dev_id; | 1060 | struct net_device *dev = dev_id; |
1061 | pcnet_dev_t *info; | 1061 | pcnet_dev_t *info; |
1062 | irqreturn_t ret = ei_interrupt(irq, dev_id); | 1062 | irqreturn_t ret = ei_interrupt(irq, dev_id); |
1063 | 1063 | ||
1064 | if (ret == IRQ_HANDLED) { | 1064 | if (ret == IRQ_HANDLED) { |
1065 | info = PRIV(dev); | 1065 | info = PRIV(dev); |
1066 | info->stale = 0; | 1066 | info->stale = 0; |
1067 | } | 1067 | } |
1068 | return ret; | 1068 | return ret; |
1069 | } | 1069 | } |
1070 | 1070 | ||
1071 | static void ei_watchdog(u_long arg) | 1071 | static void ei_watchdog(u_long arg) |
1072 | { | 1072 | { |
1073 | struct net_device *dev = (struct net_device *)arg; | 1073 | struct net_device *dev = (struct net_device *)arg; |
1074 | pcnet_dev_t *info = PRIV(dev); | 1074 | pcnet_dev_t *info = PRIV(dev); |
1075 | unsigned int nic_base = dev->base_addr; | 1075 | unsigned int nic_base = dev->base_addr; |
1076 | unsigned int mii_addr = nic_base + DLINK_GPIO; | 1076 | unsigned int mii_addr = nic_base + DLINK_GPIO; |
1077 | u_short link; | 1077 | u_short link; |
1078 | 1078 | ||
1079 | if (!netif_device_present(dev)) goto reschedule; | 1079 | if (!netif_device_present(dev)) goto reschedule; |
1080 | 1080 | ||
1081 | /* Check for pending interrupt with expired latency timer: with | 1081 | /* Check for pending interrupt with expired latency timer: with |
1082 | this, we can limp along even if the interrupt is blocked */ | 1082 | this, we can limp along even if the interrupt is blocked */ |
1083 | if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) { | 1083 | if (info->stale++ && (inb_p(nic_base + EN0_ISR) & ENISR_ALL)) { |
1084 | if (!info->fast_poll) | 1084 | if (!info->fast_poll) |
1085 | printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name); | 1085 | printk(KERN_INFO "%s: interrupt(s) dropped!\n", dev->name); |
1086 | ei_irq_wrapper(dev->irq, dev); | 1086 | ei_irq_wrapper(dev->irq, dev); |
1087 | info->fast_poll = HZ; | 1087 | info->fast_poll = HZ; |
1088 | } | 1088 | } |
1089 | if (info->fast_poll) { | 1089 | if (info->fast_poll) { |
1090 | info->fast_poll--; | 1090 | info->fast_poll--; |
1091 | info->watchdog.expires = jiffies + 1; | 1091 | info->watchdog.expires = jiffies + 1; |
1092 | add_timer(&info->watchdog); | 1092 | add_timer(&info->watchdog); |
1093 | return; | 1093 | return; |
1094 | } | 1094 | } |
1095 | 1095 | ||
1096 | if (!(info->flags & HAS_MII)) | 1096 | if (!(info->flags & HAS_MII)) |
1097 | goto reschedule; | 1097 | goto reschedule; |
1098 | 1098 | ||
1099 | mdio_read(mii_addr, info->phy_id, 1); | 1099 | mdio_read(mii_addr, info->phy_id, 1); |
1100 | link = mdio_read(mii_addr, info->phy_id, 1); | 1100 | link = mdio_read(mii_addr, info->phy_id, 1); |
1101 | if (!link || (link == 0xffff)) { | 1101 | if (!link || (link == 0xffff)) { |
1102 | if (info->eth_phy) { | 1102 | if (info->eth_phy) { |
1103 | info->phy_id = info->eth_phy = 0; | 1103 | info->phy_id = info->eth_phy = 0; |
1104 | } else { | 1104 | } else { |
1105 | printk(KERN_INFO "%s: MII is missing!\n", dev->name); | 1105 | printk(KERN_INFO "%s: MII is missing!\n", dev->name); |
1106 | info->flags &= ~HAS_MII; | 1106 | info->flags &= ~HAS_MII; |
1107 | } | 1107 | } |
1108 | goto reschedule; | 1108 | goto reschedule; |
1109 | } | 1109 | } |
1110 | 1110 | ||
1111 | link &= 0x0004; | 1111 | link &= 0x0004; |
1112 | if (link != info->link_status) { | 1112 | if (link != info->link_status) { |
1113 | u_short p = mdio_read(mii_addr, info->phy_id, 5); | 1113 | u_short p = mdio_read(mii_addr, info->phy_id, 5); |
1114 | printk(KERN_INFO "%s: %s link beat\n", dev->name, | 1114 | printk(KERN_INFO "%s: %s link beat\n", dev->name, |
1115 | (link) ? "found" : "lost"); | 1115 | (link) ? "found" : "lost"); |
1116 | if (link && (info->flags & IS_DL10022)) { | 1116 | if (link && (info->flags & IS_DL10022)) { |
1117 | /* Disable collision detection on full duplex links */ | 1117 | /* Disable collision detection on full duplex links */ |
1118 | outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG); | 1118 | outb((p & 0x0140) ? 4 : 0, nic_base + DLINK_DIAG); |
1119 | } else if (link && (info->flags & IS_DL10019)) { | 1119 | } else if (link && (info->flags & IS_DL10019)) { |
1120 | /* Disable collision detection on full duplex links */ | 1120 | /* Disable collision detection on full duplex links */ |
1121 | write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0); | 1121 | write_asic(dev->base_addr, 4, (p & 0x140) ? DL19FDUPLX : 0); |
1122 | } | 1122 | } |
1123 | if (link) { | 1123 | if (link) { |
1124 | if (info->phy_id == info->eth_phy) { | 1124 | if (info->phy_id == info->eth_phy) { |
1125 | if (p) | 1125 | if (p) |
1126 | printk(KERN_INFO "%s: autonegotiation complete: " | 1126 | printk(KERN_INFO "%s: autonegotiation complete: " |
1127 | "%sbaseT-%cD selected\n", dev->name, | 1127 | "%sbaseT-%cD selected\n", dev->name, |
1128 | ((p & 0x0180) ? "100" : "10"), | 1128 | ((p & 0x0180) ? "100" : "10"), |
1129 | ((p & 0x0140) ? 'F' : 'H')); | 1129 | ((p & 0x0140) ? 'F' : 'H')); |
1130 | else | 1130 | else |
1131 | printk(KERN_INFO "%s: link partner did not " | 1131 | printk(KERN_INFO "%s: link partner did not " |
1132 | "autonegotiate\n", dev->name); | 1132 | "autonegotiate\n", dev->name); |
1133 | } | 1133 | } |
1134 | NS8390_init(dev, 1); | 1134 | NS8390_init(dev, 1); |
1135 | } | 1135 | } |
1136 | info->link_status = link; | 1136 | info->link_status = link; |
1137 | } | 1137 | } |
1138 | if (info->pna_phy && time_after(jiffies, info->mii_reset + 6*HZ)) { | 1138 | if (info->pna_phy && time_after(jiffies, info->mii_reset + 6*HZ)) { |
1139 | link = mdio_read(mii_addr, info->eth_phy, 1) & 0x0004; | 1139 | link = mdio_read(mii_addr, info->eth_phy, 1) & 0x0004; |
1140 | if (((info->phy_id == info->pna_phy) && link) || | 1140 | if (((info->phy_id == info->pna_phy) && link) || |
1141 | ((info->phy_id != info->pna_phy) && !link)) { | 1141 | ((info->phy_id != info->pna_phy) && !link)) { |
1142 | /* isolate this MII and try flipping to the other one */ | 1142 | /* isolate this MII and try flipping to the other one */ |
1143 | mdio_write(mii_addr, info->phy_id, 0, 0x0400); | 1143 | mdio_write(mii_addr, info->phy_id, 0, 0x0400); |
1144 | info->phy_id ^= info->pna_phy ^ info->eth_phy; | 1144 | info->phy_id ^= info->pna_phy ^ info->eth_phy; |
1145 | printk(KERN_INFO "%s: switched to %s transceiver\n", dev->name, | 1145 | printk(KERN_INFO "%s: switched to %s transceiver\n", dev->name, |
1146 | (info->phy_id == info->eth_phy) ? "ethernet" : "PNA"); | 1146 | (info->phy_id == info->eth_phy) ? "ethernet" : "PNA"); |
1147 | mdio_write(mii_addr, info->phy_id, 0, | 1147 | mdio_write(mii_addr, info->phy_id, 0, |
1148 | (info->phy_id == info->eth_phy) ? 0x1000 : 0); | 1148 | (info->phy_id == info->eth_phy) ? 0x1000 : 0); |
1149 | info->link_status = 0; | 1149 | info->link_status = 0; |
1150 | info->mii_reset = jiffies; | 1150 | info->mii_reset = jiffies; |
1151 | } | 1151 | } |
1152 | } | 1152 | } |
1153 | 1153 | ||
1154 | reschedule: | 1154 | reschedule: |
1155 | info->watchdog.expires = jiffies + HZ; | 1155 | info->watchdog.expires = jiffies + HZ; |
1156 | add_timer(&info->watchdog); | 1156 | add_timer(&info->watchdog); |
1157 | } | 1157 | } |
1158 | 1158 | ||
1159 | /*====================================================================*/ | 1159 | /*====================================================================*/ |
1160 | 1160 | ||
1161 | static void netdev_get_drvinfo(struct net_device *dev, | 1161 | static void netdev_get_drvinfo(struct net_device *dev, |
1162 | struct ethtool_drvinfo *info) | 1162 | struct ethtool_drvinfo *info) |
1163 | { | 1163 | { |
1164 | strcpy(info->driver, "pcnet_cs"); | 1164 | strcpy(info->driver, "pcnet_cs"); |
1165 | } | 1165 | } |
1166 | 1166 | ||
1167 | static const struct ethtool_ops netdev_ethtool_ops = { | 1167 | static const struct ethtool_ops netdev_ethtool_ops = { |
1168 | .get_drvinfo = netdev_get_drvinfo, | 1168 | .get_drvinfo = netdev_get_drvinfo, |
1169 | }; | 1169 | }; |
1170 | 1170 | ||
1171 | /*====================================================================*/ | 1171 | /*====================================================================*/ |
1172 | 1172 | ||
1173 | 1173 | ||
1174 | static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | 1174 | static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) |
1175 | { | 1175 | { |
1176 | pcnet_dev_t *info = PRIV(dev); | 1176 | pcnet_dev_t *info = PRIV(dev); |
1177 | struct mii_ioctl_data *data = if_mii(rq); | 1177 | struct mii_ioctl_data *data = if_mii(rq); |
1178 | unsigned int mii_addr = dev->base_addr + DLINK_GPIO; | 1178 | unsigned int mii_addr = dev->base_addr + DLINK_GPIO; |
1179 | 1179 | ||
1180 | if (!(info->flags & (IS_DL10019|IS_DL10022))) | 1180 | if (!(info->flags & (IS_DL10019|IS_DL10022))) |
1181 | return -EINVAL; | 1181 | return -EINVAL; |
1182 | 1182 | ||
1183 | switch (cmd) { | 1183 | switch (cmd) { |
1184 | case SIOCGMIIPHY: | 1184 | case SIOCGMIIPHY: |
1185 | data->phy_id = info->phy_id; | 1185 | data->phy_id = info->phy_id; |
1186 | case SIOCGMIIREG: /* Read MII PHY register. */ | 1186 | case SIOCGMIIREG: /* Read MII PHY register. */ |
1187 | data->val_out = mdio_read(mii_addr, data->phy_id, data->reg_num & 0x1f); | 1187 | data->val_out = mdio_read(mii_addr, data->phy_id, data->reg_num & 0x1f); |
1188 | return 0; | 1188 | return 0; |
1189 | case SIOCSMIIREG: /* Write MII PHY register. */ | 1189 | case SIOCSMIIREG: /* Write MII PHY register. */ |
1190 | mdio_write(mii_addr, data->phy_id, data->reg_num & 0x1f, data->val_in); | 1190 | mdio_write(mii_addr, data->phy_id, data->reg_num & 0x1f, data->val_in); |
1191 | return 0; | 1191 | return 0; |
1192 | } | 1192 | } |
1193 | return -EOPNOTSUPP; | 1193 | return -EOPNOTSUPP; |
1194 | } | 1194 | } |
1195 | 1195 | ||
1196 | /*====================================================================*/ | 1196 | /*====================================================================*/ |
1197 | 1197 | ||
1198 | static void dma_get_8390_hdr(struct net_device *dev, | 1198 | static void dma_get_8390_hdr(struct net_device *dev, |
1199 | struct e8390_pkt_hdr *hdr, | 1199 | struct e8390_pkt_hdr *hdr, |
1200 | int ring_page) | 1200 | int ring_page) |
1201 | { | 1201 | { |
1202 | unsigned int nic_base = dev->base_addr; | 1202 | unsigned int nic_base = dev->base_addr; |
1203 | 1203 | ||
1204 | if (ei_status.dmaing) { | 1204 | if (ei_status.dmaing) { |
1205 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input." | 1205 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input." |
1206 | "[DMAstat:%1x][irqlock:%1x]\n", | 1206 | "[DMAstat:%1x][irqlock:%1x]\n", |
1207 | dev->name, ei_status.dmaing, ei_status.irqlock); | 1207 | dev->name, ei_status.dmaing, ei_status.irqlock); |
1208 | return; | 1208 | return; |
1209 | } | 1209 | } |
1210 | 1210 | ||
1211 | ei_status.dmaing |= 0x01; | 1211 | ei_status.dmaing |= 0x01; |
1212 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD); | 1212 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD); |
1213 | outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO); | 1213 | outb_p(sizeof(struct e8390_pkt_hdr), nic_base + EN0_RCNTLO); |
1214 | outb_p(0, nic_base + EN0_RCNTHI); | 1214 | outb_p(0, nic_base + EN0_RCNTHI); |
1215 | outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */ | 1215 | outb_p(0, nic_base + EN0_RSARLO); /* On page boundary */ |
1216 | outb_p(ring_page, nic_base + EN0_RSARHI); | 1216 | outb_p(ring_page, nic_base + EN0_RSARHI); |
1217 | outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD); | 1217 | outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD); |
1218 | 1218 | ||
1219 | insw(nic_base + PCNET_DATAPORT, hdr, | 1219 | insw(nic_base + PCNET_DATAPORT, hdr, |
1220 | sizeof(struct e8390_pkt_hdr)>>1); | 1220 | sizeof(struct e8390_pkt_hdr)>>1); |
1221 | /* Fix for big endian systems */ | 1221 | /* Fix for big endian systems */ |
1222 | hdr->count = le16_to_cpu(hdr->count); | 1222 | hdr->count = le16_to_cpu(hdr->count); |
1223 | 1223 | ||
1224 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ | 1224 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ |
1225 | ei_status.dmaing &= ~0x01; | 1225 | ei_status.dmaing &= ~0x01; |
1226 | } | 1226 | } |
1227 | 1227 | ||
1228 | /*====================================================================*/ | 1228 | /*====================================================================*/ |
1229 | 1229 | ||
1230 | static void dma_block_input(struct net_device *dev, int count, | 1230 | static void dma_block_input(struct net_device *dev, int count, |
1231 | struct sk_buff *skb, int ring_offset) | 1231 | struct sk_buff *skb, int ring_offset) |
1232 | { | 1232 | { |
1233 | unsigned int nic_base = dev->base_addr; | 1233 | unsigned int nic_base = dev->base_addr; |
1234 | int xfer_count = count; | 1234 | int xfer_count = count; |
1235 | char *buf = skb->data; | 1235 | char *buf = skb->data; |
1236 | 1236 | ||
1237 | if ((ei_debug > 4) && (count != 4)) | 1237 | if ((ei_debug > 4) && (count != 4)) |
1238 | pr_debug("%s: [bi=%d]\n", dev->name, count+4); | 1238 | pr_debug("%s: [bi=%d]\n", dev->name, count+4); |
1239 | if (ei_status.dmaing) { | 1239 | if (ei_status.dmaing) { |
1240 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input." | 1240 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_input." |
1241 | "[DMAstat:%1x][irqlock:%1x]\n", | 1241 | "[DMAstat:%1x][irqlock:%1x]\n", |
1242 | dev->name, ei_status.dmaing, ei_status.irqlock); | 1242 | dev->name, ei_status.dmaing, ei_status.irqlock); |
1243 | return; | 1243 | return; |
1244 | } | 1244 | } |
1245 | ei_status.dmaing |= 0x01; | 1245 | ei_status.dmaing |= 0x01; |
1246 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD); | 1246 | outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base + PCNET_CMD); |
1247 | outb_p(count & 0xff, nic_base + EN0_RCNTLO); | 1247 | outb_p(count & 0xff, nic_base + EN0_RCNTLO); |
1248 | outb_p(count >> 8, nic_base + EN0_RCNTHI); | 1248 | outb_p(count >> 8, nic_base + EN0_RCNTHI); |
1249 | outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO); | 1249 | outb_p(ring_offset & 0xff, nic_base + EN0_RSARLO); |
1250 | outb_p(ring_offset >> 8, nic_base + EN0_RSARHI); | 1250 | outb_p(ring_offset >> 8, nic_base + EN0_RSARHI); |
1251 | outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD); | 1251 | outb_p(E8390_RREAD+E8390_START, nic_base + PCNET_CMD); |
1252 | 1252 | ||
1253 | insw(nic_base + PCNET_DATAPORT,buf,count>>1); | 1253 | insw(nic_base + PCNET_DATAPORT,buf,count>>1); |
1254 | if (count & 0x01) | 1254 | if (count & 0x01) |
1255 | buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++; | 1255 | buf[count-1] = inb(nic_base + PCNET_DATAPORT), xfer_count++; |
1256 | 1256 | ||
1257 | /* This was for the ALPHA version only, but enough people have been | 1257 | /* This was for the ALPHA version only, but enough people have been |
1258 | encountering problems that it is still here. */ | 1258 | encountering problems that it is still here. */ |
1259 | #ifdef PCMCIA_DEBUG | 1259 | #ifdef PCMCIA_DEBUG |
1260 | if (ei_debug > 4) { /* DMA termination address check... */ | 1260 | if (ei_debug > 4) { /* DMA termination address check... */ |
1261 | int addr, tries = 20; | 1261 | int addr, tries = 20; |
1262 | do { | 1262 | do { |
1263 | /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here | 1263 | /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here |
1264 | -- it's broken for Rx on some cards! */ | 1264 | -- it's broken for Rx on some cards! */ |
1265 | int high = inb_p(nic_base + EN0_RSARHI); | 1265 | int high = inb_p(nic_base + EN0_RSARHI); |
1266 | int low = inb_p(nic_base + EN0_RSARLO); | 1266 | int low = inb_p(nic_base + EN0_RSARLO); |
1267 | addr = (high << 8) + low; | 1267 | addr = (high << 8) + low; |
1268 | if (((ring_offset + xfer_count) & 0xff) == (addr & 0xff)) | 1268 | if (((ring_offset + xfer_count) & 0xff) == (addr & 0xff)) |
1269 | break; | 1269 | break; |
1270 | } while (--tries > 0); | 1270 | } while (--tries > 0); |
1271 | if (tries <= 0) | 1271 | if (tries <= 0) |
1272 | printk(KERN_NOTICE "%s: RX transfer address mismatch," | 1272 | printk(KERN_NOTICE "%s: RX transfer address mismatch," |
1273 | "%#4.4x (expected) vs. %#4.4x (actual).\n", | 1273 | "%#4.4x (expected) vs. %#4.4x (actual).\n", |
1274 | dev->name, ring_offset + xfer_count, addr); | 1274 | dev->name, ring_offset + xfer_count, addr); |
1275 | } | 1275 | } |
1276 | #endif | 1276 | #endif |
1277 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ | 1277 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ |
1278 | ei_status.dmaing &= ~0x01; | 1278 | ei_status.dmaing &= ~0x01; |
1279 | } /* dma_block_input */ | 1279 | } /* dma_block_input */ |
1280 | 1280 | ||
1281 | /*====================================================================*/ | 1281 | /*====================================================================*/ |
1282 | 1282 | ||
1283 | static void dma_block_output(struct net_device *dev, int count, | 1283 | static void dma_block_output(struct net_device *dev, int count, |
1284 | const u_char *buf, const int start_page) | 1284 | const u_char *buf, const int start_page) |
1285 | { | 1285 | { |
1286 | unsigned int nic_base = dev->base_addr; | 1286 | unsigned int nic_base = dev->base_addr; |
1287 | pcnet_dev_t *info = PRIV(dev); | 1287 | pcnet_dev_t *info = PRIV(dev); |
1288 | #ifdef PCMCIA_DEBUG | 1288 | #ifdef PCMCIA_DEBUG |
1289 | int retries = 0; | 1289 | int retries = 0; |
1290 | #endif | 1290 | #endif |
1291 | u_long dma_start; | 1291 | u_long dma_start; |
1292 | 1292 | ||
1293 | #ifdef PCMCIA_DEBUG | 1293 | #ifdef PCMCIA_DEBUG |
1294 | if (ei_debug > 4) | 1294 | if (ei_debug > 4) |
1295 | printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count); | 1295 | printk(KERN_DEBUG "%s: [bo=%d]\n", dev->name, count); |
1296 | #endif | 1296 | #endif |
1297 | 1297 | ||
1298 | /* Round the count up for word writes. Do we need to do this? | 1298 | /* Round the count up for word writes. Do we need to do this? |
1299 | What effect will an odd byte count have on the 8390? | 1299 | What effect will an odd byte count have on the 8390? |
1300 | I should check someday. */ | 1300 | I should check someday. */ |
1301 | if (count & 0x01) | 1301 | if (count & 0x01) |
1302 | count++; | 1302 | count++; |
1303 | if (ei_status.dmaing) { | 1303 | if (ei_status.dmaing) { |
1304 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_output." | 1304 | printk(KERN_NOTICE "%s: DMAing conflict in dma_block_output." |
1305 | "[DMAstat:%1x][irqlock:%1x]\n", | 1305 | "[DMAstat:%1x][irqlock:%1x]\n", |
1306 | dev->name, ei_status.dmaing, ei_status.irqlock); | 1306 | dev->name, ei_status.dmaing, ei_status.irqlock); |
1307 | return; | 1307 | return; |
1308 | } | 1308 | } |
1309 | ei_status.dmaing |= 0x01; | 1309 | ei_status.dmaing |= 0x01; |
1310 | /* We should already be in page 0, but to be safe... */ | 1310 | /* We should already be in page 0, but to be safe... */ |
1311 | outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base+PCNET_CMD); | 1311 | outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base+PCNET_CMD); |
1312 | 1312 | ||
1313 | #ifdef PCMCIA_DEBUG | 1313 | #ifdef PCMCIA_DEBUG |
1314 | retry: | 1314 | retry: |
1315 | #endif | 1315 | #endif |
1316 | 1316 | ||
1317 | outb_p(ENISR_RDC, nic_base + EN0_ISR); | 1317 | outb_p(ENISR_RDC, nic_base + EN0_ISR); |
1318 | 1318 | ||
1319 | /* Now the normal output. */ | 1319 | /* Now the normal output. */ |
1320 | outb_p(count & 0xff, nic_base + EN0_RCNTLO); | 1320 | outb_p(count & 0xff, nic_base + EN0_RCNTLO); |
1321 | outb_p(count >> 8, nic_base + EN0_RCNTHI); | 1321 | outb_p(count >> 8, nic_base + EN0_RCNTHI); |
1322 | outb_p(0x00, nic_base + EN0_RSARLO); | 1322 | outb_p(0x00, nic_base + EN0_RSARLO); |
1323 | outb_p(start_page, nic_base + EN0_RSARHI); | 1323 | outb_p(start_page, nic_base + EN0_RSARHI); |
1324 | 1324 | ||
1325 | outb_p(E8390_RWRITE+E8390_START, nic_base + PCNET_CMD); | 1325 | outb_p(E8390_RWRITE+E8390_START, nic_base + PCNET_CMD); |
1326 | outsw(nic_base + PCNET_DATAPORT, buf, count>>1); | 1326 | outsw(nic_base + PCNET_DATAPORT, buf, count>>1); |
1327 | 1327 | ||
1328 | dma_start = jiffies; | 1328 | dma_start = jiffies; |
1329 | 1329 | ||
1330 | #ifdef PCMCIA_DEBUG | 1330 | #ifdef PCMCIA_DEBUG |
1331 | /* This was for the ALPHA version only, but enough people have been | 1331 | /* This was for the ALPHA version only, but enough people have been |
1332 | encountering problems that it is still here. */ | 1332 | encountering problems that it is still here. */ |
1333 | if (ei_debug > 4) { /* DMA termination address check... */ | 1333 | if (ei_debug > 4) { /* DMA termination address check... */ |
1334 | int addr, tries = 20; | 1334 | int addr, tries = 20; |
1335 | do { | 1335 | do { |
1336 | int high = inb_p(nic_base + EN0_RSARHI); | 1336 | int high = inb_p(nic_base + EN0_RSARHI); |
1337 | int low = inb_p(nic_base + EN0_RSARLO); | 1337 | int low = inb_p(nic_base + EN0_RSARLO); |
1338 | addr = (high << 8) + low; | 1338 | addr = (high << 8) + low; |
1339 | if ((start_page << 8) + count == addr) | 1339 | if ((start_page << 8) + count == addr) |
1340 | break; | 1340 | break; |
1341 | } while (--tries > 0); | 1341 | } while (--tries > 0); |
1342 | if (tries <= 0) { | 1342 | if (tries <= 0) { |
1343 | printk(KERN_NOTICE "%s: Tx packet transfer address mismatch," | 1343 | printk(KERN_NOTICE "%s: Tx packet transfer address mismatch," |
1344 | "%#4.4x (expected) vs. %#4.4x (actual).\n", | 1344 | "%#4.4x (expected) vs. %#4.4x (actual).\n", |
1345 | dev->name, (start_page << 8) + count, addr); | 1345 | dev->name, (start_page << 8) + count, addr); |
1346 | if (retries++ == 0) | 1346 | if (retries++ == 0) |
1347 | goto retry; | 1347 | goto retry; |
1348 | } | 1348 | } |
1349 | } | 1349 | } |
1350 | #endif | 1350 | #endif |
1351 | 1351 | ||
1352 | while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) | 1352 | while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) |
1353 | if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) { | 1353 | if (time_after(jiffies, dma_start + PCNET_RDC_TIMEOUT)) { |
1354 | printk(KERN_NOTICE "%s: timeout waiting for Tx RDC.\n", | 1354 | printk(KERN_NOTICE "%s: timeout waiting for Tx RDC.\n", |
1355 | dev->name); | 1355 | dev->name); |
1356 | pcnet_reset_8390(dev); | 1356 | pcnet_reset_8390(dev); |
1357 | NS8390_init(dev, 1); | 1357 | NS8390_init(dev, 1); |
1358 | break; | 1358 | break; |
1359 | } | 1359 | } |
1360 | 1360 | ||
1361 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ | 1361 | outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ |
1362 | if (info->flags & DELAY_OUTPUT) | 1362 | if (info->flags & DELAY_OUTPUT) |
1363 | udelay((long)delay_time); | 1363 | udelay((long)delay_time); |
1364 | ei_status.dmaing &= ~0x01; | 1364 | ei_status.dmaing &= ~0x01; |
1365 | } | 1365 | } |
1366 | 1366 | ||
1367 | /*====================================================================*/ | 1367 | /*====================================================================*/ |
1368 | 1368 | ||
1369 | static int setup_dma_config(struct pcmcia_device *link, int start_pg, | 1369 | static int setup_dma_config(struct pcmcia_device *link, int start_pg, |
1370 | int stop_pg) | 1370 | int stop_pg) |
1371 | { | 1371 | { |
1372 | struct net_device *dev = link->priv; | 1372 | struct net_device *dev = link->priv; |
1373 | 1373 | ||
1374 | ei_status.tx_start_page = start_pg; | 1374 | ei_status.tx_start_page = start_pg; |
1375 | ei_status.rx_start_page = start_pg + TX_PAGES; | 1375 | ei_status.rx_start_page = start_pg + TX_PAGES; |
1376 | ei_status.stop_page = stop_pg; | 1376 | ei_status.stop_page = stop_pg; |
1377 | 1377 | ||
1378 | /* set up block i/o functions */ | 1378 | /* set up block i/o functions */ |
1379 | ei_status.get_8390_hdr = &dma_get_8390_hdr; | 1379 | ei_status.get_8390_hdr = &dma_get_8390_hdr; |
1380 | ei_status.block_input = &dma_block_input; | 1380 | ei_status.block_input = &dma_block_input; |
1381 | ei_status.block_output = &dma_block_output; | 1381 | ei_status.block_output = &dma_block_output; |
1382 | 1382 | ||
1383 | return 0; | 1383 | return 0; |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | /*====================================================================*/ | 1386 | /*====================================================================*/ |
1387 | 1387 | ||
1388 | static void copyin(void *dest, void __iomem *src, int c) | 1388 | static void copyin(void *dest, void __iomem *src, int c) |
1389 | { | 1389 | { |
1390 | u_short *d = dest; | 1390 | u_short *d = dest; |
1391 | u_short __iomem *s = src; | 1391 | u_short __iomem *s = src; |
1392 | int odd; | 1392 | int odd; |
1393 | 1393 | ||
1394 | if (c <= 0) | 1394 | if (c <= 0) |
1395 | return; | 1395 | return; |
1396 | odd = (c & 1); c >>= 1; | 1396 | odd = (c & 1); c >>= 1; |
1397 | 1397 | ||
1398 | if (c) { | 1398 | if (c) { |
1399 | do { *d++ = __raw_readw(s++); } while (--c); | 1399 | do { *d++ = __raw_readw(s++); } while (--c); |
1400 | } | 1400 | } |
1401 | /* get last byte by fetching a word and masking */ | 1401 | /* get last byte by fetching a word and masking */ |
1402 | if (odd) | 1402 | if (odd) |
1403 | *((u_char *)d) = readw(s) & 0xff; | 1403 | *((u_char *)d) = readw(s) & 0xff; |
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | static void copyout(void __iomem *dest, const void *src, int c) | 1406 | static void copyout(void __iomem *dest, const void *src, int c) |
1407 | { | 1407 | { |
1408 | u_short __iomem *d = dest; | 1408 | u_short __iomem *d = dest; |
1409 | const u_short *s = src; | 1409 | const u_short *s = src; |
1410 | int odd; | 1410 | int odd; |
1411 | 1411 | ||
1412 | if (c <= 0) | 1412 | if (c <= 0) |
1413 | return; | 1413 | return; |
1414 | odd = (c & 1); c >>= 1; | 1414 | odd = (c & 1); c >>= 1; |
1415 | 1415 | ||
1416 | if (c) { | 1416 | if (c) { |
1417 | do { __raw_writew(*s++, d++); } while (--c); | 1417 | do { __raw_writew(*s++, d++); } while (--c); |
1418 | } | 1418 | } |
1419 | /* copy last byte doing a read-modify-write */ | 1419 | /* copy last byte doing a read-modify-write */ |
1420 | if (odd) | 1420 | if (odd) |
1421 | writew((readw(d) & 0xff00) | *(u_char *)s, d); | 1421 | writew((readw(d) & 0xff00) | *(u_char *)s, d); |
1422 | } | 1422 | } |
1423 | 1423 | ||
1424 | /*====================================================================*/ | 1424 | /*====================================================================*/ |
1425 | 1425 | ||
1426 | static void shmem_get_8390_hdr(struct net_device *dev, | 1426 | static void shmem_get_8390_hdr(struct net_device *dev, |
1427 | struct e8390_pkt_hdr *hdr, | 1427 | struct e8390_pkt_hdr *hdr, |
1428 | int ring_page) | 1428 | int ring_page) |
1429 | { | 1429 | { |
1430 | void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8) | 1430 | void __iomem *xfer_start = ei_status.mem + (TX_PAGES<<8) |
1431 | + (ring_page << 8) | 1431 | + (ring_page << 8) |
1432 | - (ei_status.rx_start_page << 8); | 1432 | - (ei_status.rx_start_page << 8); |
1433 | 1433 | ||
1434 | copyin(hdr, xfer_start, sizeof(struct e8390_pkt_hdr)); | 1434 | copyin(hdr, xfer_start, sizeof(struct e8390_pkt_hdr)); |
1435 | /* Fix for big endian systems */ | 1435 | /* Fix for big endian systems */ |
1436 | hdr->count = le16_to_cpu(hdr->count); | 1436 | hdr->count = le16_to_cpu(hdr->count); |
1437 | } | 1437 | } |
1438 | 1438 | ||
1439 | /*====================================================================*/ | 1439 | /*====================================================================*/ |
1440 | 1440 | ||
1441 | static void shmem_block_input(struct net_device *dev, int count, | 1441 | static void shmem_block_input(struct net_device *dev, int count, |
1442 | struct sk_buff *skb, int ring_offset) | 1442 | struct sk_buff *skb, int ring_offset) |
1443 | { | 1443 | { |
1444 | void __iomem *base = ei_status.mem; | 1444 | void __iomem *base = ei_status.mem; |
1445 | unsigned long offset = (TX_PAGES<<8) + ring_offset | 1445 | unsigned long offset = (TX_PAGES<<8) + ring_offset |
1446 | - (ei_status.rx_start_page << 8); | 1446 | - (ei_status.rx_start_page << 8); |
1447 | char *buf = skb->data; | 1447 | char *buf = skb->data; |
1448 | 1448 | ||
1449 | if (offset + count > ei_status.priv) { | 1449 | if (offset + count > ei_status.priv) { |
1450 | /* We must wrap the input move. */ | 1450 | /* We must wrap the input move. */ |
1451 | int semi_count = ei_status.priv - offset; | 1451 | int semi_count = ei_status.priv - offset; |
1452 | copyin(buf, base + offset, semi_count); | 1452 | copyin(buf, base + offset, semi_count); |
1453 | buf += semi_count; | 1453 | buf += semi_count; |
1454 | offset = TX_PAGES<<8; | 1454 | offset = TX_PAGES<<8; |
1455 | count -= semi_count; | 1455 | count -= semi_count; |
1456 | } | 1456 | } |
1457 | copyin(buf, base + offset, count); | 1457 | copyin(buf, base + offset, count); |
1458 | } | 1458 | } |
1459 | 1459 | ||
1460 | /*====================================================================*/ | 1460 | /*====================================================================*/ |
1461 | 1461 | ||
1462 | static void shmem_block_output(struct net_device *dev, int count, | 1462 | static void shmem_block_output(struct net_device *dev, int count, |
1463 | const u_char *buf, const int start_page) | 1463 | const u_char *buf, const int start_page) |
1464 | { | 1464 | { |
1465 | void __iomem *shmem = ei_status.mem + (start_page << 8); | 1465 | void __iomem *shmem = ei_status.mem + (start_page << 8); |
1466 | shmem -= ei_status.tx_start_page << 8; | 1466 | shmem -= ei_status.tx_start_page << 8; |
1467 | copyout(shmem, buf, count); | 1467 | copyout(shmem, buf, count); |
1468 | } | 1468 | } |
1469 | 1469 | ||
1470 | /*====================================================================*/ | 1470 | /*====================================================================*/ |
1471 | 1471 | ||
1472 | static int setup_shmem_window(struct pcmcia_device *link, int start_pg, | 1472 | static int setup_shmem_window(struct pcmcia_device *link, int start_pg, |
1473 | int stop_pg, int cm_offset) | 1473 | int stop_pg, int cm_offset) |
1474 | { | 1474 | { |
1475 | struct net_device *dev = link->priv; | 1475 | struct net_device *dev = link->priv; |
1476 | pcnet_dev_t *info = PRIV(dev); | 1476 | pcnet_dev_t *info = PRIV(dev); |
1477 | win_req_t req; | 1477 | win_req_t req; |
1478 | memreq_t mem; | 1478 | memreq_t mem; |
1479 | int i, window_size, offset, ret; | 1479 | int i, window_size, offset, ret; |
1480 | 1480 | ||
1481 | window_size = (stop_pg - start_pg) << 8; | 1481 | window_size = (stop_pg - start_pg) << 8; |
1482 | if (window_size > 32 * 1024) | 1482 | if (window_size > 32 * 1024) |
1483 | window_size = 32 * 1024; | 1483 | window_size = 32 * 1024; |
1484 | 1484 | ||
1485 | /* Make sure it's a power of two. */ | 1485 | /* Make sure it's a power of two. */ |
1486 | window_size = roundup_pow_of_two(window_size); | 1486 | window_size = roundup_pow_of_two(window_size); |
1487 | 1487 | ||
1488 | /* Allocate a memory window */ | 1488 | /* Allocate a memory window */ |
1489 | req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE; | 1489 | req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM|WIN_ENABLE; |
1490 | req.Attributes |= WIN_USE_WAIT; | 1490 | req.Attributes |= WIN_USE_WAIT; |
1491 | req.Base = 0; req.Size = window_size; | 1491 | req.Base = 0; req.Size = window_size; |
1492 | req.AccessSpeed = mem_speed; | 1492 | req.AccessSpeed = mem_speed; |
1493 | ret = pcmcia_request_window(link, &req, &link->win); | 1493 | ret = pcmcia_request_window(link, &req, &link->win); |
1494 | if (ret) | 1494 | if (ret) |
1495 | goto failed; | 1495 | goto failed; |
1496 | 1496 | ||
1497 | mem.CardOffset = (start_pg << 8) + cm_offset; | 1497 | mem.CardOffset = (start_pg << 8) + cm_offset; |
1498 | offset = mem.CardOffset % window_size; | 1498 | offset = mem.CardOffset % window_size; |
1499 | mem.CardOffset -= offset; | 1499 | mem.CardOffset -= offset; |
1500 | mem.Page = 0; | 1500 | mem.Page = 0; |
1501 | ret = pcmcia_map_mem_page(link, link->win, &mem); | 1501 | ret = pcmcia_map_mem_page(link, link->win, &mem); |
1502 | if (ret) | 1502 | if (ret) |
1503 | goto failed; | 1503 | goto failed; |
1504 | 1504 | ||
1505 | /* Try scribbling on the buffer */ | 1505 | /* Try scribbling on the buffer */ |
1506 | info->base = ioremap(req.Base, window_size); | 1506 | info->base = ioremap(req.Base, window_size); |
1507 | for (i = 0; i < (TX_PAGES<<8); i += 2) | 1507 | for (i = 0; i < (TX_PAGES<<8); i += 2) |
1508 | __raw_writew((i>>1), info->base+offset+i); | 1508 | __raw_writew((i>>1), info->base+offset+i); |
1509 | udelay(100); | 1509 | udelay(100); |
1510 | for (i = 0; i < (TX_PAGES<<8); i += 2) | 1510 | for (i = 0; i < (TX_PAGES<<8); i += 2) |
1511 | if (__raw_readw(info->base+offset+i) != (i>>1)) break; | 1511 | if (__raw_readw(info->base+offset+i) != (i>>1)) break; |
1512 | pcnet_reset_8390(dev); | 1512 | pcnet_reset_8390(dev); |
1513 | if (i != (TX_PAGES<<8)) { | 1513 | if (i != (TX_PAGES<<8)) { |
1514 | iounmap(info->base); | 1514 | iounmap(info->base); |
1515 | pcmcia_release_window(link, link->win); | 1515 | pcmcia_release_window(link, link->win); |
1516 | info->base = NULL; link->win = 0; | 1516 | info->base = NULL; link->win = 0; |
1517 | goto failed; | 1517 | goto failed; |
1518 | } | 1518 | } |
1519 | 1519 | ||
1520 | ei_status.mem = info->base + offset; | 1520 | ei_status.mem = info->base + offset; |
1521 | ei_status.priv = req.Size; | 1521 | ei_status.priv = req.Size; |
1522 | dev->mem_start = (u_long)ei_status.mem; | 1522 | dev->mem_start = (u_long)ei_status.mem; |
1523 | dev->mem_end = dev->mem_start + req.Size; | 1523 | dev->mem_end = dev->mem_start + req.Size; |
1524 | 1524 | ||
1525 | ei_status.tx_start_page = start_pg; | 1525 | ei_status.tx_start_page = start_pg; |
1526 | ei_status.rx_start_page = start_pg + TX_PAGES; | 1526 | ei_status.rx_start_page = start_pg + TX_PAGES; |
1527 | ei_status.stop_page = start_pg + ((req.Size - offset) >> 8); | 1527 | ei_status.stop_page = start_pg + ((req.Size - offset) >> 8); |
1528 | 1528 | ||
1529 | /* set up block i/o functions */ | 1529 | /* set up block i/o functions */ |
1530 | ei_status.get_8390_hdr = &shmem_get_8390_hdr; | 1530 | ei_status.get_8390_hdr = &shmem_get_8390_hdr; |
1531 | ei_status.block_input = &shmem_block_input; | 1531 | ei_status.block_input = &shmem_block_input; |
1532 | ei_status.block_output = &shmem_block_output; | 1532 | ei_status.block_output = &shmem_block_output; |
1533 | 1533 | ||
1534 | info->flags |= USE_SHMEM; | 1534 | info->flags |= USE_SHMEM; |
1535 | return 0; | 1535 | return 0; |
1536 | 1536 | ||
1537 | failed: | 1537 | failed: |
1538 | return 1; | 1538 | return 1; |
1539 | } | 1539 | } |
1540 | 1540 | ||
1541 | /*====================================================================*/ | 1541 | /*====================================================================*/ |
1542 | 1542 | ||
1543 | static struct pcmcia_device_id pcnet_ids[] = { | 1543 | static struct pcmcia_device_id pcnet_ids[] = { |
1544 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021), | 1544 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0057, 0x0021), |
1545 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a), | 1545 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0104, 0x000a), |
1546 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15), | 1546 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0105, 0xea15), |
1547 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0x3341), | 1547 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0x3341), |
1548 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab), | 1548 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x0143, 0xc0ab), |
1549 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101), | 1549 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x021b, 0x0101), |
1550 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab), | 1550 | PCMCIA_PFC_DEVICE_MANF_CARD(0, 0x08a1, 0xc0ab), |
1551 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4), | 1551 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4), |
1552 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff), | 1552 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff), |
1553 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae), | 1553 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae), |
1554 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033), | 1554 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033), |
1555 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58), | 1555 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58), |
1556 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555), | 1556 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555), |
1557 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), | 1557 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), |
1558 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f), | 1558 | PCMCIA_PFC_DEVICE_PROD_ID12(0, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f), |
1559 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c), | 1559 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c), |
1560 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3), | 1560 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3), |
1561 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15), | 1561 | PCMCIA_MFC_DEVICE_PROD_ID12(0, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15), |
1562 | PCMCIA_MFC_DEVICE_PROD_ID123(0, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f), | 1562 | PCMCIA_MFC_DEVICE_PROD_ID123(0, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f), |
1563 | PCMCIA_MFC_DEVICE_PROD_ID2(0, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302), | 1563 | PCMCIA_MFC_DEVICE_PROD_ID2(0, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302), |
1564 | PCMCIA_DEVICE_MANF_CARD(0x0057, 0x1004), | 1564 | PCMCIA_DEVICE_MANF_CARD(0x0057, 0x1004), |
1565 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x000d), | 1565 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x000d), |
1566 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0075), | 1566 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0075), |
1567 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0145), | 1567 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0145), |
1568 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0x0230), | 1568 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0x0230), |
1569 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530), | 1569 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0x4530), |
1570 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab), | 1570 | PCMCIA_DEVICE_MANF_CARD(0x0149, 0xc1ab), |
1571 | PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110), | 1571 | PCMCIA_DEVICE_MANF_CARD(0x0186, 0x0110), |
1572 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328), | 1572 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x2328), |
1573 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041), | 1573 | PCMCIA_DEVICE_MANF_CARD(0x01bf, 0x8041), |
1574 | PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452), | 1574 | PCMCIA_DEVICE_MANF_CARD(0x0213, 0x2452), |
1575 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300), | 1575 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0300), |
1576 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0307), | 1576 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x0307), |
1577 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030a), | 1577 | PCMCIA_DEVICE_MANF_CARD(0x026f, 0x030a), |
1578 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1103), | 1578 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1103), |
1579 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1121), | 1579 | PCMCIA_DEVICE_MANF_CARD(0x0274, 0x1121), |
1580 | PCMCIA_DEVICE_PROD_ID12("2408LAN", "Ethernet", 0x352fff7f, 0x00b2e941), | 1580 | PCMCIA_DEVICE_PROD_ID12("2408LAN", "Ethernet", 0x352fff7f, 0x00b2e941), |
1581 | PCMCIA_DEVICE_PROD_ID1234("Socket", "CF 10/100 Ethernet Card", "Revision B", "05/11/06", 0xb38bcc2e, 0x4de88352, 0xeaca6c8d, 0x7e57c22e), | 1581 | PCMCIA_DEVICE_PROD_ID1234("Socket", "CF 10/100 Ethernet Card", "Revision B", "05/11/06", 0xb38bcc2e, 0x4de88352, 0xeaca6c8d, 0x7e57c22e), |
1582 | PCMCIA_DEVICE_PROD_ID123("Cardwell", "PCMCIA", "ETHERNET", 0x9533672e, 0x281f1c5d, 0x3ff7175b), | 1582 | PCMCIA_DEVICE_PROD_ID123("Cardwell", "PCMCIA", "ETHERNET", 0x9533672e, 0x281f1c5d, 0x3ff7175b), |
1583 | PCMCIA_DEVICE_PROD_ID123("CNet ", "CN30BC", "ETHERNET", 0x9fe55d3d, 0x85601198, 0x3ff7175b), | 1583 | PCMCIA_DEVICE_PROD_ID123("CNet ", "CN30BC", "ETHERNET", 0x9fe55d3d, 0x85601198, 0x3ff7175b), |
1584 | PCMCIA_DEVICE_PROD_ID123("Digital", "Ethernet", "Adapter", 0x9999ab35, 0x00b2e941, 0x4b0d829e), | 1584 | PCMCIA_DEVICE_PROD_ID123("Digital", "Ethernet", "Adapter", 0x9999ab35, 0x00b2e941, 0x4b0d829e), |
1585 | PCMCIA_DEVICE_PROD_ID123("Edimax Technology Inc.", "PCMCIA", "Ethernet Card", 0x738a0019, 0x281f1c5d, 0x5e9d92c0), | 1585 | PCMCIA_DEVICE_PROD_ID123("Edimax Technology Inc.", "PCMCIA", "Ethernet Card", 0x738a0019, 0x281f1c5d, 0x5e9d92c0), |
1586 | PCMCIA_DEVICE_PROD_ID123("EFA ", "EFA207", "ETHERNET", 0x3d294be4, 0xeb9aab6c, 0x3ff7175b), | 1586 | PCMCIA_DEVICE_PROD_ID123("EFA ", "EFA207", "ETHERNET", 0x3d294be4, 0xeb9aab6c, 0x3ff7175b), |
1587 | PCMCIA_DEVICE_PROD_ID123("I-O DATA", "PCLA", "ETHERNET", 0x1d55d7ec, 0xe4c64d34, 0x3ff7175b), | 1587 | PCMCIA_DEVICE_PROD_ID123("I-O DATA", "PCLA", "ETHERNET", 0x1d55d7ec, 0xe4c64d34, 0x3ff7175b), |
1588 | PCMCIA_DEVICE_PROD_ID123("IO DATA", "PCLATE", "ETHERNET", 0x547e66dc, 0x6b260753, 0x3ff7175b), | 1588 | PCMCIA_DEVICE_PROD_ID123("IO DATA", "PCLATE", "ETHERNET", 0x547e66dc, 0x6b260753, 0x3ff7175b), |
1589 | PCMCIA_DEVICE_PROD_ID123("KingMax Technology Inc.", "EN10-T2", "PCMCIA Ethernet Card", 0x932b7189, 0x699e4436, 0x6f6652e0), | 1589 | PCMCIA_DEVICE_PROD_ID123("KingMax Technology Inc.", "EN10-T2", "PCMCIA Ethernet Card", 0x932b7189, 0x699e4436, 0x6f6652e0), |
1590 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2216", 0x281f1c5d, 0xd4cd2f20, 0xb87add82), | 1590 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2216", 0x281f1c5d, 0xd4cd2f20, 0xb87add82), |
1591 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2620", 0x281f1c5d, 0xd4cd2f20, 0x7d3d83a8), | 1591 | PCMCIA_DEVICE_PROD_ID123("PCMCIA", "PCMCIA-ETHERNET-CARD", "UE2620", 0x281f1c5d, 0xd4cd2f20, 0x7d3d83a8), |
1592 | PCMCIA_DEVICE_PROD_ID1("2412LAN", 0x67f236ab), | 1592 | PCMCIA_DEVICE_PROD_ID1("2412LAN", 0x67f236ab), |
1593 | PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11), | 1593 | PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2212", 0xdfc6b5b2, 0xcb112a11), |
1594 | PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff), | 1594 | PCMCIA_DEVICE_PROD_ID12("ACCTON", "EN2216-PCMCIA-ETHERNET", 0xdfc6b5b2, 0x5542bfff), |
1595 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68), | 1595 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA100-PCM-T V2 100/10M LAN PC Card", 0xbb7fbdd7, 0xcd91cc68), |
1596 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997), | 1596 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA100-PCM V2", 0x36634a66, 0xc6d05997), |
1597 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8), | 1597 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis, K.K.", "CentreCOM LA-PCM_V2", 0xbb7fBdd7, 0x28e299f8), |
1598 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96), | 1598 | PCMCIA_DEVICE_PROD_ID12("Allied Telesis K.K.", "LA-PCM V3", 0x36634a66, 0x62241d96), |
1599 | PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8010", 0x5070a7f9, 0x82f96e96), | 1599 | PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8010", 0x5070a7f9, 0x82f96e96), |
1600 | PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8610", 0x5070a7f9, 0x86741224), | 1600 | PCMCIA_DEVICE_PROD_ID12("AmbiCom", "AMB8610", 0x5070a7f9, 0x86741224), |
1601 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002", 0x93b15570, 0x75ec3efb), | 1601 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002", 0x93b15570, 0x75ec3efb), |
1602 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002T", 0x93b15570, 0x461c5247), | 1602 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8002T", 0x93b15570, 0x461c5247), |
1603 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8010", 0x93b15570, 0x82f96e96), | 1603 | PCMCIA_DEVICE_PROD_ID12("AmbiCom Inc", "AMB8010", 0x93b15570, 0x82f96e96), |
1604 | PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet", 0x578ba6e7, 0x0a9888c1), | 1604 | PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet", 0x578ba6e7, 0x0a9888c1), |
1605 | PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet 10/100", 0x578ba6e7, 0x939fedbd), | 1605 | PCMCIA_DEVICE_PROD_ID12("AnyCom", "ECO Ethernet 10/100", 0x578ba6e7, 0x939fedbd), |
1606 | PCMCIA_DEVICE_PROD_ID12("AROWANA", "PCMCIA Ethernet LAN Card", 0x313adbc8, 0x08d9f190), | 1606 | PCMCIA_DEVICE_PROD_ID12("AROWANA", "PCMCIA Ethernet LAN Card", 0x313adbc8, 0x08d9f190), |
1607 | PCMCIA_DEVICE_PROD_ID12("ASANTE", "FriendlyNet PC Card", 0x3a7ade0f, 0x41c64504), | 1607 | PCMCIA_DEVICE_PROD_ID12("ASANTE", "FriendlyNet PC Card", 0x3a7ade0f, 0x41c64504), |
1608 | PCMCIA_DEVICE_PROD_ID12("Billionton", "LNT-10TB", 0x552ab682, 0xeeb1ba6a), | 1608 | PCMCIA_DEVICE_PROD_ID12("Billionton", "LNT-10TB", 0x552ab682, 0xeeb1ba6a), |
1609 | PCMCIA_DEVICE_PROD_ID12("CF", "10Base-Ethernet", 0x44ebf863, 0x93ae4d79), | 1609 | PCMCIA_DEVICE_PROD_ID12("CF", "10Base-Ethernet", 0x44ebf863, 0x93ae4d79), |
1610 | PCMCIA_DEVICE_PROD_ID12("CNet", "CN40BC Ethernet", 0xbc477dde, 0xfba775a7), | 1610 | PCMCIA_DEVICE_PROD_ID12("CNet", "CN40BC Ethernet", 0xbc477dde, 0xfba775a7), |
1611 | PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "BASEline PCMCIA 10 MBit Ethernetadapter", 0xfa2e424d, 0xe9190d8a), | 1611 | PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "BASEline PCMCIA 10 MBit Ethernetadapter", 0xfa2e424d, 0xe9190d8a), |
1612 | PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "FASTline PCMCIA 10/100 Fast-Ethernet", 0xfa2e424d, 0x3953d9b9), | 1612 | PCMCIA_DEVICE_PROD_ID12("COMPU-SHACK", "FASTline PCMCIA 10/100 Fast-Ethernet", 0xfa2e424d, 0x3953d9b9), |
1613 | PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722), | 1613 | PCMCIA_DEVICE_PROD_ID12("CONTEC", "C-NET(PC)C-10L", 0x21cab552, 0xf6f90722), |
1614 | PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2), | 1614 | PCMCIA_DEVICE_PROD_ID12("corega", "FEther PCC-TXF", 0x0a21501a, 0xa51564a2), |
1615 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd), | 1615 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-T", 0x5261440f, 0xfa9d85bd), |
1616 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), | 1616 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega EtherII PCC-TD", 0x5261440f, 0xc49bd73d), |
1617 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), | 1617 | PCMCIA_DEVICE_PROD_ID12("Corega K.K.", "corega EtherII PCC-TD", 0xd4fdcbd8, 0xc49bd73d), |
1618 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa), | 1618 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-T", 0x5261440f, 0x6705fcaa), |
1619 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-TD", 0x5261440f, 0x47d5ca83), | 1619 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega Ether PCC-TD", 0x5261440f, 0x47d5ca83), |
1620 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9), | 1620 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "corega FastEther PCC-TX", 0x5261440f, 0x485e85d9), |
1621 | PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2), | 1621 | PCMCIA_DEVICE_PROD_ID12("Corega,K.K.", "Ethernet LAN Card", 0x110d26d9, 0x9fd2f0a2), |
1622 | PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2), | 1622 | PCMCIA_DEVICE_PROD_ID12("corega,K.K.", "Ethernet LAN Card", 0x9791a90e, 0x9fd2f0a2), |
1623 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "(CG-LAPCCTXD)", 0x5261440f, 0x73ec0d88), | 1623 | PCMCIA_DEVICE_PROD_ID12("corega K.K.", "(CG-LAPCCTXD)", 0x5261440f, 0x73ec0d88), |
1624 | PCMCIA_DEVICE_PROD_ID12("CouplerlessPCMCIA", "100BASE", 0xee5af0ad, 0x7c2add04), | 1624 | PCMCIA_DEVICE_PROD_ID12("CouplerlessPCMCIA", "100BASE", 0xee5af0ad, 0x7c2add04), |
1625 | PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-010", 0x77008979, 0x9d8d445d), | 1625 | PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-010", 0x77008979, 0x9d8d445d), |
1626 | PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-110E 10/100M LAN Card", 0x77008979, 0xfd184814), | 1626 | PCMCIA_DEVICE_PROD_ID12("CyQ've", "ELA-110E 10/100M LAN Card", 0x77008979, 0xfd184814), |
1627 | PCMCIA_DEVICE_PROD_ID12("DataTrek.", "NetCard ", 0x5cd66d9d, 0x84697ce0), | 1627 | PCMCIA_DEVICE_PROD_ID12("DataTrek.", "NetCard ", 0x5cd66d9d, 0x84697ce0), |
1628 | PCMCIA_DEVICE_PROD_ID12("Dayna Communications, Inc.", "CommuniCard E", 0x0c629325, 0xb4e7dbaf), | 1628 | PCMCIA_DEVICE_PROD_ID12("Dayna Communications, Inc.", "CommuniCard E", 0x0c629325, 0xb4e7dbaf), |
1629 | PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100", 0x697403d8, 0xe160b995), | 1629 | PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100", 0x697403d8, 0xe160b995), |
1630 | PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100 Dongless", 0x697403d8, 0xa6d3b233), | 1630 | PCMCIA_DEVICE_PROD_ID12("Digicom", "Palladio LAN 10/100 Dongless", 0x697403d8, 0xa6d3b233), |
1631 | PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e), | 1631 | PCMCIA_DEVICE_PROD_ID12("DIGITAL", "DEPCM-XX", 0x69616cb3, 0xe600e76e), |
1632 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398), | 1632 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-650", 0x1a424a1c, 0xf28c8398), |
1633 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b), | 1633 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660", 0x1a424a1c, 0xd9a1d05b), |
1634 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660+", 0x1a424a1c, 0x50dcd0ec), | 1634 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DE-660+", 0x1a424a1c, 0x50dcd0ec), |
1635 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9), | 1635 | PCMCIA_DEVICE_PROD_ID12("D-Link", "DFE-650", 0x1a424a1c, 0x0f0073f9), |
1636 | PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84), | 1636 | PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 PC Card", 0x725b842d, 0xf1efee84), |
1637 | PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9), | 1637 | PCMCIA_DEVICE_PROD_ID12("Dual Speed", "10/100 Port Attached PC Card", 0x725b842d, 0x2db1f8e9), |
1638 | PCMCIA_DEVICE_PROD_ID12("Dynalink", "L10BC", 0x55632fd5, 0xdc65f2b1), | 1638 | PCMCIA_DEVICE_PROD_ID12("Dynalink", "L10BC", 0x55632fd5, 0xdc65f2b1), |
1639 | PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10BC", 0x6a26d1cf, 0xdc65f2b1), | 1639 | PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10BC", 0x6a26d1cf, 0xdc65f2b1), |
1640 | PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10C", 0x6a26d1cf, 0xc4f84efb), | 1640 | PCMCIA_DEVICE_PROD_ID12("DYNALINK", "L10C", 0x6a26d1cf, 0xc4f84efb), |
1641 | PCMCIA_DEVICE_PROD_ID12("E-CARD", "E-CARD", 0x6701da11, 0x6701da11), | 1641 | PCMCIA_DEVICE_PROD_ID12("E-CARD", "E-CARD", 0x6701da11, 0x6701da11), |
1642 | PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet 10BaseT card", 0x53c864c6, 0xedd059f6), | 1642 | PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet 10BaseT card", 0x53c864c6, 0xedd059f6), |
1643 | PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet Combo card", 0x53c864c6, 0x929c486c), | 1643 | PCMCIA_DEVICE_PROD_ID12("EIGER Labs Inc.", "Ethernet Combo card", 0x53c864c6, 0x929c486c), |
1644 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "Adapter", 0x00b2e941, 0x4b0d829e), | 1644 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "Adapter", 0x00b2e941, 0x4b0d829e), |
1645 | PCMCIA_DEVICE_PROD_ID12("Ethernet Adapter", "E2000 PCMCIA Ethernet", 0x96767301, 0x71fbbc61), | 1645 | PCMCIA_DEVICE_PROD_ID12("Ethernet Adapter", "E2000 PCMCIA Ethernet", 0x96767301, 0x71fbbc61), |
1646 | PCMCIA_DEVICE_PROD_ID12("Ethernet PCMCIA adapter", "EP-210", 0x8dd86181, 0xf2b52517), | 1646 | PCMCIA_DEVICE_PROD_ID12("Ethernet PCMCIA adapter", "EP-210", 0x8dd86181, 0xf2b52517), |
1647 | PCMCIA_DEVICE_PROD_ID12("Fast Ethernet", "Adapter", 0xb4be14e3, 0x4b0d829e), | 1647 | PCMCIA_DEVICE_PROD_ID12("Fast Ethernet", "Adapter", 0xb4be14e3, 0x4b0d829e), |
1648 | PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2000", 0x2a151fac, 0xf00555cb), | 1648 | PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2000", 0x2a151fac, 0xf00555cb), |
1649 | PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2220", 0x2a151fac, 0xc1b7e327), | 1649 | PCMCIA_DEVICE_PROD_ID12("Grey Cell", "GCS2220", 0x2a151fac, 0xc1b7e327), |
1650 | PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947), | 1650 | PCMCIA_DEVICE_PROD_ID12("GVC", "NIC-2000p", 0x76e171bd, 0x6eb1c947), |
1651 | PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941), | 1651 | PCMCIA_DEVICE_PROD_ID12("IBM Corp.", "Ethernet", 0xe3736c88, 0x00b2e941), |
1652 | PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6), | 1652 | PCMCIA_DEVICE_PROD_ID12("IC-CARD", "IC-CARD", 0x60cb09a6, 0x60cb09a6), |
1653 | PCMCIA_DEVICE_PROD_ID12("IC-CARD+", "IC-CARD+", 0x93693494, 0x93693494), | 1653 | PCMCIA_DEVICE_PROD_ID12("IC-CARD+", "IC-CARD+", 0x93693494, 0x93693494), |
1654 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b), | 1654 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCETTX", 0x547e66dc, 0x6fc5459b), |
1655 | PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0), | 1655 | PCMCIA_DEVICE_PROD_ID12("iPort", "10/100 Ethernet Card", 0x56c538d2, 0x11b0ffc0), |
1656 | PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956), | 1656 | PCMCIA_DEVICE_PROD_ID12("KANSAI ELECTRIC CO.,LTD", "KLA-PCM/T", 0xb18dc3b4, 0xcc51a956), |
1657 | PCMCIA_DEVICE_PROD_ID12("KCI", "PE520 PCMCIA Ethernet Adapter", 0xa89b87d3, 0x1eb88e64), | 1657 | PCMCIA_DEVICE_PROD_ID12("KCI", "PE520 PCMCIA Ethernet Adapter", 0xa89b87d3, 0x1eb88e64), |
1658 | PCMCIA_DEVICE_PROD_ID12("KINGMAX", "EN10T2T", 0x7bcb459a, 0xa5c81fa5), | 1658 | PCMCIA_DEVICE_PROD_ID12("KINGMAX", "EN10T2T", 0x7bcb459a, 0xa5c81fa5), |
1659 | PCMCIA_DEVICE_PROD_ID12("Kingston", "KNE-PC2", 0x1128e633, 0xce2a89b3), | 1659 | PCMCIA_DEVICE_PROD_ID12("Kingston", "KNE-PC2", 0x1128e633, 0xce2a89b3), |
1660 | PCMCIA_DEVICE_PROD_ID12("Kingston Technology Corp.", "EtheRx PC Card Ethernet Adapter", 0x313c7be3, 0x0afb54a2), | 1660 | PCMCIA_DEVICE_PROD_ID12("Kingston Technology Corp.", "EtheRx PC Card Ethernet Adapter", 0x313c7be3, 0x0afb54a2), |
1661 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-10/100CD", 0x1b7827b2, 0xcda71d1c), | 1661 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-10/100CD", 0x1b7827b2, 0xcda71d1c), |
1662 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDF", 0x1b7827b2, 0xfec71e40), | 1662 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDF", 0x1b7827b2, 0xfec71e40), |
1663 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDL/T", 0x1b7827b2, 0x79fba4f7), | 1663 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDL/T", 0x1b7827b2, 0x79fba4f7), |
1664 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDS", 0x1b7827b2, 0x931afaab), | 1664 | PCMCIA_DEVICE_PROD_ID12("Laneed", "LD-CDS", 0x1b7827b2, 0x931afaab), |
1665 | PCMCIA_DEVICE_PROD_ID12("LEMEL", "LM-N89TX PRO", 0xbbefb52f, 0xd2897a97), | 1665 | PCMCIA_DEVICE_PROD_ID12("LEMEL", "LM-N89TX PRO", 0xbbefb52f, 0xd2897a97), |
1666 | PCMCIA_DEVICE_PROD_ID12("Linksys", "Combo PCMCIA EthernetCard (EC2T)", 0x0733cc81, 0x32ee8c78), | 1666 | PCMCIA_DEVICE_PROD_ID12("Linksys", "Combo PCMCIA EthernetCard (EC2T)", 0x0733cc81, 0x32ee8c78), |
1667 | PCMCIA_DEVICE_PROD_ID12("LINKSYS", "E-CARD", 0xf7cb0b07, 0x6701da11), | 1667 | PCMCIA_DEVICE_PROD_ID12("LINKSYS", "E-CARD", 0xf7cb0b07, 0x6701da11), |
1668 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d), | 1668 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 Integrated PC Card (PCM100)", 0x0733cc81, 0x453c3f9d), |
1669 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389), | 1669 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100)", 0x0733cc81, 0x66c5a389), |
1670 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9), | 1670 | PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V2)", 0x0733cc81, 0x3a3b28e9), |
1671 | PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a), | 1671 | PCMCIA_DEVICE_PROD_ID12("Linksys", "HomeLink Phoneline + 10/100 Network PC Card (PCM100H1)", 0x733cc81, 0x7a3e5c3a), |
1672 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737), | 1672 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TX", 0x88fcdeda, 0x6d772737), |
1673 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee), | 1673 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN100TE", 0x88fcdeda, 0x0e714bee), |
1674 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922), | 1674 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN20T", 0x88fcdeda, 0x81090922), |
1675 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN10TE", 0x88fcdeda, 0xc1e2521c), | 1675 | PCMCIA_DEVICE_PROD_ID12("Logitec", "LPM-LN10TE", 0x88fcdeda, 0xc1e2521c), |
1676 | PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0), | 1676 | PCMCIA_DEVICE_PROD_ID12("LONGSHINE", "PCMCIA Ethernet Card", 0xf866b0b0, 0x6f6652e0), |
1677 | PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578), | 1677 | PCMCIA_DEVICE_PROD_ID12("MACNICA", "ME1-JEIDA", 0x20841b68, 0xaf8a3578), |
1678 | PCMCIA_DEVICE_PROD_ID12("Macsense", "MPC-10", 0xd830297f, 0xd265c307), | 1678 | PCMCIA_DEVICE_PROD_ID12("Macsense", "MPC-10", 0xd830297f, 0xd265c307), |
1679 | PCMCIA_DEVICE_PROD_ID12("Matsushita Electric Industrial Co.,LTD.", "CF-VEL211", 0x44445376, 0x8ded41d4), | 1679 | PCMCIA_DEVICE_PROD_ID12("Matsushita Electric Industrial Co.,LTD.", "CF-VEL211", 0x44445376, 0x8ded41d4), |
1680 | PCMCIA_DEVICE_PROD_ID12("MAXTECH", "PCN2000", 0x78d64bc0, 0xca0ca4b8), | 1680 | PCMCIA_DEVICE_PROD_ID12("MAXTECH", "PCN2000", 0x78d64bc0, 0xca0ca4b8), |
1681 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-T", 0x481e0094, 0xa2eb0cf3), | 1681 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-T", 0x481e0094, 0xa2eb0cf3), |
1682 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-TX", 0x481e0094, 0x41a6916c), | 1682 | PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC2-TX", 0x481e0094, 0x41a6916c), |
1683 | PCMCIA_DEVICE_PROD_ID12("Microcom C.E.", "Travel Card LAN 10/100", 0x4b91cec7, 0xe70220d6), | 1683 | PCMCIA_DEVICE_PROD_ID12("Microcom C.E.", "Travel Card LAN 10/100", 0x4b91cec7, 0xe70220d6), |
1684 | PCMCIA_DEVICE_PROD_ID12("Microdyne", "NE4200", 0x2e6da59b, 0x0478e472), | 1684 | PCMCIA_DEVICE_PROD_ID12("Microdyne", "NE4200", 0x2e6da59b, 0x0478e472), |
1685 | PCMCIA_DEVICE_PROD_ID12("MIDORI ELEC.", "LT-PCMT", 0x648d55c1, 0xbde526c7), | 1685 | PCMCIA_DEVICE_PROD_ID12("MIDORI ELEC.", "LT-PCMT", 0x648d55c1, 0xbde526c7), |
1686 | PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover 4100", 0x36e1191f, 0x60c229b9), | 1686 | PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover 4100", 0x36e1191f, 0x60c229b9), |
1687 | PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover NE4100", 0x36e1191f, 0xa6617ec8), | 1687 | PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover NE4100", 0x36e1191f, 0xa6617ec8), |
1688 | PCMCIA_DEVICE_PROD_ID12("NEC", "PC-9801N-J12", 0x18df0ba0, 0xbc912d76), | 1688 | PCMCIA_DEVICE_PROD_ID12("NEC", "PC-9801N-J12", 0x18df0ba0, 0xbc912d76), |
1689 | PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA410TX", 0x9aa79dc3, 0x60e5bc0e), | 1689 | PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA410TX", 0x9aa79dc3, 0x60e5bc0e), |
1690 | PCMCIA_DEVICE_PROD_ID12("Network Everywhere", "Fast Ethernet 10/100 PC Card", 0x820a67b6, 0x31ed1a5f), | 1690 | PCMCIA_DEVICE_PROD_ID12("Network Everywhere", "Fast Ethernet 10/100 PC Card", 0x820a67b6, 0x31ed1a5f), |
1691 | PCMCIA_DEVICE_PROD_ID12("NextCom K.K.", "Next Hawk", 0xaedaec74, 0xad050ef1), | 1691 | PCMCIA_DEVICE_PROD_ID12("NextCom K.K.", "Next Hawk", 0xaedaec74, 0xad050ef1), |
1692 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100Mbps Ethernet Card", 0x281f1c5d, 0x6e41773b), | 1692 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100Mbps Ethernet Card", 0x281f1c5d, 0x6e41773b), |
1693 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet", 0x281f1c5d, 0x00b2e941), | 1693 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet", 0x281f1c5d, 0x00b2e941), |
1694 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET", 0x281f1c5d, 0x3ff7175b), | 1694 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET", 0x281f1c5d, 0x3ff7175b), |
1695 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet 10BaseT Card", 0x281f1c5d, 0x4de2f6c8), | 1695 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet 10BaseT Card", 0x281f1c5d, 0x4de2f6c8), |
1696 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Card", 0x281f1c5d, 0x5e9d92c0), | 1696 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Card", 0x281f1c5d, 0x5e9d92c0), |
1697 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Combo card", 0x281f1c5d, 0x929c486c), | 1697 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Ethernet Combo card", 0x281f1c5d, 0x929c486c), |
1698 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET V1.0", 0x281f1c5d, 0x4d8817c8), | 1698 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "ETHERNET V1.0", 0x281f1c5d, 0x4d8817c8), |
1699 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEthernet", 0x281f1c5d, 0xfe871eeb), | 1699 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEthernet", 0x281f1c5d, 0xfe871eeb), |
1700 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast-Ethernet", 0x281f1c5d, 0x45f1f3b4), | 1700 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "Fast-Ethernet", 0x281f1c5d, 0x45f1f3b4), |
1701 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FAST ETHERNET CARD", 0x281f1c5d, 0xec5dbca7), | 1701 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FAST ETHERNET CARD", 0x281f1c5d, 0xec5dbca7), |
1702 | PCMCIA_DEVICE_PROD_ID12("PCMCIA LAN", "Ethernet", 0x7500e246, 0x00b2e941), | 1702 | PCMCIA_DEVICE_PROD_ID12("PCMCIA LAN", "Ethernet", 0x7500e246, 0x00b2e941), |
1703 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "LNT-10TN", 0x281f1c5d, 0xe707f641), | 1703 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "LNT-10TN", 0x281f1c5d, 0xe707f641), |
1704 | PCMCIA_DEVICE_PROD_ID12("PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), | 1704 | PCMCIA_DEVICE_PROD_ID12("PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), |
1705 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "UE2212", 0x281f1c5d, 0xbf17199b), | 1705 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "UE2212", 0x281f1c5d, 0xbf17199b), |
1706 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", " Ethernet NE2000 Compatible", 0x281f1c5d, 0x42d5d7e1), | 1706 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", " Ethernet NE2000 Compatible", 0x281f1c5d, 0x42d5d7e1), |
1707 | PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10baseT 3.3V", 0xebf91155, 0x30074c80), | 1707 | PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10baseT 3.3V", 0xebf91155, 0x30074c80), |
1708 | PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10BaseT 3.3V", 0xebf91155, 0x7f5a4f50), | 1708 | PCMCIA_DEVICE_PROD_ID12("PRETEC", "Ethernet CompactLAN 10BaseT 3.3V", 0xebf91155, 0x7f5a4f50), |
1709 | PCMCIA_DEVICE_PROD_ID12("Psion Dacom", "Gold Card Ethernet", 0xf5f025c2, 0x3a30e110), | 1709 | PCMCIA_DEVICE_PROD_ID12("Psion Dacom", "Gold Card Ethernet", 0xf5f025c2, 0x3a30e110), |
1710 | PCMCIA_DEVICE_PROD_ID12("=RELIA==", "Ethernet", 0xcdd0644a, 0x00b2e941), | 1710 | PCMCIA_DEVICE_PROD_ID12("=RELIA==", "Ethernet", 0xcdd0644a, 0x00b2e941), |
1711 | PCMCIA_DEVICE_PROD_ID12("RIOS Systems Co.", "PC CARD3 ETHERNET", 0x7dd33481, 0x10b41826), | 1711 | PCMCIA_DEVICE_PROD_ID12("RIOS Systems Co.", "PC CARD3 ETHERNET", 0x7dd33481, 0x10b41826), |
1712 | PCMCIA_DEVICE_PROD_ID12("RP", "1625B Ethernet NE2000 Compatible", 0xe3e66e22, 0xb96150df), | 1712 | PCMCIA_DEVICE_PROD_ID12("RP", "1625B Ethernet NE2000 Compatible", 0xe3e66e22, 0xb96150df), |
1713 | PCMCIA_DEVICE_PROD_ID12("RPTI", "EP400 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4a7e2ae0), | 1713 | PCMCIA_DEVICE_PROD_ID12("RPTI", "EP400 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4a7e2ae0), |
1714 | PCMCIA_DEVICE_PROD_ID12("RPTI", "EP401 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4bcbd7fd), | 1714 | PCMCIA_DEVICE_PROD_ID12("RPTI", "EP401 Ethernet NE2000 Compatible", 0xdc6f88fd, 0x4bcbd7fd), |
1715 | PCMCIA_DEVICE_PROD_ID12("RPTI LTD.", "EP400", 0xc53ac515, 0x81e39388), | 1715 | PCMCIA_DEVICE_PROD_ID12("RPTI LTD.", "EP400", 0xc53ac515, 0x81e39388), |
1716 | PCMCIA_DEVICE_PROD_ID12("SCM", "Ethernet Combo card", 0xbdc3b102, 0x929c486c), | 1716 | PCMCIA_DEVICE_PROD_ID12("SCM", "Ethernet Combo card", 0xbdc3b102, 0x929c486c), |
1717 | PCMCIA_DEVICE_PROD_ID12("Seiko Epson Corp.", "Ethernet", 0x09928730, 0x00b2e941), | 1717 | PCMCIA_DEVICE_PROD_ID12("Seiko Epson Corp.", "Ethernet", 0x09928730, 0x00b2e941), |
1718 | PCMCIA_DEVICE_PROD_ID12("SMC", "EZCard-10-PCMCIA", 0xc4f8b18b, 0xfb21d265), | 1718 | PCMCIA_DEVICE_PROD_ID12("SMC", "EZCard-10-PCMCIA", 0xc4f8b18b, 0xfb21d265), |
1719 | PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision D", 0xc70a4760, 0x2ade483e), | 1719 | PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision D", 0xc70a4760, 0x2ade483e), |
1720 | PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision E", 0xc70a4760, 0x5dd978a8), | 1720 | PCMCIA_DEVICE_PROD_ID12("Socket Communications Inc", "Socket EA PCMCIA LAN Adapter Revision E", 0xc70a4760, 0x5dd978a8), |
1721 | PCMCIA_DEVICE_PROD_ID12("TDK", "LAK-CD031 for PCMCIA", 0x1eae9475, 0x0ed386fa), | 1721 | PCMCIA_DEVICE_PROD_ID12("TDK", "LAK-CD031 for PCMCIA", 0x1eae9475, 0x0ed386fa), |
1722 | PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE450T", 0x466b05f0, 0x8b74bc4f), | 1722 | PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE450T", 0x466b05f0, 0x8b74bc4f), |
1723 | PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE550T", 0x466b05f0, 0x33c8db2a), | 1723 | PCMCIA_DEVICE_PROD_ID12("Telecom Device K.K.", "SuperSocket RE550T", 0x466b05f0, 0x33c8db2a), |
1724 | PCMCIA_DEVICE_PROD_ID13("Hypertec", "EP401", 0x8787bec7, 0xf6e4a31e), | 1724 | PCMCIA_DEVICE_PROD_ID13("Hypertec", "EP401", 0x8787bec7, 0xf6e4a31e), |
1725 | PCMCIA_DEVICE_PROD_ID13("KingMax Technology Inc.", "Ethernet Card", 0x932b7189, 0x5e9d92c0), | 1725 | PCMCIA_DEVICE_PROD_ID13("KingMax Technology Inc.", "Ethernet Card", 0x932b7189, 0x5e9d92c0), |
1726 | PCMCIA_DEVICE_PROD_ID13("LONGSHINE", "EP401", 0xf866b0b0, 0xf6e4a31e), | 1726 | PCMCIA_DEVICE_PROD_ID13("LONGSHINE", "EP401", 0xf866b0b0, 0xf6e4a31e), |
1727 | PCMCIA_DEVICE_PROD_ID13("Xircom", "CFE-10", 0x2e3ee845, 0x22a49f89), | 1727 | PCMCIA_DEVICE_PROD_ID13("Xircom", "CFE-10", 0x2e3ee845, 0x22a49f89), |
1728 | PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360), | 1728 | PCMCIA_DEVICE_PROD_ID1("CyQ've 10 Base-T LAN CARD", 0x94faf360), |
1729 | PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de), | 1729 | PCMCIA_DEVICE_PROD_ID1("EP-210 PCMCIA LAN CARD.", 0x8850b4de), |
1730 | PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f), | 1730 | PCMCIA_DEVICE_PROD_ID1("ETHER-C16", 0x06a8514f), |
1731 | PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a), | 1731 | PCMCIA_DEVICE_PROD_ID1("NE2000 Compatible", 0x75b8ad5a), |
1732 | PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078), | 1732 | PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078), |
1733 | /* too generic! */ | 1733 | /* too generic! */ |
1734 | /* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */ | 1734 | /* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */ |
1735 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"), | 1735 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"), |
1736 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"), | 1736 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"), |
1737 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 1737 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
1738 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 1738 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
1739 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 1739 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
1740 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 1740 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
1741 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 1741 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
1742 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), | 1742 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "cis/DP83903.cis"), |
1743 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), | 1743 | PCMCIA_DEVICE_CIS_MANF_CARD(0xc00f, 0x0002, "cis/LA-PCM.cis"), |
1744 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "PE520.cis"), | 1744 | PCMCIA_DEVICE_CIS_PROD_ID12("KTI", "PE520 PLUS", 0xad180345, 0x9d58d392, "cis/PE520.cis"), |
1745 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), | 1745 | PCMCIA_DEVICE_CIS_PROD_ID12("NDC", "Ethernet", 0x01c43ae1, 0x00b2e941, "cis/NE2K.cis"), |
1746 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"), | 1746 | PCMCIA_DEVICE_CIS_PROD_ID12("PMX ", "PE-200", 0x34f3f1c8, 0x10b59f8c, "cis/PE-200.cis"), |
1747 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), | 1747 | PCMCIA_DEVICE_CIS_PROD_ID12("TAMARACK", "Ethernet", 0xcf434fba, 0x00b2e941, "cis/tamarack.cis"), |
1748 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), | 1748 | PCMCIA_DEVICE_PROD_ID12("Ethernet", "CF Size PC Card", 0x00b2e941, 0x43ac239b), |
1749 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", | 1749 | PCMCIA_DEVICE_PROD_ID123("Fast Ethernet", "CF Size PC Card", "1.0", |
1750 | 0xb4be14e3, 0x43ac239b, 0x0877b627), | 1750 | 0xb4be14e3, 0x43ac239b, 0x0877b627), |
1751 | PCMCIA_DEVICE_NULL | 1751 | PCMCIA_DEVICE_NULL |
1752 | }; | 1752 | }; |
1753 | MODULE_DEVICE_TABLE(pcmcia, pcnet_ids); | 1753 | MODULE_DEVICE_TABLE(pcmcia, pcnet_ids); |
1754 | MODULE_FIRMWARE("cis/PCMLM28.cis"); | 1754 | MODULE_FIRMWARE("cis/PCMLM28.cis"); |
1755 | MODULE_FIRMWARE("cis/DP83903.cis"); | 1755 | MODULE_FIRMWARE("cis/DP83903.cis"); |
1756 | MODULE_FIRMWARE("cis/LA-PCM.cis"); | 1756 | MODULE_FIRMWARE("cis/LA-PCM.cis"); |
1757 | MODULE_FIRMWARE("PE520.cis"); | 1757 | MODULE_FIRMWARE("cis/PE520.cis"); |
1758 | MODULE_FIRMWARE("cis/NE2K.cis"); | 1758 | MODULE_FIRMWARE("cis/NE2K.cis"); |
1759 | MODULE_FIRMWARE("cis/PE-200.cis"); | 1759 | MODULE_FIRMWARE("cis/PE-200.cis"); |
1760 | MODULE_FIRMWARE("cis/tamarack.cis"); | 1760 | MODULE_FIRMWARE("cis/tamarack.cis"); |
1761 | 1761 | ||
1762 | static struct pcmcia_driver pcnet_driver = { | 1762 | static struct pcmcia_driver pcnet_driver = { |
1763 | .drv = { | 1763 | .drv = { |
1764 | .name = "pcnet_cs", | 1764 | .name = "pcnet_cs", |
1765 | }, | 1765 | }, |
1766 | .probe = pcnet_probe, | 1766 | .probe = pcnet_probe, |
1767 | .remove = pcnet_detach, | 1767 | .remove = pcnet_detach, |
1768 | .owner = THIS_MODULE, | 1768 | .owner = THIS_MODULE, |
1769 | .id_table = pcnet_ids, | 1769 | .id_table = pcnet_ids, |
1770 | .suspend = pcnet_suspend, | 1770 | .suspend = pcnet_suspend, |
1771 | .resume = pcnet_resume, | 1771 | .resume = pcnet_resume, |
1772 | }; | 1772 | }; |
1773 | 1773 | ||
1774 | static int __init init_pcnet_cs(void) | 1774 | static int __init init_pcnet_cs(void) |
1775 | { | 1775 | { |
1776 | return pcmcia_register_driver(&pcnet_driver); | 1776 | return pcmcia_register_driver(&pcnet_driver); |
1777 | } | 1777 | } |
1778 | 1778 | ||
1779 | static void __exit exit_pcnet_cs(void) | 1779 | static void __exit exit_pcnet_cs(void) |
1780 | { | 1780 | { |
1781 | pcmcia_unregister_driver(&pcnet_driver); | 1781 | pcmcia_unregister_driver(&pcnet_driver); |
1782 | } | 1782 | } |
1783 | 1783 | ||
1784 | module_init(init_pcnet_cs); | 1784 | module_init(init_pcnet_cs); |
1785 | module_exit(exit_pcnet_cs); | 1785 | module_exit(exit_pcnet_cs); |
1786 | 1786 |
drivers/serial/serial_cs.c
1 | /*====================================================================== | 1 | /*====================================================================== |
2 | 2 | ||
3 | A driver for PCMCIA serial devices | 3 | A driver for PCMCIA serial devices |
4 | 4 | ||
5 | serial_cs.c 1.134 2002/05/04 05:48:53 | 5 | serial_cs.c 1.134 2002/05/04 05:48:53 |
6 | 6 | ||
7 | The contents of this file are subject to the Mozilla Public | 7 | The contents of this file are subject to the Mozilla Public |
8 | License Version 1.1 (the "License"); you may not use this file | 8 | License Version 1.1 (the "License"); you may not use this file |
9 | except in compliance with the License. You may obtain a copy of | 9 | except in compliance with the License. You may obtain a copy of |
10 | the License at http://www.mozilla.org/MPL/ | 10 | the License at http://www.mozilla.org/MPL/ |
11 | 11 | ||
12 | Software distributed under the License is distributed on an "AS | 12 | Software distributed under the License is distributed on an "AS |
13 | IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or | 13 | IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
14 | implied. See the License for the specific language governing | 14 | implied. See the License for the specific language governing |
15 | rights and limitations under the License. | 15 | rights and limitations under the License. |
16 | 16 | ||
17 | The initial developer of the original code is David A. Hinds | 17 | The initial developer of the original code is David A. Hinds |
18 | <dahinds@users.sourceforge.net>. Portions created by David A. Hinds | 18 | <dahinds@users.sourceforge.net>. Portions created by David A. Hinds |
19 | are Copyright (C) 1999 David A. Hinds. All Rights Reserved. | 19 | are Copyright (C) 1999 David A. Hinds. All Rights Reserved. |
20 | 20 | ||
21 | Alternatively, the contents of this file may be used under the | 21 | Alternatively, the contents of this file may be used under the |
22 | terms of the GNU General Public License version 2 (the "GPL"), in which | 22 | terms of the GNU General Public License version 2 (the "GPL"), in which |
23 | case the provisions of the GPL are applicable instead of the | 23 | case the provisions of the GPL are applicable instead of the |
24 | above. If you wish to allow the use of your version of this file | 24 | above. If you wish to allow the use of your version of this file |
25 | only under the terms of the GPL and not to allow others to use | 25 | only under the terms of the GPL and not to allow others to use |
26 | your version of this file under the MPL, indicate your decision | 26 | your version of this file under the MPL, indicate your decision |
27 | by deleting the provisions above and replace them with the notice | 27 | by deleting the provisions above and replace them with the notice |
28 | and other provisions required by the GPL. If you do not delete | 28 | and other provisions required by the GPL. If you do not delete |
29 | the provisions above, a recipient may use your version of this | 29 | the provisions above, a recipient may use your version of this |
30 | file under either the MPL or the GPL. | 30 | file under either the MPL or the GPL. |
31 | 31 | ||
32 | ======================================================================*/ | 32 | ======================================================================*/ |
33 | 33 | ||
34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
35 | #include <linux/moduleparam.h> | 35 | #include <linux/moduleparam.h> |
36 | #include <linux/kernel.h> | 36 | #include <linux/kernel.h> |
37 | #include <linux/init.h> | 37 | #include <linux/init.h> |
38 | #include <linux/ptrace.h> | 38 | #include <linux/ptrace.h> |
39 | #include <linux/slab.h> | 39 | #include <linux/slab.h> |
40 | #include <linux/string.h> | 40 | #include <linux/string.h> |
41 | #include <linux/timer.h> | 41 | #include <linux/timer.h> |
42 | #include <linux/serial_core.h> | 42 | #include <linux/serial_core.h> |
43 | #include <linux/delay.h> | 43 | #include <linux/delay.h> |
44 | #include <linux/major.h> | 44 | #include <linux/major.h> |
45 | #include <asm/io.h> | 45 | #include <asm/io.h> |
46 | #include <asm/system.h> | 46 | #include <asm/system.h> |
47 | 47 | ||
48 | #include <pcmcia/cs_types.h> | 48 | #include <pcmcia/cs_types.h> |
49 | #include <pcmcia/cs.h> | 49 | #include <pcmcia/cs.h> |
50 | #include <pcmcia/cistpl.h> | 50 | #include <pcmcia/cistpl.h> |
51 | #include <pcmcia/ciscode.h> | 51 | #include <pcmcia/ciscode.h> |
52 | #include <pcmcia/ds.h> | 52 | #include <pcmcia/ds.h> |
53 | #include <pcmcia/cisreg.h> | 53 | #include <pcmcia/cisreg.h> |
54 | 54 | ||
55 | #include "8250.h" | 55 | #include "8250.h" |
56 | 56 | ||
57 | 57 | ||
58 | /*====================================================================*/ | 58 | /*====================================================================*/ |
59 | 59 | ||
60 | /* Parameters that can be set with 'insmod' */ | 60 | /* Parameters that can be set with 'insmod' */ |
61 | 61 | ||
62 | /* Enable the speaker? */ | 62 | /* Enable the speaker? */ |
63 | static int do_sound = 1; | 63 | static int do_sound = 1; |
64 | /* Skip strict UART tests? */ | 64 | /* Skip strict UART tests? */ |
65 | static int buggy_uart; | 65 | static int buggy_uart; |
66 | 66 | ||
67 | module_param(do_sound, int, 0444); | 67 | module_param(do_sound, int, 0444); |
68 | module_param(buggy_uart, int, 0444); | 68 | module_param(buggy_uart, int, 0444); |
69 | 69 | ||
70 | /*====================================================================*/ | 70 | /*====================================================================*/ |
71 | 71 | ||
72 | /* Table of multi-port card ID's */ | 72 | /* Table of multi-port card ID's */ |
73 | 73 | ||
74 | struct serial_quirk { | 74 | struct serial_quirk { |
75 | unsigned int manfid; | 75 | unsigned int manfid; |
76 | unsigned int prodid; | 76 | unsigned int prodid; |
77 | int multi; /* 1 = multifunction, > 1 = # ports */ | 77 | int multi; /* 1 = multifunction, > 1 = # ports */ |
78 | void (*config)(struct pcmcia_device *); | 78 | void (*config)(struct pcmcia_device *); |
79 | void (*setup)(struct pcmcia_device *, struct uart_port *); | 79 | void (*setup)(struct pcmcia_device *, struct uart_port *); |
80 | void (*wakeup)(struct pcmcia_device *); | 80 | void (*wakeup)(struct pcmcia_device *); |
81 | int (*post)(struct pcmcia_device *); | 81 | int (*post)(struct pcmcia_device *); |
82 | }; | 82 | }; |
83 | 83 | ||
84 | struct serial_info { | 84 | struct serial_info { |
85 | struct pcmcia_device *p_dev; | 85 | struct pcmcia_device *p_dev; |
86 | int ndev; | 86 | int ndev; |
87 | int multi; | 87 | int multi; |
88 | int slave; | 88 | int slave; |
89 | int manfid; | 89 | int manfid; |
90 | int prodid; | 90 | int prodid; |
91 | int c950ctrl; | 91 | int c950ctrl; |
92 | dev_node_t node[4]; | 92 | dev_node_t node[4]; |
93 | int line[4]; | 93 | int line[4]; |
94 | const struct serial_quirk *quirk; | 94 | const struct serial_quirk *quirk; |
95 | }; | 95 | }; |
96 | 96 | ||
97 | struct serial_cfg_mem { | 97 | struct serial_cfg_mem { |
98 | tuple_t tuple; | 98 | tuple_t tuple; |
99 | cisparse_t parse; | 99 | cisparse_t parse; |
100 | u_char buf[256]; | 100 | u_char buf[256]; |
101 | }; | 101 | }; |
102 | 102 | ||
103 | /* | 103 | /* |
104 | * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6" | 104 | * vers_1 5.0, "Brain Boxes", "2-Port RS232 card", "r6" |
105 | * manfid 0x0160, 0x0104 | 105 | * manfid 0x0160, 0x0104 |
106 | * This card appears to have a 14.7456MHz clock. | 106 | * This card appears to have a 14.7456MHz clock. |
107 | */ | 107 | */ |
108 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) | 108 | static void quirk_setup_brainboxes_0104(struct pcmcia_device *link, struct uart_port *port) |
109 | { | 109 | { |
110 | port->uartclk = 14745600; | 110 | port->uartclk = 14745600; |
111 | } | 111 | } |
112 | 112 | ||
113 | static int quirk_post_ibm(struct pcmcia_device *link) | 113 | static int quirk_post_ibm(struct pcmcia_device *link) |
114 | { | 114 | { |
115 | conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; | 115 | conf_reg_t reg = { 0, CS_READ, 0x800, 0 }; |
116 | int ret; | 116 | int ret; |
117 | 117 | ||
118 | ret = pcmcia_access_configuration_register(link, ®); | 118 | ret = pcmcia_access_configuration_register(link, ®); |
119 | if (ret) | 119 | if (ret) |
120 | goto failed; | 120 | goto failed; |
121 | 121 | ||
122 | reg.Action = CS_WRITE; | 122 | reg.Action = CS_WRITE; |
123 | reg.Value = reg.Value | 1; | 123 | reg.Value = reg.Value | 1; |
124 | ret = pcmcia_access_configuration_register(link, ®); | 124 | ret = pcmcia_access_configuration_register(link, ®); |
125 | if (ret) | 125 | if (ret) |
126 | goto failed; | 126 | goto failed; |
127 | return 0; | 127 | return 0; |
128 | 128 | ||
129 | failed: | 129 | failed: |
130 | return -ENODEV; | 130 | return -ENODEV; |
131 | } | 131 | } |
132 | 132 | ||
133 | /* | 133 | /* |
134 | * Nokia cards are not really multiport cards. Shouldn't this | 134 | * Nokia cards are not really multiport cards. Shouldn't this |
135 | * be handled by setting the quirk entry .multi = 0 | 1 ? | 135 | * be handled by setting the quirk entry .multi = 0 | 1 ? |
136 | */ | 136 | */ |
137 | static void quirk_config_nokia(struct pcmcia_device *link) | 137 | static void quirk_config_nokia(struct pcmcia_device *link) |
138 | { | 138 | { |
139 | struct serial_info *info = link->priv; | 139 | struct serial_info *info = link->priv; |
140 | 140 | ||
141 | if (info->multi > 1) | 141 | if (info->multi > 1) |
142 | info->multi = 1; | 142 | info->multi = 1; |
143 | } | 143 | } |
144 | 144 | ||
145 | static void quirk_wakeup_oxsemi(struct pcmcia_device *link) | 145 | static void quirk_wakeup_oxsemi(struct pcmcia_device *link) |
146 | { | 146 | { |
147 | struct serial_info *info = link->priv; | 147 | struct serial_info *info = link->priv; |
148 | 148 | ||
149 | outb(12, info->c950ctrl + 1); | 149 | outb(12, info->c950ctrl + 1); |
150 | } | 150 | } |
151 | 151 | ||
152 | /* request_region? oxsemi branch does no request_region too... */ | 152 | /* request_region? oxsemi branch does no request_region too... */ |
153 | /* | 153 | /* |
154 | * This sequence is needed to properly initialize MC45 attached to OXCF950. | 154 | * This sequence is needed to properly initialize MC45 attached to OXCF950. |
155 | * I tried decreasing these msleep()s, but it worked properly (survived | 155 | * I tried decreasing these msleep()s, but it worked properly (survived |
156 | * 1000 stop/start operations) with these timeouts (or bigger). | 156 | * 1000 stop/start operations) with these timeouts (or bigger). |
157 | */ | 157 | */ |
158 | static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) | 158 | static void quirk_wakeup_possio_gcc(struct pcmcia_device *link) |
159 | { | 159 | { |
160 | struct serial_info *info = link->priv; | 160 | struct serial_info *info = link->priv; |
161 | unsigned int ctrl = info->c950ctrl; | 161 | unsigned int ctrl = info->c950ctrl; |
162 | 162 | ||
163 | outb(0xA, ctrl + 1); | 163 | outb(0xA, ctrl + 1); |
164 | msleep(100); | 164 | msleep(100); |
165 | outb(0xE, ctrl + 1); | 165 | outb(0xE, ctrl + 1); |
166 | msleep(300); | 166 | msleep(300); |
167 | outb(0xC, ctrl + 1); | 167 | outb(0xC, ctrl + 1); |
168 | msleep(100); | 168 | msleep(100); |
169 | outb(0xE, ctrl + 1); | 169 | outb(0xE, ctrl + 1); |
170 | msleep(200); | 170 | msleep(200); |
171 | outb(0xF, ctrl + 1); | 171 | outb(0xF, ctrl + 1); |
172 | msleep(100); | 172 | msleep(100); |
173 | outb(0xE, ctrl + 1); | 173 | outb(0xE, ctrl + 1); |
174 | msleep(100); | 174 | msleep(100); |
175 | outb(0xC, ctrl + 1); | 175 | outb(0xC, ctrl + 1); |
176 | } | 176 | } |
177 | 177 | ||
178 | /* | 178 | /* |
179 | * Socket Dual IO: this enables irq's for second port | 179 | * Socket Dual IO: this enables irq's for second port |
180 | */ | 180 | */ |
181 | static void quirk_config_socket(struct pcmcia_device *link) | 181 | static void quirk_config_socket(struct pcmcia_device *link) |
182 | { | 182 | { |
183 | struct serial_info *info = link->priv; | 183 | struct serial_info *info = link->priv; |
184 | 184 | ||
185 | if (info->multi) { | 185 | if (info->multi) { |
186 | link->conf.Present |= PRESENT_EXT_STATUS; | 186 | link->conf.Present |= PRESENT_EXT_STATUS; |
187 | link->conf.ExtStatus = ESR_REQ_ATTN_ENA; | 187 | link->conf.ExtStatus = ESR_REQ_ATTN_ENA; |
188 | } | 188 | } |
189 | } | 189 | } |
190 | 190 | ||
191 | static const struct serial_quirk quirks[] = { | 191 | static const struct serial_quirk quirks[] = { |
192 | { | 192 | { |
193 | .manfid = 0x0160, | 193 | .manfid = 0x0160, |
194 | .prodid = 0x0104, | 194 | .prodid = 0x0104, |
195 | .multi = -1, | 195 | .multi = -1, |
196 | .setup = quirk_setup_brainboxes_0104, | 196 | .setup = quirk_setup_brainboxes_0104, |
197 | }, { | 197 | }, { |
198 | .manfid = MANFID_IBM, | 198 | .manfid = MANFID_IBM, |
199 | .prodid = ~0, | 199 | .prodid = ~0, |
200 | .multi = -1, | 200 | .multi = -1, |
201 | .post = quirk_post_ibm, | 201 | .post = quirk_post_ibm, |
202 | }, { | 202 | }, { |
203 | .manfid = MANFID_INTEL, | 203 | .manfid = MANFID_INTEL, |
204 | .prodid = PRODID_INTEL_DUAL_RS232, | 204 | .prodid = PRODID_INTEL_DUAL_RS232, |
205 | .multi = 2, | 205 | .multi = 2, |
206 | }, { | 206 | }, { |
207 | .manfid = MANFID_NATINST, | 207 | .manfid = MANFID_NATINST, |
208 | .prodid = PRODID_NATINST_QUAD_RS232, | 208 | .prodid = PRODID_NATINST_QUAD_RS232, |
209 | .multi = 4, | 209 | .multi = 4, |
210 | }, { | 210 | }, { |
211 | .manfid = MANFID_NOKIA, | 211 | .manfid = MANFID_NOKIA, |
212 | .prodid = ~0, | 212 | .prodid = ~0, |
213 | .multi = -1, | 213 | .multi = -1, |
214 | .config = quirk_config_nokia, | 214 | .config = quirk_config_nokia, |
215 | }, { | 215 | }, { |
216 | .manfid = MANFID_OMEGA, | 216 | .manfid = MANFID_OMEGA, |
217 | .prodid = PRODID_OMEGA_QSP_100, | 217 | .prodid = PRODID_OMEGA_QSP_100, |
218 | .multi = 4, | 218 | .multi = 4, |
219 | }, { | 219 | }, { |
220 | .manfid = MANFID_OXSEMI, | 220 | .manfid = MANFID_OXSEMI, |
221 | .prodid = ~0, | 221 | .prodid = ~0, |
222 | .multi = -1, | 222 | .multi = -1, |
223 | .wakeup = quirk_wakeup_oxsemi, | 223 | .wakeup = quirk_wakeup_oxsemi, |
224 | }, { | 224 | }, { |
225 | .manfid = MANFID_POSSIO, | 225 | .manfid = MANFID_POSSIO, |
226 | .prodid = PRODID_POSSIO_GCC, | 226 | .prodid = PRODID_POSSIO_GCC, |
227 | .multi = -1, | 227 | .multi = -1, |
228 | .wakeup = quirk_wakeup_possio_gcc, | 228 | .wakeup = quirk_wakeup_possio_gcc, |
229 | }, { | 229 | }, { |
230 | .manfid = MANFID_QUATECH, | 230 | .manfid = MANFID_QUATECH, |
231 | .prodid = PRODID_QUATECH_DUAL_RS232, | 231 | .prodid = PRODID_QUATECH_DUAL_RS232, |
232 | .multi = 2, | 232 | .multi = 2, |
233 | }, { | 233 | }, { |
234 | .manfid = MANFID_QUATECH, | 234 | .manfid = MANFID_QUATECH, |
235 | .prodid = PRODID_QUATECH_DUAL_RS232_D1, | 235 | .prodid = PRODID_QUATECH_DUAL_RS232_D1, |
236 | .multi = 2, | 236 | .multi = 2, |
237 | }, { | 237 | }, { |
238 | .manfid = MANFID_QUATECH, | 238 | .manfid = MANFID_QUATECH, |
239 | .prodid = PRODID_QUATECH_DUAL_RS232_G, | 239 | .prodid = PRODID_QUATECH_DUAL_RS232_G, |
240 | .multi = 2, | 240 | .multi = 2, |
241 | }, { | 241 | }, { |
242 | .manfid = MANFID_QUATECH, | 242 | .manfid = MANFID_QUATECH, |
243 | .prodid = PRODID_QUATECH_QUAD_RS232, | 243 | .prodid = PRODID_QUATECH_QUAD_RS232, |
244 | .multi = 4, | 244 | .multi = 4, |
245 | }, { | 245 | }, { |
246 | .manfid = MANFID_SOCKET, | 246 | .manfid = MANFID_SOCKET, |
247 | .prodid = PRODID_SOCKET_DUAL_RS232, | 247 | .prodid = PRODID_SOCKET_DUAL_RS232, |
248 | .multi = 2, | 248 | .multi = 2, |
249 | .config = quirk_config_socket, | 249 | .config = quirk_config_socket, |
250 | }, { | 250 | }, { |
251 | .manfid = MANFID_SOCKET, | 251 | .manfid = MANFID_SOCKET, |
252 | .prodid = ~0, | 252 | .prodid = ~0, |
253 | .multi = -1, | 253 | .multi = -1, |
254 | .config = quirk_config_socket, | 254 | .config = quirk_config_socket, |
255 | } | 255 | } |
256 | }; | 256 | }; |
257 | 257 | ||
258 | 258 | ||
259 | static int serial_config(struct pcmcia_device * link); | 259 | static int serial_config(struct pcmcia_device * link); |
260 | 260 | ||
261 | 261 | ||
262 | /*====================================================================== | 262 | /*====================================================================== |
263 | 263 | ||
264 | After a card is removed, serial_remove() will unregister | 264 | After a card is removed, serial_remove() will unregister |
265 | the serial device(s), and release the PCMCIA configuration. | 265 | the serial device(s), and release the PCMCIA configuration. |
266 | 266 | ||
267 | ======================================================================*/ | 267 | ======================================================================*/ |
268 | 268 | ||
269 | static void serial_remove(struct pcmcia_device *link) | 269 | static void serial_remove(struct pcmcia_device *link) |
270 | { | 270 | { |
271 | struct serial_info *info = link->priv; | 271 | struct serial_info *info = link->priv; |
272 | int i; | 272 | int i; |
273 | 273 | ||
274 | dev_dbg(&link->dev, "serial_release\n"); | 274 | dev_dbg(&link->dev, "serial_release\n"); |
275 | 275 | ||
276 | /* | 276 | /* |
277 | * Recheck to see if the device is still configured. | 277 | * Recheck to see if the device is still configured. |
278 | */ | 278 | */ |
279 | for (i = 0; i < info->ndev; i++) | 279 | for (i = 0; i < info->ndev; i++) |
280 | serial8250_unregister_port(info->line[i]); | 280 | serial8250_unregister_port(info->line[i]); |
281 | 281 | ||
282 | info->p_dev->dev_node = NULL; | 282 | info->p_dev->dev_node = NULL; |
283 | 283 | ||
284 | if (!info->slave) | 284 | if (!info->slave) |
285 | pcmcia_disable_device(link); | 285 | pcmcia_disable_device(link); |
286 | } | 286 | } |
287 | 287 | ||
288 | static int serial_suspend(struct pcmcia_device *link) | 288 | static int serial_suspend(struct pcmcia_device *link) |
289 | { | 289 | { |
290 | struct serial_info *info = link->priv; | 290 | struct serial_info *info = link->priv; |
291 | int i; | 291 | int i; |
292 | 292 | ||
293 | for (i = 0; i < info->ndev; i++) | 293 | for (i = 0; i < info->ndev; i++) |
294 | serial8250_suspend_port(info->line[i]); | 294 | serial8250_suspend_port(info->line[i]); |
295 | 295 | ||
296 | return 0; | 296 | return 0; |
297 | } | 297 | } |
298 | 298 | ||
299 | static int serial_resume(struct pcmcia_device *link) | 299 | static int serial_resume(struct pcmcia_device *link) |
300 | { | 300 | { |
301 | struct serial_info *info = link->priv; | 301 | struct serial_info *info = link->priv; |
302 | int i; | 302 | int i; |
303 | 303 | ||
304 | for (i = 0; i < info->ndev; i++) | 304 | for (i = 0; i < info->ndev; i++) |
305 | serial8250_resume_port(info->line[i]); | 305 | serial8250_resume_port(info->line[i]); |
306 | 306 | ||
307 | if (info->quirk && info->quirk->wakeup) | 307 | if (info->quirk && info->quirk->wakeup) |
308 | info->quirk->wakeup(link); | 308 | info->quirk->wakeup(link); |
309 | 309 | ||
310 | return 0; | 310 | return 0; |
311 | } | 311 | } |
312 | 312 | ||
313 | /*====================================================================== | 313 | /*====================================================================== |
314 | 314 | ||
315 | serial_attach() creates an "instance" of the driver, allocating | 315 | serial_attach() creates an "instance" of the driver, allocating |
316 | local data structures for one device. The device is registered | 316 | local data structures for one device. The device is registered |
317 | with Card Services. | 317 | with Card Services. |
318 | 318 | ||
319 | ======================================================================*/ | 319 | ======================================================================*/ |
320 | 320 | ||
321 | static int serial_probe(struct pcmcia_device *link) | 321 | static int serial_probe(struct pcmcia_device *link) |
322 | { | 322 | { |
323 | struct serial_info *info; | 323 | struct serial_info *info; |
324 | 324 | ||
325 | dev_dbg(&link->dev, "serial_attach()\n"); | 325 | dev_dbg(&link->dev, "serial_attach()\n"); |
326 | 326 | ||
327 | /* Create new serial device */ | 327 | /* Create new serial device */ |
328 | info = kzalloc(sizeof (*info), GFP_KERNEL); | 328 | info = kzalloc(sizeof (*info), GFP_KERNEL); |
329 | if (!info) | 329 | if (!info) |
330 | return -ENOMEM; | 330 | return -ENOMEM; |
331 | info->p_dev = link; | 331 | info->p_dev = link; |
332 | link->priv = info; | 332 | link->priv = info; |
333 | 333 | ||
334 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; | 334 | link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; |
335 | link->io.NumPorts1 = 8; | 335 | link->io.NumPorts1 = 8; |
336 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; | 336 | link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING; |
337 | link->conf.Attributes = CONF_ENABLE_IRQ; | 337 | link->conf.Attributes = CONF_ENABLE_IRQ; |
338 | if (do_sound) { | 338 | if (do_sound) { |
339 | link->conf.Attributes |= CONF_ENABLE_SPKR; | 339 | link->conf.Attributes |= CONF_ENABLE_SPKR; |
340 | link->conf.Status = CCSR_AUDIO_ENA; | 340 | link->conf.Status = CCSR_AUDIO_ENA; |
341 | } | 341 | } |
342 | link->conf.IntType = INT_MEMORY_AND_IO; | 342 | link->conf.IntType = INT_MEMORY_AND_IO; |
343 | 343 | ||
344 | return serial_config(link); | 344 | return serial_config(link); |
345 | } | 345 | } |
346 | 346 | ||
347 | /*====================================================================== | 347 | /*====================================================================== |
348 | 348 | ||
349 | This deletes a driver "instance". The device is de-registered | 349 | This deletes a driver "instance". The device is de-registered |
350 | with Card Services. If it has been released, all local data | 350 | with Card Services. If it has been released, all local data |
351 | structures are freed. Otherwise, the structures will be freed | 351 | structures are freed. Otherwise, the structures will be freed |
352 | when the device is released. | 352 | when the device is released. |
353 | 353 | ||
354 | ======================================================================*/ | 354 | ======================================================================*/ |
355 | 355 | ||
356 | static void serial_detach(struct pcmcia_device *link) | 356 | static void serial_detach(struct pcmcia_device *link) |
357 | { | 357 | { |
358 | struct serial_info *info = link->priv; | 358 | struct serial_info *info = link->priv; |
359 | 359 | ||
360 | dev_dbg(&link->dev, "serial_detach\n"); | 360 | dev_dbg(&link->dev, "serial_detach\n"); |
361 | 361 | ||
362 | /* | 362 | /* |
363 | * Ensure any outstanding scheduled tasks are completed. | 363 | * Ensure any outstanding scheduled tasks are completed. |
364 | */ | 364 | */ |
365 | flush_scheduled_work(); | 365 | flush_scheduled_work(); |
366 | 366 | ||
367 | /* | 367 | /* |
368 | * Ensure that the ports have been released. | 368 | * Ensure that the ports have been released. |
369 | */ | 369 | */ |
370 | serial_remove(link); | 370 | serial_remove(link); |
371 | 371 | ||
372 | /* free bits */ | 372 | /* free bits */ |
373 | kfree(info); | 373 | kfree(info); |
374 | } | 374 | } |
375 | 375 | ||
376 | /*====================================================================*/ | 376 | /*====================================================================*/ |
377 | 377 | ||
378 | static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, | 378 | static int setup_serial(struct pcmcia_device *handle, struct serial_info * info, |
379 | unsigned int iobase, int irq) | 379 | unsigned int iobase, int irq) |
380 | { | 380 | { |
381 | struct uart_port port; | 381 | struct uart_port port; |
382 | int line; | 382 | int line; |
383 | 383 | ||
384 | memset(&port, 0, sizeof (struct uart_port)); | 384 | memset(&port, 0, sizeof (struct uart_port)); |
385 | port.iobase = iobase; | 385 | port.iobase = iobase; |
386 | port.irq = irq; | 386 | port.irq = irq; |
387 | port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; | 387 | port.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | UPF_SHARE_IRQ; |
388 | port.uartclk = 1843200; | 388 | port.uartclk = 1843200; |
389 | port.dev = &handle->dev; | 389 | port.dev = &handle->dev; |
390 | if (buggy_uart) | 390 | if (buggy_uart) |
391 | port.flags |= UPF_BUGGY_UART; | 391 | port.flags |= UPF_BUGGY_UART; |
392 | 392 | ||
393 | if (info->quirk && info->quirk->setup) | 393 | if (info->quirk && info->quirk->setup) |
394 | info->quirk->setup(handle, &port); | 394 | info->quirk->setup(handle, &port); |
395 | 395 | ||
396 | line = serial8250_register_port(&port); | 396 | line = serial8250_register_port(&port); |
397 | if (line < 0) { | 397 | if (line < 0) { |
398 | printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " | 398 | printk(KERN_NOTICE "serial_cs: serial8250_register_port() at " |
399 | "0x%04lx, irq %d failed\n", (u_long)iobase, irq); | 399 | "0x%04lx, irq %d failed\n", (u_long)iobase, irq); |
400 | return -EINVAL; | 400 | return -EINVAL; |
401 | } | 401 | } |
402 | 402 | ||
403 | info->line[info->ndev] = line; | 403 | info->line[info->ndev] = line; |
404 | sprintf(info->node[info->ndev].dev_name, "ttyS%d", line); | 404 | sprintf(info->node[info->ndev].dev_name, "ttyS%d", line); |
405 | info->node[info->ndev].major = TTY_MAJOR; | 405 | info->node[info->ndev].major = TTY_MAJOR; |
406 | info->node[info->ndev].minor = 0x40 + line; | 406 | info->node[info->ndev].minor = 0x40 + line; |
407 | if (info->ndev > 0) | 407 | if (info->ndev > 0) |
408 | info->node[info->ndev - 1].next = &info->node[info->ndev]; | 408 | info->node[info->ndev - 1].next = &info->node[info->ndev]; |
409 | info->ndev++; | 409 | info->ndev++; |
410 | 410 | ||
411 | return 0; | 411 | return 0; |
412 | } | 412 | } |
413 | 413 | ||
414 | /*====================================================================*/ | 414 | /*====================================================================*/ |
415 | 415 | ||
416 | static int simple_config_check(struct pcmcia_device *p_dev, | 416 | static int simple_config_check(struct pcmcia_device *p_dev, |
417 | cistpl_cftable_entry_t *cf, | 417 | cistpl_cftable_entry_t *cf, |
418 | cistpl_cftable_entry_t *dflt, | 418 | cistpl_cftable_entry_t *dflt, |
419 | unsigned int vcc, | 419 | unsigned int vcc, |
420 | void *priv_data) | 420 | void *priv_data) |
421 | { | 421 | { |
422 | static const int size_table[2] = { 8, 16 }; | 422 | static const int size_table[2] = { 8, 16 }; |
423 | int *try = priv_data; | 423 | int *try = priv_data; |
424 | 424 | ||
425 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) | 425 | if (cf->vpp1.present & (1 << CISTPL_POWER_VNOM)) |
426 | p_dev->conf.Vpp = | 426 | p_dev->conf.Vpp = |
427 | cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; | 427 | cf->vpp1.param[CISTPL_POWER_VNOM] / 10000; |
428 | 428 | ||
429 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)]) | 429 | if ((cf->io.nwin > 0) && (cf->io.win[0].len == size_table[(*try >> 1)]) |
430 | && (cf->io.win[0].base != 0)) { | 430 | && (cf->io.win[0].base != 0)) { |
431 | p_dev->io.BasePort1 = cf->io.win[0].base; | 431 | p_dev->io.BasePort1 = cf->io.win[0].base; |
432 | p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ? | 432 | p_dev->io.IOAddrLines = ((*try & 0x1) == 0) ? |
433 | 16 : cf->io.flags & CISTPL_IO_LINES_MASK; | 433 | 16 : cf->io.flags & CISTPL_IO_LINES_MASK; |
434 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 434 | if (!pcmcia_request_io(p_dev, &p_dev->io)) |
435 | return 0; | 435 | return 0; |
436 | } | 436 | } |
437 | return -EINVAL; | 437 | return -EINVAL; |
438 | } | 438 | } |
439 | 439 | ||
440 | static int simple_config_check_notpicky(struct pcmcia_device *p_dev, | 440 | static int simple_config_check_notpicky(struct pcmcia_device *p_dev, |
441 | cistpl_cftable_entry_t *cf, | 441 | cistpl_cftable_entry_t *cf, |
442 | cistpl_cftable_entry_t *dflt, | 442 | cistpl_cftable_entry_t *dflt, |
443 | unsigned int vcc, | 443 | unsigned int vcc, |
444 | void *priv_data) | 444 | void *priv_data) |
445 | { | 445 | { |
446 | static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; | 446 | static const unsigned int base[5] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8, 0x0 }; |
447 | int j; | 447 | int j; |
448 | 448 | ||
449 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { | 449 | if ((cf->io.nwin > 0) && ((cf->io.flags & CISTPL_IO_LINES_MASK) <= 3)) { |
450 | for (j = 0; j < 5; j++) { | 450 | for (j = 0; j < 5; j++) { |
451 | p_dev->io.BasePort1 = base[j]; | 451 | p_dev->io.BasePort1 = base[j]; |
452 | p_dev->io.IOAddrLines = base[j] ? 16 : 3; | 452 | p_dev->io.IOAddrLines = base[j] ? 16 : 3; |
453 | if (!pcmcia_request_io(p_dev, &p_dev->io)) | 453 | if (!pcmcia_request_io(p_dev, &p_dev->io)) |
454 | return 0; | 454 | return 0; |
455 | } | 455 | } |
456 | } | 456 | } |
457 | return -ENODEV; | 457 | return -ENODEV; |
458 | } | 458 | } |
459 | 459 | ||
460 | static int simple_config(struct pcmcia_device *link) | 460 | static int simple_config(struct pcmcia_device *link) |
461 | { | 461 | { |
462 | struct serial_info *info = link->priv; | 462 | struct serial_info *info = link->priv; |
463 | int i = -ENODEV, try; | 463 | int i = -ENODEV, try; |
464 | 464 | ||
465 | /* If the card is already configured, look up the port and irq */ | 465 | /* If the card is already configured, look up the port and irq */ |
466 | if (link->function_config) { | 466 | if (link->function_config) { |
467 | unsigned int port = 0; | 467 | unsigned int port = 0; |
468 | if ((link->io.BasePort2 != 0) && | 468 | if ((link->io.BasePort2 != 0) && |
469 | (link->io.NumPorts2 == 8)) { | 469 | (link->io.NumPorts2 == 8)) { |
470 | port = link->io.BasePort2; | 470 | port = link->io.BasePort2; |
471 | info->slave = 1; | 471 | info->slave = 1; |
472 | } else if ((info->manfid == MANFID_OSITECH) && | 472 | } else if ((info->manfid == MANFID_OSITECH) && |
473 | (link->io.NumPorts1 == 0x40)) { | 473 | (link->io.NumPorts1 == 0x40)) { |
474 | port = link->io.BasePort1 + 0x28; | 474 | port = link->io.BasePort1 + 0x28; |
475 | info->slave = 1; | 475 | info->slave = 1; |
476 | } | 476 | } |
477 | if (info->slave) { | 477 | if (info->slave) { |
478 | return setup_serial(link, info, port, | 478 | return setup_serial(link, info, port, |
479 | link->irq.AssignedIRQ); | 479 | link->irq.AssignedIRQ); |
480 | } | 480 | } |
481 | } | 481 | } |
482 | 482 | ||
483 | /* First pass: look for a config entry that looks normal. | 483 | /* First pass: look for a config entry that looks normal. |
484 | * Two tries: without IO aliases, then with aliases */ | 484 | * Two tries: without IO aliases, then with aliases */ |
485 | for (try = 0; try < 4; try++) | 485 | for (try = 0; try < 4; try++) |
486 | if (!pcmcia_loop_config(link, simple_config_check, &try)) | 486 | if (!pcmcia_loop_config(link, simple_config_check, &try)) |
487 | goto found_port; | 487 | goto found_port; |
488 | 488 | ||
489 | /* Second pass: try to find an entry that isn't picky about | 489 | /* Second pass: try to find an entry that isn't picky about |
490 | its base address, then try to grab any standard serial port | 490 | its base address, then try to grab any standard serial port |
491 | address, and finally try to get any free port. */ | 491 | address, and finally try to get any free port. */ |
492 | if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL)) | 492 | if (!pcmcia_loop_config(link, simple_config_check_notpicky, NULL)) |
493 | goto found_port; | 493 | goto found_port; |
494 | 494 | ||
495 | printk(KERN_NOTICE | 495 | printk(KERN_NOTICE |
496 | "serial_cs: no usable port range found, giving up\n"); | 496 | "serial_cs: no usable port range found, giving up\n"); |
497 | return -1; | 497 | return -1; |
498 | 498 | ||
499 | found_port: | 499 | found_port: |
500 | i = pcmcia_request_irq(link, &link->irq); | 500 | i = pcmcia_request_irq(link, &link->irq); |
501 | if (i != 0) | 501 | if (i != 0) |
502 | link->irq.AssignedIRQ = 0; | 502 | link->irq.AssignedIRQ = 0; |
503 | 503 | ||
504 | if (info->multi && (info->manfid == MANFID_3COM)) | 504 | if (info->multi && (info->manfid == MANFID_3COM)) |
505 | link->conf.ConfigIndex &= ~(0x08); | 505 | link->conf.ConfigIndex &= ~(0x08); |
506 | 506 | ||
507 | /* | 507 | /* |
508 | * Apply any configuration quirks. | 508 | * Apply any configuration quirks. |
509 | */ | 509 | */ |
510 | if (info->quirk && info->quirk->config) | 510 | if (info->quirk && info->quirk->config) |
511 | info->quirk->config(link); | 511 | info->quirk->config(link); |
512 | 512 | ||
513 | i = pcmcia_request_configuration(link, &link->conf); | 513 | i = pcmcia_request_configuration(link, &link->conf); |
514 | if (i != 0) | 514 | if (i != 0) |
515 | return -1; | 515 | return -1; |
516 | return setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); | 516 | return setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); |
517 | } | 517 | } |
518 | 518 | ||
519 | static int multi_config_check(struct pcmcia_device *p_dev, | 519 | static int multi_config_check(struct pcmcia_device *p_dev, |
520 | cistpl_cftable_entry_t *cf, | 520 | cistpl_cftable_entry_t *cf, |
521 | cistpl_cftable_entry_t *dflt, | 521 | cistpl_cftable_entry_t *dflt, |
522 | unsigned int vcc, | 522 | unsigned int vcc, |
523 | void *priv_data) | 523 | void *priv_data) |
524 | { | 524 | { |
525 | int *base2 = priv_data; | 525 | int *base2 = priv_data; |
526 | 526 | ||
527 | /* The quad port cards have bad CIS's, so just look for a | 527 | /* The quad port cards have bad CIS's, so just look for a |
528 | window larger than 8 ports and assume it will be right */ | 528 | window larger than 8 ports and assume it will be right */ |
529 | if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) { | 529 | if ((cf->io.nwin == 1) && (cf->io.win[0].len > 8)) { |
530 | p_dev->io.BasePort1 = cf->io.win[0].base; | 530 | p_dev->io.BasePort1 = cf->io.win[0].base; |
531 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 531 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; |
532 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { | 532 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { |
533 | *base2 = p_dev->io.BasePort1 + 8; | 533 | *base2 = p_dev->io.BasePort1 + 8; |
534 | return 0; | 534 | return 0; |
535 | } | 535 | } |
536 | } | 536 | } |
537 | return -ENODEV; | 537 | return -ENODEV; |
538 | } | 538 | } |
539 | 539 | ||
540 | static int multi_config_check_notpicky(struct pcmcia_device *p_dev, | 540 | static int multi_config_check_notpicky(struct pcmcia_device *p_dev, |
541 | cistpl_cftable_entry_t *cf, | 541 | cistpl_cftable_entry_t *cf, |
542 | cistpl_cftable_entry_t *dflt, | 542 | cistpl_cftable_entry_t *dflt, |
543 | unsigned int vcc, | 543 | unsigned int vcc, |
544 | void *priv_data) | 544 | void *priv_data) |
545 | { | 545 | { |
546 | int *base2 = priv_data; | 546 | int *base2 = priv_data; |
547 | 547 | ||
548 | if (cf->io.nwin == 2) { | 548 | if (cf->io.nwin == 2) { |
549 | p_dev->io.BasePort1 = cf->io.win[0].base; | 549 | p_dev->io.BasePort1 = cf->io.win[0].base; |
550 | p_dev->io.BasePort2 = cf->io.win[1].base; | 550 | p_dev->io.BasePort2 = cf->io.win[1].base; |
551 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; | 551 | p_dev->io.IOAddrLines = cf->io.flags & CISTPL_IO_LINES_MASK; |
552 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { | 552 | if (!pcmcia_request_io(p_dev, &p_dev->io)) { |
553 | *base2 = p_dev->io.BasePort2; | 553 | *base2 = p_dev->io.BasePort2; |
554 | return 0; | 554 | return 0; |
555 | } | 555 | } |
556 | } | 556 | } |
557 | return -ENODEV; | 557 | return -ENODEV; |
558 | } | 558 | } |
559 | 559 | ||
560 | static int multi_config(struct pcmcia_device *link) | 560 | static int multi_config(struct pcmcia_device *link) |
561 | { | 561 | { |
562 | struct serial_info *info = link->priv; | 562 | struct serial_info *info = link->priv; |
563 | int i, base2 = 0; | 563 | int i, base2 = 0; |
564 | 564 | ||
565 | /* First, look for a generic full-sized window */ | 565 | /* First, look for a generic full-sized window */ |
566 | link->io.NumPorts1 = info->multi * 8; | 566 | link->io.NumPorts1 = info->multi * 8; |
567 | if (pcmcia_loop_config(link, multi_config_check, &base2)) { | 567 | if (pcmcia_loop_config(link, multi_config_check, &base2)) { |
568 | /* If that didn't work, look for two windows */ | 568 | /* If that didn't work, look for two windows */ |
569 | link->io.NumPorts1 = link->io.NumPorts2 = 8; | 569 | link->io.NumPorts1 = link->io.NumPorts2 = 8; |
570 | info->multi = 2; | 570 | info->multi = 2; |
571 | if (pcmcia_loop_config(link, multi_config_check_notpicky, | 571 | if (pcmcia_loop_config(link, multi_config_check_notpicky, |
572 | &base2)) { | 572 | &base2)) { |
573 | printk(KERN_NOTICE "serial_cs: no usable port range" | 573 | printk(KERN_NOTICE "serial_cs: no usable port range" |
574 | "found, giving up\n"); | 574 | "found, giving up\n"); |
575 | return -ENODEV; | 575 | return -ENODEV; |
576 | } | 576 | } |
577 | } | 577 | } |
578 | 578 | ||
579 | i = pcmcia_request_irq(link, &link->irq); | 579 | i = pcmcia_request_irq(link, &link->irq); |
580 | if (i != 0) { | 580 | if (i != 0) { |
581 | /* FIXME: comment does not fit, error handling does not fit */ | 581 | /* FIXME: comment does not fit, error handling does not fit */ |
582 | printk(KERN_NOTICE | 582 | printk(KERN_NOTICE |
583 | "serial_cs: no usable port range found, giving up\n"); | 583 | "serial_cs: no usable port range found, giving up\n"); |
584 | link->irq.AssignedIRQ = 0; | 584 | link->irq.AssignedIRQ = 0; |
585 | } | 585 | } |
586 | 586 | ||
587 | /* | 587 | /* |
588 | * Apply any configuration quirks. | 588 | * Apply any configuration quirks. |
589 | */ | 589 | */ |
590 | if (info->quirk && info->quirk->config) | 590 | if (info->quirk && info->quirk->config) |
591 | info->quirk->config(link); | 591 | info->quirk->config(link); |
592 | 592 | ||
593 | i = pcmcia_request_configuration(link, &link->conf); | 593 | i = pcmcia_request_configuration(link, &link->conf); |
594 | if (i != 0) | 594 | if (i != 0) |
595 | return -ENODEV; | 595 | return -ENODEV; |
596 | 596 | ||
597 | /* The Oxford Semiconductor OXCF950 cards are in fact single-port: | 597 | /* The Oxford Semiconductor OXCF950 cards are in fact single-port: |
598 | * 8 registers are for the UART, the others are extra registers. | 598 | * 8 registers are for the UART, the others are extra registers. |
599 | * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too. | 599 | * Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too. |
600 | */ | 600 | */ |
601 | if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO && | 601 | if (info->manfid == MANFID_OXSEMI || (info->manfid == MANFID_POSSIO && |
602 | info->prodid == PRODID_POSSIO_GCC)) { | 602 | info->prodid == PRODID_POSSIO_GCC)) { |
603 | int err; | 603 | int err; |
604 | 604 | ||
605 | if (link->conf.ConfigIndex == 1 || | 605 | if (link->conf.ConfigIndex == 1 || |
606 | link->conf.ConfigIndex == 3) { | 606 | link->conf.ConfigIndex == 3) { |
607 | err = setup_serial(link, info, base2, | 607 | err = setup_serial(link, info, base2, |
608 | link->irq.AssignedIRQ); | 608 | link->irq.AssignedIRQ); |
609 | base2 = link->io.BasePort1; | 609 | base2 = link->io.BasePort1; |
610 | } else { | 610 | } else { |
611 | err = setup_serial(link, info, link->io.BasePort1, | 611 | err = setup_serial(link, info, link->io.BasePort1, |
612 | link->irq.AssignedIRQ); | 612 | link->irq.AssignedIRQ); |
613 | } | 613 | } |
614 | info->c950ctrl = base2; | 614 | info->c950ctrl = base2; |
615 | 615 | ||
616 | /* | 616 | /* |
617 | * FIXME: We really should wake up the port prior to | 617 | * FIXME: We really should wake up the port prior to |
618 | * handing it over to the serial layer. | 618 | * handing it over to the serial layer. |
619 | */ | 619 | */ |
620 | if (info->quirk && info->quirk->wakeup) | 620 | if (info->quirk && info->quirk->wakeup) |
621 | info->quirk->wakeup(link); | 621 | info->quirk->wakeup(link); |
622 | 622 | ||
623 | return 0; | 623 | return 0; |
624 | } | 624 | } |
625 | 625 | ||
626 | setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); | 626 | setup_serial(link, info, link->io.BasePort1, link->irq.AssignedIRQ); |
627 | for (i = 0; i < info->multi - 1; i++) | 627 | for (i = 0; i < info->multi - 1; i++) |
628 | setup_serial(link, info, base2 + (8 * i), | 628 | setup_serial(link, info, base2 + (8 * i), |
629 | link->irq.AssignedIRQ); | 629 | link->irq.AssignedIRQ); |
630 | return 0; | 630 | return 0; |
631 | } | 631 | } |
632 | 632 | ||
633 | static int serial_check_for_multi(struct pcmcia_device *p_dev, | 633 | static int serial_check_for_multi(struct pcmcia_device *p_dev, |
634 | cistpl_cftable_entry_t *cf, | 634 | cistpl_cftable_entry_t *cf, |
635 | cistpl_cftable_entry_t *dflt, | 635 | cistpl_cftable_entry_t *dflt, |
636 | unsigned int vcc, | 636 | unsigned int vcc, |
637 | void *priv_data) | 637 | void *priv_data) |
638 | { | 638 | { |
639 | struct serial_info *info = p_dev->priv; | 639 | struct serial_info *info = p_dev->priv; |
640 | 640 | ||
641 | if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0)) | 641 | if ((cf->io.nwin == 1) && (cf->io.win[0].len % 8 == 0)) |
642 | info->multi = cf->io.win[0].len >> 3; | 642 | info->multi = cf->io.win[0].len >> 3; |
643 | 643 | ||
644 | if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) && | 644 | if ((cf->io.nwin == 2) && (cf->io.win[0].len == 8) && |
645 | (cf->io.win[1].len == 8)) | 645 | (cf->io.win[1].len == 8)) |
646 | info->multi = 2; | 646 | info->multi = 2; |
647 | 647 | ||
648 | return 0; /* break */ | 648 | return 0; /* break */ |
649 | } | 649 | } |
650 | 650 | ||
651 | 651 | ||
652 | /*====================================================================== | 652 | /*====================================================================== |
653 | 653 | ||
654 | serial_config() is scheduled to run after a CARD_INSERTION event | 654 | serial_config() is scheduled to run after a CARD_INSERTION event |
655 | is received, to configure the PCMCIA socket, and to make the | 655 | is received, to configure the PCMCIA socket, and to make the |
656 | serial device available to the system. | 656 | serial device available to the system. |
657 | 657 | ||
658 | ======================================================================*/ | 658 | ======================================================================*/ |
659 | 659 | ||
660 | static int serial_config(struct pcmcia_device * link) | 660 | static int serial_config(struct pcmcia_device * link) |
661 | { | 661 | { |
662 | struct serial_info *info = link->priv; | 662 | struct serial_info *info = link->priv; |
663 | int i; | 663 | int i; |
664 | 664 | ||
665 | dev_dbg(&link->dev, "serial_config\n"); | 665 | dev_dbg(&link->dev, "serial_config\n"); |
666 | 666 | ||
667 | /* Is this a compliant multifunction card? */ | 667 | /* Is this a compliant multifunction card? */ |
668 | info->multi = (link->socket->functions > 1); | 668 | info->multi = (link->socket->functions > 1); |
669 | 669 | ||
670 | /* Is this a multiport card? */ | 670 | /* Is this a multiport card? */ |
671 | info->manfid = link->manf_id; | 671 | info->manfid = link->manf_id; |
672 | info->prodid = link->card_id; | 672 | info->prodid = link->card_id; |
673 | 673 | ||
674 | for (i = 0; i < ARRAY_SIZE(quirks); i++) | 674 | for (i = 0; i < ARRAY_SIZE(quirks); i++) |
675 | if ((quirks[i].manfid == ~0 || | 675 | if ((quirks[i].manfid == ~0 || |
676 | quirks[i].manfid == info->manfid) && | 676 | quirks[i].manfid == info->manfid) && |
677 | (quirks[i].prodid == ~0 || | 677 | (quirks[i].prodid == ~0 || |
678 | quirks[i].prodid == info->prodid)) { | 678 | quirks[i].prodid == info->prodid)) { |
679 | info->quirk = &quirks[i]; | 679 | info->quirk = &quirks[i]; |
680 | break; | 680 | break; |
681 | } | 681 | } |
682 | 682 | ||
683 | /* Another check for dual-serial cards: look for either serial or | 683 | /* Another check for dual-serial cards: look for either serial or |
684 | multifunction cards that ask for appropriate IO port ranges */ | 684 | multifunction cards that ask for appropriate IO port ranges */ |
685 | if ((info->multi == 0) && | 685 | if ((info->multi == 0) && |
686 | (link->has_func_id) && | 686 | (link->has_func_id) && |
687 | ((link->func_id == CISTPL_FUNCID_MULTI) || | 687 | ((link->func_id == CISTPL_FUNCID_MULTI) || |
688 | (link->func_id == CISTPL_FUNCID_SERIAL))) | 688 | (link->func_id == CISTPL_FUNCID_SERIAL))) |
689 | pcmcia_loop_config(link, serial_check_for_multi, info); | 689 | pcmcia_loop_config(link, serial_check_for_multi, info); |
690 | 690 | ||
691 | /* | 691 | /* |
692 | * Apply any multi-port quirk. | 692 | * Apply any multi-port quirk. |
693 | */ | 693 | */ |
694 | if (info->quirk && info->quirk->multi != -1) | 694 | if (info->quirk && info->quirk->multi != -1) |
695 | info->multi = info->quirk->multi; | 695 | info->multi = info->quirk->multi; |
696 | 696 | ||
697 | if (info->multi > 1) | 697 | if (info->multi > 1) |
698 | multi_config(link); | 698 | multi_config(link); |
699 | else | 699 | else |
700 | simple_config(link); | 700 | simple_config(link); |
701 | 701 | ||
702 | if (info->ndev == 0) | 702 | if (info->ndev == 0) |
703 | goto failed; | 703 | goto failed; |
704 | 704 | ||
705 | /* | 705 | /* |
706 | * Apply any post-init quirk. FIXME: This should really happen | 706 | * Apply any post-init quirk. FIXME: This should really happen |
707 | * before we register the port, since it might already be in use. | 707 | * before we register the port, since it might already be in use. |
708 | */ | 708 | */ |
709 | if (info->quirk && info->quirk->post) | 709 | if (info->quirk && info->quirk->post) |
710 | if (info->quirk->post(link)) | 710 | if (info->quirk->post(link)) |
711 | goto failed; | 711 | goto failed; |
712 | 712 | ||
713 | link->dev_node = &info->node[0]; | 713 | link->dev_node = &info->node[0]; |
714 | return 0; | 714 | return 0; |
715 | 715 | ||
716 | failed: | 716 | failed: |
717 | serial_remove(link); | 717 | serial_remove(link); |
718 | return -ENODEV; | 718 | return -ENODEV; |
719 | } | 719 | } |
720 | 720 | ||
721 | static struct pcmcia_device_id serial_ids[] = { | 721 | static struct pcmcia_device_id serial_ids[] = { |
722 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021), | 722 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0057, 0x0021), |
723 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a), | 723 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0089, 0x110a), |
724 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a), | 724 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0104, 0x000a), |
725 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15), | 725 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0xea15), |
726 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501), | 726 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0109, 0x0501), |
727 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a), | 727 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0138, 0x110a), |
728 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a), | 728 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0140, 0x000a), |
729 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341), | 729 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0x3341), |
730 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab), | 730 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0143, 0xc0ab), |
731 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081), | 731 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x016c, 0x0081), |
732 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101), | 732 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x021b, 0x0101), |
733 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab), | 733 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x08a1, 0xc0ab), |
734 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a), | 734 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0d0a), |
735 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a), | 735 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0105, 0x0e0a), |
736 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63), | 736 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3288", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x04cd2988, 0x46a52d63), |
737 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63), | 737 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "CC/XJEM3336", "DATA/FAX/CELL ETHERNET MODEM", 0xf510db04, 0x0143b773, 0x46a52d63), |
738 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef), | 738 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "EM1144T", "PCMCIA MODEM", 0xf510db04, 0x856d66c8, 0xbd6c43ef), |
739 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef), | 739 | PCMCIA_PFC_DEVICE_PROD_ID123(1, "MEGAHERTZ", "XJEM1144/CCEM1144", "PCMCIA MODEM", 0xf510db04, 0x52d21e1e, 0xbd6c43ef), |
740 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea), | 740 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM28", 0x2e3ee845, 0x0ea978ea), |
741 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023), | 741 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM33", 0x2e3ee845, 0x80609023), |
742 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a), | 742 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "CEM56", 0x2e3ee845, 0xa650c32a), |
743 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29), | 743 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "REM10", 0x2e3ee845, 0x76df1d29), |
744 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719), | 744 | PCMCIA_PFC_DEVICE_PROD_ID13(1, "Xircom", "XEM5600", 0x2e3ee845, 0xf1403719), |
745 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4), | 745 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "AnyCom", "Fast Ethernet + 56K COMBO", 0x578ba6e7, 0xb0ac62c4), |
746 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff), | 746 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "D-Link", "DME336T", 0x1a424a1c, 0xb23897ff), |
747 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c), | 747 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Gateway 2000", "XJEM3336", 0xdd9989be, 0x662c394c), |
748 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae), | 748 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Grey Cell", "GCS3000", 0x2a151fac, 0x48b932ae), |
749 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033), | 749 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Linksys", "EtherFast 10&100 + 56K PC Card (PCMLM56)", 0x0733cc81, 0xb3765033), |
750 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58), | 750 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "LINKSYS", "PCMLM336", 0xf7cb0b07, 0x7a821b58), |
751 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e), | 751 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "MEGAHERTZ", "XJEM1144/CCEM1144", 0xf510db04, 0x52d21e1e), |
752 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555), | 752 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "MICRO RESEARCH", "COMBO-L/M-336", 0xb2ced065, 0x3ced0555), |
753 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064), | 753 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "NEC", "PK-UG-J001" ,0x18df0ba0 ,0x831b1064), |
754 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9), | 754 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Diamonds Modem+Ethernet", 0xc2f80cd, 0x656947b9), |
755 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed), | 755 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Ositech", "Trumpcard:Jack of Hearts Modem+Ethernet", 0xc2f80cd, 0xdc9ba5ed), |
756 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), | 756 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "ComboCard", 0xdcfe12d3, 0xcd8906cc), |
757 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f), | 757 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "PCMCIAs", "LanModem", 0xdcfe12d3, 0xc67c648f), |
758 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed), | 758 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "TDK", "GlobalNetworker 3410/3412", 0x1eae9475, 0xd9a93bed), |
759 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf), | 759 | PCMCIA_PFC_DEVICE_PROD_ID12(1, "Xircom", "CreditCard Ethernet+Modem II", 0x2e3ee845, 0xeca401bf), |
760 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05), | 760 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x0a05), |
761 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101), | 761 | PCMCIA_PFC_DEVICE_MANF_CARD(1, 0x0032, 0x1101), |
762 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070), | 762 | PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0104, 0x0070), |
763 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562), | 763 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0101, 0x0562), |
764 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070), | 764 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0104, 0x0070), |
765 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020), | 765 | PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x016c, 0x0020), |
766 | PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f), | 766 | PCMCIA_MFC_DEVICE_PROD_ID123(1, "APEX DATA", "MULTICARD", "ETHERNET-MODEM", 0x11c2da09, 0x7289dc5d, 0xaad95e1f), |
767 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c), | 767 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away 28.8 PC Card ", 0xb569a6e5, 0x5bd4ff2c), |
768 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3), | 768 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "Home and Away Credit Card Adapter", 0xb569a6e5, 0x4bdf15c3), |
769 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15), | 769 | PCMCIA_MFC_DEVICE_PROD_ID12(1, "IBM", "w95 Home and Away Credit Card ", 0xb569a6e5, 0xae911c15), |
770 | PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77), | 770 | PCMCIA_MFC_DEVICE_PROD_ID1(1, "Motorola MARQUIS", 0xf03e4e77), |
771 | PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302), | 771 | PCMCIA_MFC_DEVICE_PROD_ID2(1, "FAX/Modem/Ethernet Combo Card ", 0x1ed59302), |
772 | PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301), | 772 | PCMCIA_DEVICE_MANF_CARD(0x0089, 0x0301), |
773 | PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276), | 773 | PCMCIA_DEVICE_MANF_CARD(0x00a4, 0x0276), |
774 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039), | 774 | PCMCIA_DEVICE_MANF_CARD(0x0101, 0x0039), |
775 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006), | 775 | PCMCIA_DEVICE_MANF_CARD(0x0104, 0x0006), |
776 | PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a), | 776 | PCMCIA_DEVICE_MANF_CARD(0x0105, 0x410a), |
777 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50), | 777 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d50), |
778 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51), | 778 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d51), |
779 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52), | 779 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d52), |
780 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53), | 780 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0x0d53), |
781 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180), | 781 | PCMCIA_DEVICE_MANF_CARD(0x010b, 0xd180), |
782 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e), | 782 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x000e), |
783 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b), | 783 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x001b), |
784 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025), | 784 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0025), |
785 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045), | 785 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0045), |
786 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052), | 786 | PCMCIA_DEVICE_MANF_CARD(0x0137, 0x0052), |
787 | PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae), | 787 | PCMCIA_DEVICE_PROD_ID134("ADV", "TECH", "COMpad-32/85", 0x67459937, 0x916d02ba, 0x8fbe92ae), |
788 | PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef), | 788 | PCMCIA_DEVICE_PROD_ID124("GATEWAY2000", "CC3144", "PCMCIA MODEM", 0x506bccae, 0xcb3685f1, 0xbd6c43ef), |
789 | PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef), | 789 | PCMCIA_DEVICE_PROD_ID14("MEGAHERTZ", "PCMCIA MODEM", 0xf510db04, 0xbd6c43ef), |
790 | PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef), | 790 | PCMCIA_DEVICE_PROD_ID124("TOSHIBA", "T144PF", "PCMCIA MODEM", 0xb4585a1a, 0x7271409c, 0xbd6c43ef), |
791 | PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0), | 791 | PCMCIA_DEVICE_PROD_ID123("FUJITSU", "FC14F ", "MBH10213", 0x6ee5a3d8, 0x30ead12b, 0xb00f05a0), |
792 | PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e), | 792 | PCMCIA_DEVICE_PROD_ID123("Novatel Wireless", "Merlin UMTS Modem", "U630", 0x32607776, 0xd9e73b13, 0xe87332e), |
793 | PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a), | 793 | PCMCIA_DEVICE_PROD_ID13("MEGAHERTZ", "V.34 PCMCIA MODEM", 0xf510db04, 0xbb2cce4a), |
794 | PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02), | 794 | PCMCIA_DEVICE_PROD_ID12("Brain Boxes", "Bluetooth PC Card", 0xee138382, 0xd4ce9b02), |
795 | PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa), | 795 | PCMCIA_DEVICE_PROD_ID12("CIRRUS LOGIC", "FAX MODEM", 0xe625f451, 0xcecd6dfa), |
796 | PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76), | 796 | PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 28800 FAX/DATA MODEM", 0xa3a3062c, 0x8cbd7c76), |
797 | PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95), | 797 | PCMCIA_DEVICE_PROD_ID12("COMPAQ", "PCMCIA 33600 FAX/DATA MODEM", 0xa3a3062c, 0x5a00ce95), |
798 | PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed), | 798 | PCMCIA_DEVICE_PROD_ID12("Computerboards, Inc.", "PCM-COM422", 0xd0b78f51, 0x7e2d49ed), |
799 | PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65), | 799 | PCMCIA_DEVICE_PROD_ID12("Dr. Neuhaus", "FURY CARD 14K4", 0x76942813, 0x8b96ce65), |
800 | PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6), | 800 | PCMCIA_DEVICE_PROD_ID12("Intelligent", "ANGIA FAX/MODEM", 0xb496e65e, 0xf31602a6), |
801 | PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb), | 801 | PCMCIA_DEVICE_PROD_ID12("Intel", "MODEM 2400+", 0x816cc815, 0x412729fb), |
802 | PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f), | 802 | PCMCIA_DEVICE_PROD_ID12("IOTech Inc ", "PCMCIA Dual RS-232 Serial Port Card", 0x3bd2d898, 0x92abc92f), |
803 | PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f), | 803 | PCMCIA_DEVICE_PROD_ID12("MACRONIX", "FAX/MODEM", 0x668388b3, 0x3f9bdf2f), |
804 | PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383), | 804 | PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT1432LT", 0x5f73be51, 0x0b3e2383), |
805 | PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e), | 805 | PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e), |
806 | PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a), | 806 | PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a), |
807 | PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab), | 807 | PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab), |
808 | PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f), | 808 | PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f), |
809 | PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d), | 809 | PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d), |
810 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"), | 810 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"), |
811 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"), | 811 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"), |
812 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), | 812 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"), |
813 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), | 813 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"), |
814 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), | 814 | PCMCIA_PFC_DEVICE_CIS_PROD_ID12(1, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"), |
815 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), | 815 | PCMCIA_MFC_DEVICE_CIS_PROD_ID12(1, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "cis/DP83903.cis"), |
816 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), | 816 | PCMCIA_MFC_DEVICE_CIS_PROD_ID4(1, "NSC MF LAN/Modem", 0x58fc6056, "cis/DP83903.cis"), |
817 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), | 817 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0556, "cis/3CCFEM556.cis"), |
818 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), | 818 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "cis/DP83903.cis"), |
819 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), | 819 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "cis/3CXEM556.cis"), |
820 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), | 820 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "cis/3CXEM556.cis"), |
821 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ | 821 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC850", 0xd85f6206, 0x42a2c018, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC850 3G Network Adapter R1 */ |
822 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC860", 0xd85f6206, 0x698f93db, "cis/SW_8xx_SER.cis"), /* Sierra Wireless AC860 3G Network Adapter R1 */ | ||
822 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ | 823 | PCMCIA_DEVICE_CIS_PROD_ID12("Sierra Wireless", "AC710/AC750", 0xd85f6206, 0x761b11e0, "cis/SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ |
823 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ | 824 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- pre update */ |
824 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ | 825 | PCMCIA_DEVICE_CIS_MANF_CARD(0x013f, 0xa555, "cis/SW_555_SER.cis"), /* Sierra Aircard 555 CDMA 1xrtt Modem -- post update */ |
825 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), | 826 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "cis/MT5634ZLX.cis"), |
826 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), | 827 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-2", 0x96913a85, 0x27ab5437, "cis/COMpad2.cis"), |
827 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), | 828 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"), |
828 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"), | 829 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"), |
829 | PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"), | 830 | PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"), |
830 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "GLOBETROTTER.cis"), | 831 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"), |
831 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b), | 832 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100 1.00.",0x19ca78af,0xf964f42b), |
832 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83), | 833 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL100",0x19ca78af,0x71d98e83), |
833 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232 1.00.",0x19ca78af,0x69fb7490), | 834 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232 1.00.",0x19ca78af,0x69fb7490), |
834 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232",0x19ca78af,0xb6bc0235), | 835 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.","SERIAL CARD: SL232",0x19ca78af,0xb6bc0235), |
835 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232",0x63f2e0bd,0xb9e175d3), | 836 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232",0x63f2e0bd,0xb9e175d3), |
836 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232-5",0x63f2e0bd,0xfce33442), | 837 | PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c2000.","SERIAL CARD: CF232-5",0x63f2e0bd,0xfce33442), |
837 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232",0x3beb8cf2,0x171e7190), | 838 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232",0x3beb8cf2,0x171e7190), |
838 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232-5",0x3beb8cf2,0x20da4262), | 839 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF232-5",0x3beb8cf2,0x20da4262), |
839 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF428",0x3beb8cf2,0xea5dd57d), | 840 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF428",0x3beb8cf2,0xea5dd57d), |
840 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF500",0x3beb8cf2,0xd77255fa), | 841 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: CF500",0x3beb8cf2,0xd77255fa), |
841 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: IC232",0x3beb8cf2,0x6a709903), | 842 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: IC232",0x3beb8cf2,0x6a709903), |
842 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: SL232",0x3beb8cf2,0x18430676), | 843 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: SL232",0x3beb8cf2,0x18430676), |
843 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: XL232",0x3beb8cf2,0x6f933767), | 844 | PCMCIA_DEVICE_PROD_ID12("Elan","Serial Port: XL232",0x3beb8cf2,0x6f933767), |
844 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7), | 845 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7), |
845 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41), | 846 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41), |
846 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029), | 847 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029), |
847 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 848 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
848 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc), | 849 | PCMCIA_MFC_DEVICE_PROD_ID12(0,"Elan","Serial+Parallel Port: SP230",0x3beb8cf2,0xdb9e58bc), |
849 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7), | 850 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: CF332",0x3beb8cf2,0x16dc1ba7), |
850 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41), | 851 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL332",0x3beb8cf2,0x19816c41), |
851 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029), | 852 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL385",0x3beb8cf2,0x64112029), |
852 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 853 | PCMCIA_MFC_DEVICE_PROD_ID12(1,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
853 | PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 854 | PCMCIA_MFC_DEVICE_PROD_ID12(2,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
854 | PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), | 855 | PCMCIA_MFC_DEVICE_PROD_ID12(3,"Elan","Serial Port: SL432",0x3beb8cf2,0x1cce7ac4), |
855 | PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b), | 856 | PCMCIA_DEVICE_MANF_CARD(0x0279, 0x950b), |
856 | /* too generic */ | 857 | /* too generic */ |
857 | /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */ | 858 | /* PCMCIA_MFC_DEVICE_MANF_CARD(0, 0x0160, 0x0002), */ |
858 | /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */ | 859 | /* PCMCIA_MFC_DEVICE_MANF_CARD(1, 0x0160, 0x0002), */ |
859 | PCMCIA_DEVICE_FUNC_ID(2), | 860 | PCMCIA_DEVICE_FUNC_ID(2), |
860 | PCMCIA_DEVICE_NULL, | 861 | PCMCIA_DEVICE_NULL, |
861 | }; | 862 | }; |
862 | MODULE_DEVICE_TABLE(pcmcia, serial_ids); | 863 | MODULE_DEVICE_TABLE(pcmcia, serial_ids); |
864 | |||
865 | MODULE_FIRMWARE("cis/PCMLM28.cis"); | ||
866 | MODULE_FIRMWARE("cis/DP83903.cis"); | ||
867 | MODULE_FIRMWARE("cis/3CCFEM556.cis"); | ||
868 | MODULE_FIRMWARE("cis/3CXEM556.cis"); | ||
869 | MODULE_FIRMWARE("cis/SW_8xx_SER.cis"); | ||
870 | MODULE_FIRMWARE("cis/SW_7xx_SER.cis"); | ||
871 | MODULE_FIRMWARE("cis/SW_555_SER.cis"); | ||
872 | MODULE_FIRMWARE("cis/MT5634ZLX.cis"); | ||
873 | MODULE_FIRMWARE("cis/COMpad2.cis"); | ||
874 | MODULE_FIRMWARE("cis/COMpad4.cis"); | ||
875 | MODULE_FIRMWARE("cis/RS-COM-2P.cis"); | ||
863 | 876 | ||
864 | static struct pcmcia_driver serial_cs_driver = { | 877 | static struct pcmcia_driver serial_cs_driver = { |
865 | .owner = THIS_MODULE, | 878 | .owner = THIS_MODULE, |
866 | .drv = { | 879 | .drv = { |
867 | .name = "serial_cs", | 880 | .name = "serial_cs", |
868 | }, | 881 | }, |
869 | .probe = serial_probe, | 882 | .probe = serial_probe, |
870 | .remove = serial_detach, | 883 | .remove = serial_detach, |
871 | .id_table = serial_ids, | 884 | .id_table = serial_ids, |
872 | .suspend = serial_suspend, | 885 | .suspend = serial_suspend, |
873 | .resume = serial_resume, | 886 | .resume = serial_resume, |
874 | }; | 887 | }; |
875 | 888 | ||
876 | static int __init init_serial_cs(void) | 889 | static int __init init_serial_cs(void) |
877 | { | 890 | { |
878 | return pcmcia_register_driver(&serial_cs_driver); | 891 | return pcmcia_register_driver(&serial_cs_driver); |
879 | } | 892 | } |
880 | 893 | ||
881 | static void __exit exit_serial_cs(void) | 894 | static void __exit exit_serial_cs(void) |
882 | { | 895 | { |
883 | pcmcia_unregister_driver(&serial_cs_driver); | 896 | pcmcia_unregister_driver(&serial_cs_driver); |
884 | } | 897 | } |
885 | 898 | ||
886 | module_init(init_serial_cs); | 899 | module_init(init_serial_cs); |
887 | module_exit(exit_serial_cs); | 900 | module_exit(exit_serial_cs); |
888 | 901 | ||
889 | MODULE_LICENSE("GPL"); | 902 | MODULE_LICENSE("GPL"); |
890 | 903 |
firmware/Makefile
1 | # | 1 | # |
2 | # kbuild file for firmware/ | 2 | # kbuild file for firmware/ |
3 | # | 3 | # |
4 | 4 | ||
5 | # Create $(fwabs) from $(CONFIG_EXTRA_FIRMWARE_DIR) -- if it doesn't have a | 5 | # Create $(fwabs) from $(CONFIG_EXTRA_FIRMWARE_DIR) -- if it doesn't have a |
6 | # leading /, it's relative to $(srctree). | 6 | # leading /, it's relative to $(srctree). |
7 | fwdir := $(subst ",,$(CONFIG_EXTRA_FIRMWARE_DIR)) | 7 | fwdir := $(subst ",,$(CONFIG_EXTRA_FIRMWARE_DIR)) |
8 | fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir)) | 8 | fwabs := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir)) |
9 | 9 | ||
10 | fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE)) | 10 | fw-external-y := $(subst ",,$(CONFIG_EXTRA_FIRMWARE)) |
11 | 11 | ||
12 | # There are three cases to care about: | 12 | # There are three cases to care about: |
13 | # 1. Building kernel with CONFIG_FIRMWARE_IN_KERNEL=y -- $(fw-shipped-y) should | 13 | # 1. Building kernel with CONFIG_FIRMWARE_IN_KERNEL=y -- $(fw-shipped-y) should |
14 | # include the firmware files to include, according to .config | 14 | # include the firmware files to include, according to .config |
15 | # 2. 'make modules_install', which will install firmware for modules, and | 15 | # 2. 'make modules_install', which will install firmware for modules, and |
16 | # _also_ for the in-kernel drivers when CONFIG_FIRMWARE_IN_KERNEL=n | 16 | # _also_ for the in-kernel drivers when CONFIG_FIRMWARE_IN_KERNEL=n |
17 | # 3. 'make firmware_install', which installs all firmware, unconditionally. | 17 | # 3. 'make firmware_install', which installs all firmware, unconditionally. |
18 | 18 | ||
19 | # For the former two cases we want $(fw-shipped-y) and $(fw-shipped-m) to be | 19 | # For the former two cases we want $(fw-shipped-y) and $(fw-shipped-m) to be |
20 | # accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all). | 20 | # accurate. In the latter case it doesn't matter -- it'll use $(fw-shipped-all). |
21 | # But be aware that the config file might not be included at all. | 21 | # But be aware that the config file might not be included at all. |
22 | 22 | ||
23 | ifdef CONFIG_ACENIC_OMIT_TIGON_I | 23 | ifdef CONFIG_ACENIC_OMIT_TIGON_I |
24 | acenic-objs := acenic/tg2.bin | 24 | acenic-objs := acenic/tg2.bin |
25 | fw-shipped- += acenic/tg1.bin | 25 | fw-shipped- += acenic/tg1.bin |
26 | else | 26 | else |
27 | acenic-objs := acenic/tg1.bin acenic/tg2.bin | 27 | acenic-objs := acenic/tg1.bin acenic/tg2.bin |
28 | endif | 28 | endif |
29 | fw-shipped-$(CONFIG_3C359) += 3com/3C359.bin | 29 | fw-shipped-$(CONFIG_3C359) += 3com/3C359.bin |
30 | fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs) | 30 | fw-shipped-$(CONFIG_ACENIC) += $(acenic-objs) |
31 | fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \ | 31 | fw-shipped-$(CONFIG_ADAPTEC_STARFIRE) += adaptec/starfire_rx.bin \ |
32 | adaptec/starfire_tx.bin | 32 | adaptec/starfire_tx.bin |
33 | fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin | 33 | fw-shipped-$(CONFIG_ATARI_DSP56K) += dsp56k/bootstrap.bin |
34 | fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw | 34 | fw-shipped-$(CONFIG_ATM_AMBASSADOR) += atmsar11.fw |
35 | fw-shipped-$(CONFIG_BNX2X) += bnx2x-e1-5.2.7.0.fw bnx2x-e1h-5.2.7.0.fw | 35 | fw-shipped-$(CONFIG_BNX2X) += bnx2x-e1-5.2.7.0.fw bnx2x-e1h-5.2.7.0.fw |
36 | fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j3.fw \ | 36 | fw-shipped-$(CONFIG_BNX2) += bnx2/bnx2-mips-09-5.0.0.j3.fw \ |
37 | bnx2/bnx2-rv2p-09-5.0.0.j3.fw \ | 37 | bnx2/bnx2-rv2p-09-5.0.0.j3.fw \ |
38 | bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw \ | 38 | bnx2/bnx2-rv2p-09ax-5.0.0.j3.fw \ |
39 | bnx2/bnx2-mips-06-5.0.0.j3.fw \ | 39 | bnx2/bnx2-mips-06-5.0.0.j3.fw \ |
40 | bnx2/bnx2-rv2p-06-5.0.0.j3.fw | 40 | bnx2/bnx2-rv2p-06-5.0.0.j3.fw |
41 | fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin | 41 | fw-shipped-$(CONFIG_CASSINI) += sun/cassini.bin |
42 | fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin | 42 | fw-shipped-$(CONFIG_COMPUTONE) += intelliport2.bin |
43 | fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ | 43 | fw-shipped-$(CONFIG_CHELSIO_T3) += cxgb3/t3b_psram-1.1.0.bin \ |
44 | cxgb3/t3c_psram-1.1.0.bin \ | 44 | cxgb3/t3c_psram-1.1.0.bin \ |
45 | cxgb3/t3fw-7.4.0.bin \ | 45 | cxgb3/t3fw-7.4.0.bin \ |
46 | cxgb3/ael2005_opt_edc.bin \ | 46 | cxgb3/ael2005_opt_edc.bin \ |
47 | cxgb3/ael2005_twx_edc.bin \ | 47 | cxgb3/ael2005_twx_edc.bin \ |
48 | cxgb3/ael2020_twx_edc.bin | 48 | cxgb3/ael2020_twx_edc.bin |
49 | fw-shipped-$(CONFIG_DRM_MGA) += matrox/g200_warp.fw matrox/g400_warp.fw | 49 | fw-shipped-$(CONFIG_DRM_MGA) += matrox/g200_warp.fw matrox/g400_warp.fw |
50 | fw-shipped-$(CONFIG_DRM_R128) += r128/r128_cce.bin | 50 | fw-shipped-$(CONFIG_DRM_R128) += r128/r128_cce.bin |
51 | fw-shipped-$(CONFIG_DRM_RADEON) += radeon/R100_cp.bin radeon/R200_cp.bin \ | 51 | fw-shipped-$(CONFIG_DRM_RADEON) += radeon/R100_cp.bin radeon/R200_cp.bin \ |
52 | radeon/R300_cp.bin radeon/R420_cp.bin \ | 52 | radeon/R300_cp.bin radeon/R420_cp.bin \ |
53 | radeon/RS690_cp.bin radeon/RS600_cp.bin \ | 53 | radeon/RS690_cp.bin radeon/RS600_cp.bin \ |
54 | radeon/R520_cp.bin \ | 54 | radeon/R520_cp.bin \ |
55 | radeon/R600_pfp.bin radeon/R600_me.bin \ | 55 | radeon/R600_pfp.bin radeon/R600_me.bin \ |
56 | radeon/RV610_pfp.bin radeon/RV610_me.bin \ | 56 | radeon/RV610_pfp.bin radeon/RV610_me.bin \ |
57 | radeon/RV630_pfp.bin radeon/RV630_me.bin \ | 57 | radeon/RV630_pfp.bin radeon/RV630_me.bin \ |
58 | radeon/RV620_pfp.bin radeon/RV620_me.bin \ | 58 | radeon/RV620_pfp.bin radeon/RV620_me.bin \ |
59 | radeon/RV635_pfp.bin radeon/RV635_me.bin \ | 59 | radeon/RV635_pfp.bin radeon/RV635_me.bin \ |
60 | radeon/RV670_pfp.bin radeon/RV670_me.bin \ | 60 | radeon/RV670_pfp.bin radeon/RV670_me.bin \ |
61 | radeon/RS780_pfp.bin radeon/RS780_me.bin \ | 61 | radeon/RS780_pfp.bin radeon/RS780_me.bin \ |
62 | radeon/RV770_pfp.bin radeon/RV770_me.bin \ | 62 | radeon/RV770_pfp.bin radeon/RV770_me.bin \ |
63 | radeon/RV730_pfp.bin radeon/RV730_me.bin \ | 63 | radeon/RV730_pfp.bin radeon/RV730_me.bin \ |
64 | radeon/RV710_pfp.bin radeon/RV710_me.bin | 64 | radeon/RV710_pfp.bin radeon/RV710_me.bin |
65 | fw-shipped-$(CONFIG_DVB_AV7110) += av7110/bootcode.bin | 65 | fw-shipped-$(CONFIG_DVB_AV7110) += av7110/bootcode.bin |
66 | fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin | 66 | fw-shipped-$(CONFIG_DVB_TTUSB_BUDGET) += ttusb-budget/dspbootcode.bin |
67 | fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ | 67 | fw-shipped-$(CONFIG_E100) += e100/d101m_ucode.bin e100/d101s_ucode.bin \ |
68 | e100/d102e_ucode.bin | 68 | e100/d102e_ucode.bin |
69 | fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin | 69 | fw-shipped-$(CONFIG_MYRI_SBUS) += myricom/lanai.bin |
70 | fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \ | 70 | fw-shipped-$(CONFIG_PCMCIA_PCNET) += cis/LA-PCM.cis cis/PCMLM28.cis \ |
71 | cis/DP83903.cis cis/NE2K.cis \ | 71 | cis/DP83903.cis cis/NE2K.cis \ |
72 | cis/tamarack.cis cis/PE-200.cis | 72 | cis/tamarack.cis cis/PE-200.cis \ |
73 | cis/PE520.cis | ||
73 | fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis | 74 | fw-shipped-$(CONFIG_PCMCIA_3C589) += cis/3CXEM556.cis |
74 | fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis | 75 | fw-shipped-$(CONFIG_PCMCIA_3C574) += cis/3CCFEM556.cis |
75 | fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \ | 76 | fw-shipped-$(CONFIG_SERIAL_8250_CS) += cis/MT5634ZLX.cis cis/RS-COM-2P.cis \ |
76 | cis/COMpad2.cis cis/COMpad4.cis \ | 77 | cis/COMpad2.cis cis/COMpad4.cis \ |
77 | cis/SW_555_SER.cis cis/SW_7xx_SER.cis \ | 78 | cis/SW_555_SER.cis cis/SW_7xx_SER.cis \ |
78 | cis/SW_8xx_SER.cis | 79 | cis/SW_8xx_SER.cis |
79 | fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin | 80 | fw-shipped-$(CONFIG_PCMCIA_SMC91C92) += ositech/Xilinx7OD.bin |
80 | fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ | 81 | fw-shipped-$(CONFIG_SCSI_ADVANSYS) += advansys/mcode.bin advansys/38C1600.bin \ |
81 | advansys/3550.bin advansys/38C0800.bin | 82 | advansys/3550.bin advansys/38C0800.bin |
82 | fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \ | 83 | fw-shipped-$(CONFIG_SCSI_QLOGIC_1280) += qlogic/1040.bin qlogic/1280.bin \ |
83 | qlogic/12160.bin | 84 | qlogic/12160.bin |
84 | fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin | 85 | fw-shipped-$(CONFIG_SCSI_QLOGICPTI) += qlogic/isp1000.bin |
85 | fw-shipped-$(CONFIG_SMCTR) += tr_smctr.bin | 86 | fw-shipped-$(CONFIG_SMCTR) += tr_smctr.bin |
86 | fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp | 87 | fw-shipped-$(CONFIG_SND_KORG1212) += korg/k1212.dsp |
87 | fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \ | 88 | fw-shipped-$(CONFIG_SND_MAESTRO3) += ess/maestro3_assp_kernel.fw \ |
88 | ess/maestro3_assp_minisrc.fw | 89 | ess/maestro3_assp_minisrc.fw |
89 | fw-shipped-$(CONFIG_SND_SB16_CSP) += sb16/mulaw_main.csp sb16/alaw_main.csp \ | 90 | fw-shipped-$(CONFIG_SND_SB16_CSP) += sb16/mulaw_main.csp sb16/alaw_main.csp \ |
90 | sb16/ima_adpcm_init.csp \ | 91 | sb16/ima_adpcm_init.csp \ |
91 | sb16/ima_adpcm_playback.csp \ | 92 | sb16/ima_adpcm_playback.csp \ |
92 | sb16/ima_adpcm_capture.csp | 93 | sb16/ima_adpcm_capture.csp |
93 | fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \ | 94 | fw-shipped-$(CONFIG_SND_YMFPCI) += yamaha/ds1_ctrl.fw yamaha/ds1_dsp.fw \ |
94 | yamaha/ds1e_ctrl.fw | 95 | yamaha/ds1e_ctrl.fw |
95 | fw-shipped-$(CONFIG_SND_WAVEFRONT) += yamaha/yss225_registers.bin | 96 | fw-shipped-$(CONFIG_SND_WAVEFRONT) += yamaha/yss225_registers.bin |
96 | fw-shipped-$(CONFIG_TEHUTI) += tehuti/bdx.bin | 97 | fw-shipped-$(CONFIG_TEHUTI) += tehuti/bdx.bin |
97 | fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \ | 98 | fw-shipped-$(CONFIG_TIGON3) += tigon/tg3.bin tigon/tg3_tso.bin \ |
98 | tigon/tg3_tso5.bin | 99 | tigon/tg3_tso5.bin |
99 | fw-shipped-$(CONFIG_TYPHOON) += 3com/typhoon.bin | 100 | fw-shipped-$(CONFIG_TYPHOON) += 3com/typhoon.bin |
100 | fw-shipped-$(CONFIG_USB_DABUSB) += dabusb/firmware.fw dabusb/bitstream.bin | 101 | fw-shipped-$(CONFIG_USB_DABUSB) += dabusb/firmware.fw dabusb/bitstream.bin |
101 | fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \ | 102 | fw-shipped-$(CONFIG_USB_EMI26) += emi26/loader.fw emi26/firmware.fw \ |
102 | emi26/bitstream.fw | 103 | emi26/bitstream.fw |
103 | fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \ | 104 | fw-shipped-$(CONFIG_USB_EMI62) += emi62/loader.fw emi62/bitstream.fw \ |
104 | emi62/spdif.fw emi62/midi.fw | 105 | emi62/spdif.fw emi62/midi.fw |
105 | fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \ | 106 | fw-shipped-$(CONFIG_USB_KAWETH) += kaweth/new_code.bin kaweth/trigger_code.bin \ |
106 | kaweth/new_code_fix.bin \ | 107 | kaweth/new_code_fix.bin \ |
107 | kaweth/trigger_code_fix.bin | 108 | kaweth/trigger_code_fix.bin |
108 | ifdef CONFIG_FIRMWARE_IN_KERNEL | 109 | ifdef CONFIG_FIRMWARE_IN_KERNEL |
109 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw | 110 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_MPR) += keyspan/mpr.fw |
110 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw | 111 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA18X) += keyspan/usa18x.fw |
111 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19) += keyspan/usa19.fw | 112 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19) += keyspan/usa19.fw |
112 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QI) += keyspan/usa19qi.fw | 113 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QI) += keyspan/usa19qi.fw |
113 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QW) += keyspan/usa19qw.fw | 114 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19QW) += keyspan/usa19qw.fw |
114 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19W) += keyspan/usa19w.fw | 115 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA19W) += keyspan/usa19w.fw |
115 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28) += keyspan/usa28.fw | 116 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28) += keyspan/usa28.fw |
116 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XA) += keyspan/usa28xa.fw | 117 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XA) += keyspan/usa28xa.fw |
117 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XB) += keyspan/usa28xb.fw | 118 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28XB) += keyspan/usa28xb.fw |
118 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28X) += keyspan/usa28x.fw | 119 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA28X) += keyspan/usa28x.fw |
119 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49W) += keyspan/usa49w.fw | 120 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49W) += keyspan/usa49w.fw |
120 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49WLC) += keyspan/usa49wlc.fw | 121 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_USA49WLC) += keyspan/usa49wlc.fw |
121 | else | 122 | else |
122 | fw-shipped- += keyspan/mpr.fw keyspan/usa18x.fw keyspan/usa19.fw \ | 123 | fw-shipped- += keyspan/mpr.fw keyspan/usa18x.fw keyspan/usa19.fw \ |
123 | keyspan/usa19qi.fw keyspan/usa19qw.fw keyspan/usa19w.fw \ | 124 | keyspan/usa19qi.fw keyspan/usa19qw.fw keyspan/usa19w.fw \ |
124 | keyspan/usa28.fw keyspan/usa28xa.fw keyspan/usa28xb.fw \ | 125 | keyspan/usa28.fw keyspan/usa28xa.fw keyspan/usa28xb.fw \ |
125 | keyspan/usa28x.fw keyspan/usa49w.fw keyspan/usa49wlc.fw | 126 | keyspan/usa28x.fw keyspan/usa49w.fw keyspan/usa49wlc.fw |
126 | endif | 127 | endif |
127 | fw-shipped-$(CONFIG_USB_SERIAL_TI) += ti_3410.fw ti_5052.fw \ | 128 | fw-shipped-$(CONFIG_USB_SERIAL_TI) += ti_3410.fw ti_5052.fw \ |
128 | mts_cdma.fw mts_gsm.fw mts_edge.fw | 129 | mts_cdma.fw mts_gsm.fw mts_edge.fw |
129 | fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT) += edgeport/boot.fw edgeport/boot2.fw \ | 130 | fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT) += edgeport/boot.fw edgeport/boot2.fw \ |
130 | edgeport/down.fw edgeport/down2.fw | 131 | edgeport/down.fw edgeport/down2.fw |
131 | fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += edgeport/down3.bin | 132 | fw-shipped-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += edgeport/down3.bin |
132 | fw-shipped-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat_loader.fw whiteheat.fw \ | 133 | fw-shipped-$(CONFIG_USB_SERIAL_WHITEHEAT) += whiteheat_loader.fw whiteheat.fw \ |
133 | # whiteheat_loader_debug.fw | 134 | # whiteheat_loader_debug.fw |
134 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda/keyspan_pda.fw | 135 | fw-shipped-$(CONFIG_USB_SERIAL_KEYSPAN_PDA) += keyspan_pda/keyspan_pda.fw |
135 | fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw | 136 | fw-shipped-$(CONFIG_USB_SERIAL_XIRCOM) += keyspan_pda/xircom_pgs.fw |
136 | fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw | 137 | fw-shipped-$(CONFIG_USB_VICAM) += vicam/firmware.fw |
137 | fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin | 138 | fw-shipped-$(CONFIG_VIDEO_CPIA2) += cpia2/stv0672_vp4.bin |
138 | fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin | 139 | fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin |
139 | 140 | ||
140 | fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-) | 141 | fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-) |
141 | 142 | ||
142 | # Directories which we _might_ need to create, so we have a rule for them. | 143 | # Directories which we _might_ need to create, so we have a rule for them. |
143 | firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(fw-external-y) $(fw-shipped-all)))) | 144 | firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(fw-external-y) $(fw-shipped-all)))) |
144 | 145 | ||
145 | quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@) | 146 | quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@) |
146 | cmd_mkdir = mkdir -p $@ | 147 | cmd_mkdir = mkdir -p $@ |
147 | 148 | ||
148 | quiet_cmd_ihex = IHEX $@ | 149 | quiet_cmd_ihex = IHEX $@ |
149 | cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@ | 150 | cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@ |
150 | 151 | ||
151 | quiet_cmd_ihex2fw = IHEX2FW $@ | 152 | quiet_cmd_ihex2fw = IHEX2FW $@ |
152 | cmd_ihex2fw = $(objtree)/$(obj)/ihex2fw $< $@ | 153 | cmd_ihex2fw = $(objtree)/$(obj)/ihex2fw $< $@ |
153 | 154 | ||
154 | quiet_cmd_h16tofw = H16TOFW $@ | 155 | quiet_cmd_h16tofw = H16TOFW $@ |
155 | cmd_h16tofw = $(objtree)/$(obj)/ihex2fw -w $< $@ | 156 | cmd_h16tofw = $(objtree)/$(obj)/ihex2fw -w $< $@ |
156 | 157 | ||
157 | quiet_cmd_fwbin = MK_FW $@ | 158 | quiet_cmd_fwbin = MK_FW $@ |
158 | cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \ | 159 | cmd_fwbin = FWNAME="$(patsubst firmware/%.gen.S,%,$@)"; \ |
159 | FWSTR="$(subst /,_,$(subst .,_,$(subst -,_,$(patsubst \ | 160 | FWSTR="$(subst /,_,$(subst .,_,$(subst -,_,$(patsubst \ |
160 | firmware/%.gen.S,%,$@))))"; \ | 161 | firmware/%.gen.S,%,$@))))"; \ |
161 | ASM_WORD=$(if $(CONFIG_64BIT),.quad,.long); \ | 162 | ASM_WORD=$(if $(CONFIG_64BIT),.quad,.long); \ |
162 | ASM_ALIGN=$(if $(CONFIG_64BIT),3,2); \ | 163 | ASM_ALIGN=$(if $(CONFIG_64BIT),3,2); \ |
163 | PROGBITS=$(if $(CONFIG_ARM),%,@)progbits; \ | 164 | PROGBITS=$(if $(CONFIG_ARM),%,@)progbits; \ |
164 | echo "/* Generated by firmware/Makefile */" > $@;\ | 165 | echo "/* Generated by firmware/Makefile */" > $@;\ |
165 | echo " .section .rodata" >>$@;\ | 166 | echo " .section .rodata" >>$@;\ |
166 | echo " .p2align $${ASM_ALIGN}" >>$@;\ | 167 | echo " .p2align $${ASM_ALIGN}" >>$@;\ |
167 | echo "_fw_$${FWSTR}_bin:" >>$@;\ | 168 | echo "_fw_$${FWSTR}_bin:" >>$@;\ |
168 | echo " .incbin \"$(2)\"" >>$@;\ | 169 | echo " .incbin \"$(2)\"" >>$@;\ |
169 | echo "_fw_end:" >>$@;\ | 170 | echo "_fw_end:" >>$@;\ |
170 | echo " .section .rodata.str,\"aMS\",$${PROGBITS},1" >>$@;\ | 171 | echo " .section .rodata.str,\"aMS\",$${PROGBITS},1" >>$@;\ |
171 | echo " .p2align $${ASM_ALIGN}" >>$@;\ | 172 | echo " .p2align $${ASM_ALIGN}" >>$@;\ |
172 | echo "_fw_$${FWSTR}_name:" >>$@;\ | 173 | echo "_fw_$${FWSTR}_name:" >>$@;\ |
173 | echo " .string \"$$FWNAME\"" >>$@;\ | 174 | echo " .string \"$$FWNAME\"" >>$@;\ |
174 | echo " .section .builtin_fw,\"a\",$${PROGBITS}" >>$@;\ | 175 | echo " .section .builtin_fw,\"a\",$${PROGBITS}" >>$@;\ |
175 | echo " .p2align $${ASM_ALIGN}" >>$@;\ | 176 | echo " .p2align $${ASM_ALIGN}" >>$@;\ |
176 | echo " $${ASM_WORD} _fw_$${FWSTR}_name" >>$@;\ | 177 | echo " $${ASM_WORD} _fw_$${FWSTR}_name" >>$@;\ |
177 | echo " $${ASM_WORD} _fw_$${FWSTR}_bin" >>$@;\ | 178 | echo " $${ASM_WORD} _fw_$${FWSTR}_bin" >>$@;\ |
178 | echo " $${ASM_WORD} _fw_end - _fw_$${FWSTR}_bin" >>$@; | 179 | echo " $${ASM_WORD} _fw_end - _fw_$${FWSTR}_bin" >>$@; |
179 | 180 | ||
180 | # One of these files will change, or come into existence, whenever | 181 | # One of these files will change, or come into existence, whenever |
181 | # the configuration changes between 32-bit and 64-bit. The .S files | 182 | # the configuration changes between 32-bit and 64-bit. The .S files |
182 | # need to change when that happens. | 183 | # need to change when that happens. |
183 | wordsize_deps := $(wildcard include/config/64bit.h include/config/32bit.h \ | 184 | wordsize_deps := $(wildcard include/config/64bit.h include/config/32bit.h \ |
184 | include/config/ppc32.h include/config/ppc64.h \ | 185 | include/config/ppc32.h include/config/ppc64.h \ |
185 | include/config/superh32.h include/config/superh64.h \ | 186 | include/config/superh32.h include/config/superh64.h \ |
186 | include/config/x86_32.h include/config/x86_64.h) | 187 | include/config/x86_32.h include/config/x86_64.h) |
187 | 188 | ||
188 | # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work. | 189 | # Workaround for make < 3.81, where .SECONDEXPANSION doesn't work. |
189 | # It'll end up depending on these targets, so make them a PHONY rule which | 190 | # It'll end up depending on these targets, so make them a PHONY rule which |
190 | # depends on _all_ the directories in $(firmware-dirs), and it'll work out OK. | 191 | # depends on _all_ the directories in $(firmware-dirs), and it'll work out OK. |
191 | PHONY += $(objtree)/$$(%) $(objtree)/$(obj)/$$(%) | 192 | PHONY += $(objtree)/$$(%) $(objtree)/$(obj)/$$(%) |
192 | $(objtree)/$$(%) $(objtree)/$(obj)/$$(%): $(firmware-dirs) | 193 | $(objtree)/$$(%) $(objtree)/$(obj)/$$(%): $(firmware-dirs) |
193 | @true | 194 | @true |
194 | 195 | ||
195 | # For the $$(dir %) trick, where we need % to be expanded first. | 196 | # For the $$(dir %) trick, where we need % to be expanded first. |
196 | .SECONDEXPANSION: | 197 | .SECONDEXPANSION: |
197 | 198 | ||
198 | $(patsubst %,$(obj)/%.gen.S, $(fw-shipped-y)): %: $(wordsize_deps) \ | 199 | $(patsubst %,$(obj)/%.gen.S, $(fw-shipped-y)): %: $(wordsize_deps) \ |
199 | | $(objtree)/$$(dir %) | 200 | | $(objtree)/$$(dir %) |
200 | $(call cmd,fwbin,$(patsubst %.gen.S,%,$@)) | 201 | $(call cmd,fwbin,$(patsubst %.gen.S,%,$@)) |
201 | $(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \ | 202 | $(patsubst %,$(obj)/%.gen.S, $(fw-external-y)): %: $(wordsize_deps) \ |
202 | include/config/extra/firmware/dir.h | $(objtree)/$$(dir %) | 203 | include/config/extra/firmware/dir.h | $(objtree)/$$(dir %) |
203 | $(call cmd,fwbin,$(fwabs)/$(patsubst $(obj)/%.gen.S,%,$@)) | 204 | $(call cmd,fwbin,$(fwabs)/$(patsubst $(obj)/%.gen.S,%,$@)) |
204 | 205 | ||
205 | # The .o files depend on the binaries directly; the .S files don't. | 206 | # The .o files depend on the binaries directly; the .S files don't. |
206 | $(patsubst %,$(obj)/%.gen.o, $(fw-shipped-y)): %.gen.o: % | 207 | $(patsubst %,$(obj)/%.gen.o, $(fw-shipped-y)): %.gen.o: % |
207 | $(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/% | 208 | $(patsubst %,$(obj)/%.gen.o, $(fw-external-y)): $(obj)/%.gen.o: $(fwdir)/% |
208 | 209 | ||
209 | # .ihex is used just as a simple way to hold binary files in a source tree | 210 | # .ihex is used just as a simple way to hold binary files in a source tree |
210 | # where binaries are frowned upon. They are directly converted with objcopy. | 211 | # where binaries are frowned upon. They are directly converted with objcopy. |
211 | $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) | 212 | $(obj)/%: $(obj)/%.ihex | $(objtree)/$(obj)/$$(dir %) |
212 | $(call cmd,ihex) | 213 | $(call cmd,ihex) |
213 | 214 | ||
214 | # Don't depend on ihex2fw if we're installing and it already exists. | 215 | # Don't depend on ihex2fw if we're installing and it already exists. |
215 | # Putting it after | in the dependencies doesn't seem sufficient when | 216 | # Putting it after | in the dependencies doesn't seem sufficient when |
216 | # we're installing after a cross-compile, because ihex2fw has dependencies | 217 | # we're installing after a cross-compile, because ihex2fw has dependencies |
217 | # on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and | 218 | # on stuff like /usr/lib/gcc/ppc64-redhat-linux/4.3.0/include/stddef.h and |
218 | # thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree | 219 | # thus wants to be rebuilt. Which it can't be, if the prebuilt kernel tree |
219 | # is exported read-only for someone to run 'make install'. | 220 | # is exported read-only for someone to run 'make install'. |
220 | ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw) | 221 | ifeq ($(INSTALL):$(wildcard $(obj)/ihex2fw),install:$(obj)/ihex2fw) |
221 | ihex2fw_dep := | 222 | ihex2fw_dep := |
222 | else | 223 | else |
223 | ihex2fw_dep := $(obj)/ihex2fw | 224 | ihex2fw_dep := $(obj)/ihex2fw |
224 | endif | 225 | endif |
225 | 226 | ||
226 | # .HEX is also Intel HEX, but where the offset and length in each record | 227 | # .HEX is also Intel HEX, but where the offset and length in each record |
227 | # is actually meaningful, because the firmware has to be loaded in a certain | 228 | # is actually meaningful, because the firmware has to be loaded in a certain |
228 | # order rather than as a single binary blob. Thus, we convert them into our | 229 | # order rather than as a single binary blob. Thus, we convert them into our |
229 | # more compact binary representation of ihex records (<linux/ihex.h>) | 230 | # more compact binary representation of ihex records (<linux/ihex.h>) |
230 | $(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) | 231 | $(obj)/%.fw: $(obj)/%.HEX $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) |
231 | $(call cmd,ihex2fw) | 232 | $(call cmd,ihex2fw) |
232 | 233 | ||
233 | # .H16 is our own modified form of Intel HEX, with 16-bit length for records. | 234 | # .H16 is our own modified form of Intel HEX, with 16-bit length for records. |
234 | $(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) | 235 | $(obj)/%.fw: $(obj)/%.H16 $(ihex2fw_dep) | $(objtree)/$(obj)/$$(dir %) |
235 | $(call cmd,h16tofw) | 236 | $(call cmd,h16tofw) |
236 | 237 | ||
237 | $(firmware-dirs): | 238 | $(firmware-dirs): |
238 | $(call cmd,mkdir) | 239 | $(call cmd,mkdir) |
239 | 240 | ||
240 | obj-y += $(patsubst %,%.gen.o, $(fw-external-y)) | 241 | obj-y += $(patsubst %,%.gen.o, $(fw-external-y)) |
241 | obj-$(CONFIG_FIRMWARE_IN_KERNEL) += $(patsubst %,%.gen.o, $(fw-shipped-y)) | 242 | obj-$(CONFIG_FIRMWARE_IN_KERNEL) += $(patsubst %,%.gen.o, $(fw-shipped-y)) |
242 | 243 | ||
243 | # Remove .S files and binaries created from ihex | 244 | # Remove .S files and binaries created from ihex |
244 | # (during 'make clean' .config isn't included so they're all in $(fw-shipped-)) | 245 | # (during 'make clean' .config isn't included so they're all in $(fw-shipped-)) |
245 | targets := $(fw-shipped-) $(patsubst $(obj)/%,%, \ | 246 | targets := $(fw-shipped-) $(patsubst $(obj)/%,%, \ |
246 | $(shell find $(obj) -name \*.gen.S 2>/dev/null)) | 247 | $(shell find $(obj) -name \*.gen.S 2>/dev/null)) |
247 | 248 | ||
248 | # Without this, built-in.o won't be created when it's empty, and the | 249 | # Without this, built-in.o won't be created when it's empty, and the |
249 | # final vmlinux link will fail. | 250 | # final vmlinux link will fail. |
250 | obj-n := dummy | 251 | obj-n := dummy |
251 | 252 | ||
252 | hostprogs-y := ihex2fw | 253 | hostprogs-y := ihex2fw |
253 | 254 |
firmware/WHENCE
1 | ********** | 1 | ********** |
2 | * WHENCE * | 2 | * WHENCE * |
3 | ********** | 3 | ********** |
4 | 4 | ||
5 | This file attempts to document the origin and licensing information, | 5 | This file attempts to document the origin and licensing information, |
6 | if known, for each piece of firmware distributed for use with the Linux | 6 | if known, for each piece of firmware distributed for use with the Linux |
7 | kernel. | 7 | kernel. |
8 | 8 | ||
9 | -------------------------------------------------------------------------- | 9 | -------------------------------------------------------------------------- |
10 | 10 | ||
11 | Driver: ambassador -- Madge Ambassador (Collage PCI 155 Server) ATM NIC. | 11 | Driver: ambassador -- Madge Ambassador (Collage PCI 155 Server) ATM NIC. |
12 | 12 | ||
13 | File: firmware/atmsar11.fw | 13 | File: firmware/atmsar11.fw |
14 | 14 | ||
15 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 15 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
16 | 16 | ||
17 | Madge Ambassador ATM Adapter microcode. | 17 | Madge Ambassador ATM Adapter microcode. |
18 | Copyright (C) 1995-1999 Madge Networks Ltd. | 18 | Copyright (C) 1995-1999 Madge Networks Ltd. |
19 | 19 | ||
20 | This microcode data is placed under the terms of the GNU General | 20 | This microcode data is placed under the terms of the GNU General |
21 | Public License. The GPL is contained in /usr/doc/copyright/GPL on a | 21 | Public License. The GPL is contained in /usr/doc/copyright/GPL on a |
22 | Debian system and in the file COPYING in the Linux kernel source. | 22 | Debian system and in the file COPYING in the Linux kernel source. |
23 | 23 | ||
24 | We would prefer you not to distribute modified versions without | 24 | We would prefer you not to distribute modified versions without |
25 | consultation and not to ask for assembly/other microcode source. | 25 | consultation and not to ask for assembly/other microcode source. |
26 | 26 | ||
27 | -------------------------------------------------------------------------- | 27 | -------------------------------------------------------------------------- |
28 | 28 | ||
29 | Driver: korg1212 -- Korg 1212 IO audio device | 29 | Driver: korg1212 -- Korg 1212 IO audio device |
30 | 30 | ||
31 | File: korg/k1212.dsp | 31 | File: korg/k1212.dsp |
32 | 32 | ||
33 | Licence: Unknown | 33 | Licence: Unknown |
34 | 34 | ||
35 | Found in alsa-firmware package in hex form; no licensing information. | 35 | Found in alsa-firmware package in hex form; no licensing information. |
36 | 36 | ||
37 | -------------------------------------------------------------------------- | 37 | -------------------------------------------------------------------------- |
38 | 38 | ||
39 | Driver: maestro3 -- ESS Allegro Maestro3 audio device | 39 | Driver: maestro3 -- ESS Allegro Maestro3 audio device |
40 | 40 | ||
41 | File: ess/maestro3_assp_kernel.fw | 41 | File: ess/maestro3_assp_kernel.fw |
42 | File: ess/maestro3_assp_minisrc.fw | 42 | File: ess/maestro3_assp_minisrc.fw |
43 | 43 | ||
44 | Licence: Unknown | 44 | Licence: Unknown |
45 | 45 | ||
46 | Found in alsa-firmware package in hex form with a comment claiming to | 46 | Found in alsa-firmware package in hex form with a comment claiming to |
47 | be GPLv2+, but without source -- and with another comment saying "ESS | 47 | be GPLv2+, but without source -- and with another comment saying "ESS |
48 | drops binary dsp code images on our heads, but we don't get to see | 48 | drops binary dsp code images on our heads, but we don't get to see |
49 | specs on the dsp." | 49 | specs on the dsp." |
50 | 50 | ||
51 | -------------------------------------------------------------------------- | 51 | -------------------------------------------------------------------------- |
52 | 52 | ||
53 | Driver: ymfpci -- Yamaha YMF724/740/744/754 audio devices | 53 | Driver: ymfpci -- Yamaha YMF724/740/744/754 audio devices |
54 | 54 | ||
55 | File: yamaha/ds1_ctrl.fw | 55 | File: yamaha/ds1_ctrl.fw |
56 | File: yamaha/ds1_dsp.fw | 56 | File: yamaha/ds1_dsp.fw |
57 | File: yamaha/ds1e_ctrl.fw | 57 | File: yamaha/ds1e_ctrl.fw |
58 | 58 | ||
59 | Licence: Unknown | 59 | Licence: Unknown |
60 | 60 | ||
61 | Found alsa-firmware package in hex form, with the following comment: | 61 | Found alsa-firmware package in hex form, with the following comment: |
62 | Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved. | 62 | Copyright (c) 1997-1999 Yamaha Corporation. All Rights Reserved. |
63 | 63 | ||
64 | -------------------------------------------------------------------------- | 64 | -------------------------------------------------------------------------- |
65 | 65 | ||
66 | Driver: SCSI_ADVANSYS - AdvanSys SCSI | 66 | Driver: SCSI_ADVANSYS - AdvanSys SCSI |
67 | 67 | ||
68 | File: advansys/mcode.bin | 68 | File: advansys/mcode.bin |
69 | File: advansys/3550.bin | 69 | File: advansys/3550.bin |
70 | File: advansys/38C0800.bin | 70 | File: advansys/38C0800.bin |
71 | File: advansys/38C1600.bin | 71 | File: advansys/38C1600.bin |
72 | 72 | ||
73 | Licence: BSD, no source available. | 73 | Licence: BSD, no source available. |
74 | 74 | ||
75 | Found in hex form in kernel source. | 75 | Found in hex form in kernel source. |
76 | 76 | ||
77 | -------------------------------------------------------------------------- | 77 | -------------------------------------------------------------------------- |
78 | 78 | ||
79 | Driver: SCSI_QLOGIC_1280 - Qlogic QLA 1240/1x80/1x160 SCSI support | 79 | Driver: SCSI_QLOGIC_1280 - Qlogic QLA 1240/1x80/1x160 SCSI support |
80 | 80 | ||
81 | File: qlogic/1040.bin | 81 | File: qlogic/1040.bin |
82 | File: qlogic/1280.bin | 82 | File: qlogic/1280.bin |
83 | File: qlogic/12160.bin | 83 | File: qlogic/12160.bin |
84 | 84 | ||
85 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 85 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
86 | 86 | ||
87 | QLOGIC LINUX SOFTWARE | 87 | QLOGIC LINUX SOFTWARE |
88 | QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x | 88 | QLogic ISP1280/ device driver for Linux 2.2.x and 2.4.x |
89 | Copyright (C) 2001 Qlogic Corporation (www.qlogic.com) | 89 | Copyright (C) 2001 Qlogic Corporation (www.qlogic.com) |
90 | 90 | ||
91 | -------------------------------------------------------------------------- | 91 | -------------------------------------------------------------------------- |
92 | Driver: smctr -- SMC ISA/MCA Token Ring adapter | 92 | Driver: smctr -- SMC ISA/MCA Token Ring adapter |
93 | 93 | ||
94 | File: tr_smctr.bin | 94 | File: tr_smctr.bin |
95 | Info: MCT.BIN v6.3C1 03/01/95 | 95 | Info: MCT.BIN v6.3C1 03/01/95 |
96 | 96 | ||
97 | Original licence info: | 97 | Original licence info: |
98 | 98 | ||
99 | * This firmware is licensed to you strictly for use in conjunction | 99 | * This firmware is licensed to you strictly for use in conjunction |
100 | * with the use of SMC TokenRing adapters. There is no waranty | 100 | * with the use of SMC TokenRing adapters. There is no waranty |
101 | * expressed or implied about its fitness for any purpose. | 101 | * expressed or implied about its fitness for any purpose. |
102 | 102 | ||
103 | -------------------------------------------------------------------------- | 103 | -------------------------------------------------------------------------- |
104 | 104 | ||
105 | Driver: kaweth -- USB KLSI KL5USB101-based Ethernet device | 105 | Driver: kaweth -- USB KLSI KL5USB101-based Ethernet device |
106 | 106 | ||
107 | File: kaweth/new_code.bin | 107 | File: kaweth/new_code.bin |
108 | File: kaweth/new_code_fix.bin | 108 | File: kaweth/new_code_fix.bin |
109 | File: kaweth/trigger_code.bin | 109 | File: kaweth/trigger_code.bin |
110 | File: kaweth/trigger_code_fix.bin | 110 | File: kaweth/trigger_code_fix.bin |
111 | 111 | ||
112 | Licence: Unknown | 112 | Licence: Unknown |
113 | 113 | ||
114 | Found in hex form in the kernel source. | 114 | Found in hex form in the kernel source. |
115 | 115 | ||
116 | -------------------------------------------------------------------------- | 116 | -------------------------------------------------------------------------- |
117 | 117 | ||
118 | Driver: ttusb-budget -- Technotrend/Hauppauge Nova-USB devices | 118 | Driver: ttusb-budget -- Technotrend/Hauppauge Nova-USB devices |
119 | 119 | ||
120 | File: ttusb-budget/dspbootcode.bin | 120 | File: ttusb-budget/dspbootcode.bin |
121 | 121 | ||
122 | Licence: Unknown | 122 | Licence: Unknown |
123 | 123 | ||
124 | Found in hex form in the kernel source. | 124 | Found in hex form in the kernel source. |
125 | 125 | ||
126 | -------------------------------------------------------------------------- | 126 | -------------------------------------------------------------------------- |
127 | 127 | ||
128 | Driver: keyspan -- USB Keyspan USA-xxx serial device | 128 | Driver: keyspan -- USB Keyspan USA-xxx serial device |
129 | 129 | ||
130 | File: keyspan/mpr.fw | 130 | File: keyspan/mpr.fw |
131 | File: keyspan/usa18x.fw | 131 | File: keyspan/usa18x.fw |
132 | File: keyspan/usa19.fw | 132 | File: keyspan/usa19.fw |
133 | File: keyspan/usa19qi.fw | 133 | File: keyspan/usa19qi.fw |
134 | File: keyspan/usa19qw.fw | 134 | File: keyspan/usa19qw.fw |
135 | File: keyspan/usa19w.fw | 135 | File: keyspan/usa19w.fw |
136 | File: keyspan/usa28.fw | 136 | File: keyspan/usa28.fw |
137 | File: keyspan/usa28xa.fw | 137 | File: keyspan/usa28xa.fw |
138 | File: keyspan/usa28xb.fw | 138 | File: keyspan/usa28xb.fw |
139 | File: keyspan/usa28x.fw | 139 | File: keyspan/usa28x.fw |
140 | File: keyspan/usa49w.fw | 140 | File: keyspan/usa49w.fw |
141 | File: keyspan/usa49wlc.fw | 141 | File: keyspan/usa49wlc.fw |
142 | 142 | ||
143 | Converted from Intel HEX files, used in our binary representation of ihex. | 143 | Converted from Intel HEX files, used in our binary representation of ihex. |
144 | 144 | ||
145 | Original licence information: | 145 | Original licence information: |
146 | 146 | ||
147 | Copyright (C) 1999-2001 | 147 | Copyright (C) 1999-2001 |
148 | Keyspan, A division of InnoSys Incorporated ("Keyspan") | 148 | Keyspan, A division of InnoSys Incorporated ("Keyspan") |
149 | 149 | ||
150 | as an unpublished work. This notice does not imply unrestricted or | 150 | as an unpublished work. This notice does not imply unrestricted or |
151 | public access to the source code from which this firmware image is | 151 | public access to the source code from which this firmware image is |
152 | derived. Except as noted below this firmware image may not be | 152 | derived. Except as noted below this firmware image may not be |
153 | reproduced, used, sold or transferred to any third party without | 153 | reproduced, used, sold or transferred to any third party without |
154 | Keyspan's prior written consent. All Rights Reserved. | 154 | Keyspan's prior written consent. All Rights Reserved. |
155 | 155 | ||
156 | Permission is hereby granted for the distribution of this firmware | 156 | Permission is hereby granted for the distribution of this firmware |
157 | image as part of a Linux or other Open Source operating system kernel | 157 | image as part of a Linux or other Open Source operating system kernel |
158 | in text or binary form as required. | 158 | in text or binary form as required. |
159 | 159 | ||
160 | This firmware may not be modified and may only be used with | 160 | This firmware may not be modified and may only be used with |
161 | Keyspan hardware. Distribution and/or Modification of the | 161 | Keyspan hardware. Distribution and/or Modification of the |
162 | keyspan.c driver which includes this firmware, in whole or in | 162 | keyspan.c driver which includes this firmware, in whole or in |
163 | part, requires the inclusion of this statement." | 163 | part, requires the inclusion of this statement." |
164 | 164 | ||
165 | -------------------------------------------------------------------------- | 165 | -------------------------------------------------------------------------- |
166 | 166 | ||
167 | Driver: keyspan_pda -- USB Keyspan PDA single-port serial device | 167 | Driver: keyspan_pda -- USB Keyspan PDA single-port serial device |
168 | 168 | ||
169 | File: keyspan_pda/keyspan_pda.fw | 169 | File: keyspan_pda/keyspan_pda.fw |
170 | Source: keyspan_pda/keyspan_pda.S | 170 | Source: keyspan_pda/keyspan_pda.S |
171 | 171 | ||
172 | File: keyspan_pda/xircom_pgs.fw | 172 | File: keyspan_pda/xircom_pgs.fw |
173 | Source: keyspan_pda/xircom_pgs.S | 173 | Source: keyspan_pda/xircom_pgs.S |
174 | 174 | ||
175 | Licence: GPLv2+ | 175 | Licence: GPLv2+ |
176 | 176 | ||
177 | Compiled from original 8051 source into Intel HEX, used in our binary ihex form. | 177 | Compiled from original 8051 source into Intel HEX, used in our binary ihex form. |
178 | 178 | ||
179 | -------------------------------------------------------------------------- | 179 | -------------------------------------------------------------------------- |
180 | 180 | ||
181 | Driver: emi26 -- EMI 2|6 USB Audio interface | 181 | Driver: emi26 -- EMI 2|6 USB Audio interface |
182 | 182 | ||
183 | File: emi26/bitstream.fw | 183 | File: emi26/bitstream.fw |
184 | Info: VERSION=1.1.1.131 DATE=2001dec06 | 184 | Info: VERSION=1.1.1.131 DATE=2001dec06 |
185 | 185 | ||
186 | File: emi26/firmware.fw | 186 | File: emi26/firmware.fw |
187 | Info: VERSION=1.0.2.916 DATE=12.02.2002 | 187 | Info: VERSION=1.0.2.916 DATE=12.02.2002 |
188 | 188 | ||
189 | File: emi26/loader.fw | 189 | File: emi26/loader.fw |
190 | 190 | ||
191 | Converted from Intel HEX files, used in our binary representation of ihex. | 191 | Converted from Intel HEX files, used in our binary representation of ihex. |
192 | 192 | ||
193 | Original licence information: | 193 | Original licence information: |
194 | /* | 194 | /* |
195 | * This firmware is for the Emagic EMI 2|6 Audio Interface | 195 | * This firmware is for the Emagic EMI 2|6 Audio Interface |
196 | * | 196 | * |
197 | * The firmware contained herein is Copyright (c) 1999-2002 Emagic | 197 | * The firmware contained herein is Copyright (c) 1999-2002 Emagic |
198 | * as an unpublished work. This notice does not imply unrestricted | 198 | * as an unpublished work. This notice does not imply unrestricted |
199 | * or public access to this firmware which is a trade secret of Emagic, | 199 | * or public access to this firmware which is a trade secret of Emagic, |
200 | * and which may not be reproduced, used, sold or transferred to | 200 | * and which may not be reproduced, used, sold or transferred to |
201 | * any third party without Emagic's written consent. All Rights Reserved. | 201 | * any third party without Emagic's written consent. All Rights Reserved. |
202 | * | 202 | * |
203 | * Permission is hereby granted for the distribution of this firmware | 203 | * Permission is hereby granted for the distribution of this firmware |
204 | * image as part of a Linux or other Open Source operating system kernel | 204 | * image as part of a Linux or other Open Source operating system kernel |
205 | * in text or binary form as required. | 205 | * in text or binary form as required. |
206 | * | 206 | * |
207 | * This firmware may not be modified and may only be used with the | 207 | * This firmware may not be modified and may only be used with the |
208 | * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of | 208 | * Emagic EMI 2|6 Audio Interface. Distribution and/or Modification of |
209 | * any driver which includes this firmware, in whole or in part, | 209 | * any driver which includes this firmware, in whole or in part, |
210 | * requires the inclusion of this statement. | 210 | * requires the inclusion of this statement. |
211 | */ | 211 | */ |
212 | 212 | ||
213 | -------------------------------------------------------------------------- | 213 | -------------------------------------------------------------------------- |
214 | 214 | ||
215 | Driver: emi62 -- EMI 6|2m USB Audio interface | 215 | Driver: emi62 -- EMI 6|2m USB Audio interface |
216 | 216 | ||
217 | File: emi62/bitstream.fw | 217 | File: emi62/bitstream.fw |
218 | Info: VERSION=1.0.0.191 DATE= 2002oct28 | 218 | Info: VERSION=1.0.0.191 DATE= 2002oct28 |
219 | 219 | ||
220 | File: emi62/loader.fw | 220 | File: emi62/loader.fw |
221 | Source: EMILOAD.HEX | 221 | Source: EMILOAD.HEX |
222 | Info: VERSION=1.0.2.002 DATE=10.01.2002 | 222 | Info: VERSION=1.0.2.002 DATE=10.01.2002 |
223 | 223 | ||
224 | File: emi62/midi.fw | 224 | File: emi62/midi.fw |
225 | Source: EMI62MFW.HEX | 225 | Source: EMI62MFW.HEX |
226 | Info: VERSION=1.04.062 DATE=16.10.2002 | 226 | Info: VERSION=1.04.062 DATE=16.10.2002 |
227 | 227 | ||
228 | File: emi62/spdif.fw | 228 | File: emi62/spdif.fw |
229 | Source: EMI62SFW.HEX | 229 | Source: EMI62SFW.HEX |
230 | Info: VERSION=1.04.062 DATE=16.10.2002 | 230 | Info: VERSION=1.04.062 DATE=16.10.2002 |
231 | 231 | ||
232 | Converted from Intel HEX files, used in our binary representation of ihex. | 232 | Converted from Intel HEX files, used in our binary representation of ihex. |
233 | 233 | ||
234 | Original licence information: None | 234 | Original licence information: None |
235 | 235 | ||
236 | -------------------------------------------------------------------------- | 236 | -------------------------------------------------------------------------- |
237 | 237 | ||
238 | Driver: ti_usb_3410_5052 -- USB TI 3410/5052 serial device | 238 | Driver: ti_usb_3410_5052 -- USB TI 3410/5052 serial device |
239 | 239 | ||
240 | File: ti_3410.fw | 240 | File: ti_3410.fw |
241 | Info: firmware 9/10/04 FW3410_Special_StartWdogOnStartPort | 241 | Info: firmware 9/10/04 FW3410_Special_StartWdogOnStartPort |
242 | 242 | ||
243 | File: ti_5052.fw | 243 | File: ti_5052.fw |
244 | Info: firmware 9/18/04 | 244 | Info: firmware 9/18/04 |
245 | 245 | ||
246 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 246 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
247 | Copyright (C) 2004 Texas Instruments | 247 | Copyright (C) 2004 Texas Instruments |
248 | 248 | ||
249 | Found in hex form in kernel source. | 249 | Found in hex form in kernel source. |
250 | 250 | ||
251 | -------------------------------------------------------------------------- | 251 | -------------------------------------------------------------------------- |
252 | 252 | ||
253 | Driver: ti_usb_3410_5052 -- Multi-Tech USB cell modems | 253 | Driver: ti_usb_3410_5052 -- Multi-Tech USB cell modems |
254 | 254 | ||
255 | File: mts_cdma.fw | 255 | File: mts_cdma.fw |
256 | File: mts_gsm.fw | 256 | File: mts_gsm.fw |
257 | File: mts_edge.fw | 257 | File: mts_edge.fw |
258 | 258 | ||
259 | Licence: "all firmware components are redistributable in binary form" | 259 | Licence: "all firmware components are redistributable in binary form" |
260 | per support@multitech.com | 260 | per support@multitech.com |
261 | Copyright (C) 2005 Multi-Tech Systems, Inc. | 261 | Copyright (C) 2005 Multi-Tech Systems, Inc. |
262 | 262 | ||
263 | Found in hex form in ftp://ftp.multitech.com/wireless/wireless_linux.zip | 263 | Found in hex form in ftp://ftp.multitech.com/wireless/wireless_linux.zip |
264 | 264 | ||
265 | -------------------------------------------------------------------------- | 265 | -------------------------------------------------------------------------- |
266 | 266 | ||
267 | Driver: whiteheat -- USB ConnectTech WhiteHEAT serial device | 267 | Driver: whiteheat -- USB ConnectTech WhiteHEAT serial device |
268 | 268 | ||
269 | File: whiteheat.fw | 269 | File: whiteheat.fw |
270 | Version: 4.06 | 270 | Version: 4.06 |
271 | 271 | ||
272 | File: whiteheat_loader.fw | 272 | File: whiteheat_loader.fw |
273 | File: whiteheat_loader_debug.fw | 273 | File: whiteheat_loader_debug.fw |
274 | 274 | ||
275 | Licence: Allegedly GPLv2, but no source visible. Marked: | 275 | Licence: Allegedly GPLv2, but no source visible. Marked: |
276 | Copyright (C) 2000-2002 ConnectTech Inc | 276 | Copyright (C) 2000-2002 ConnectTech Inc |
277 | 277 | ||
278 | Debug loader claims the following behaviour: | 278 | Debug loader claims the following behaviour: |
279 | Port 1 LED flashes when the vend_ax program is running | 279 | Port 1 LED flashes when the vend_ax program is running |
280 | Port 2 LED flashes when any SETUP command arrives | 280 | Port 2 LED flashes when any SETUP command arrives |
281 | Port 3 LED flashes when any valid VENDOR request occurs | 281 | Port 3 LED flashes when any valid VENDOR request occurs |
282 | Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs | 282 | Port 4 LED flashes when the EXTERNAL RAM DOWNLOAD request occurs |
283 | 283 | ||
284 | Converted from Intel HEX files, used in our binary representation of ihex. | 284 | Converted from Intel HEX files, used in our binary representation of ihex. |
285 | 285 | ||
286 | -------------------------------------------------------------------------- | 286 | -------------------------------------------------------------------------- |
287 | 287 | ||
288 | Driver: ip2 -- Computone IntelliPort Plus serial device | 288 | Driver: ip2 -- Computone IntelliPort Plus serial device |
289 | 289 | ||
290 | File: intelliport2.bin | 290 | File: intelliport2.bin |
291 | 291 | ||
292 | Licence: Unknown | 292 | Licence: Unknown |
293 | 293 | ||
294 | Found in hex form in kernel source. | 294 | Found in hex form in kernel source. |
295 | 295 | ||
296 | -------------------------------------------------------------------------- | 296 | -------------------------------------------------------------------------- |
297 | 297 | ||
298 | Driver: CPiA2 -- cameras based on Vision's CPiA2 | 298 | Driver: CPiA2 -- cameras based on Vision's CPiA2 |
299 | 299 | ||
300 | File: cpia2/stv0672_vp4.bin | 300 | File: cpia2/stv0672_vp4.bin |
301 | 301 | ||
302 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 302 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
303 | Copyright (C) 2001 STMicroelectronics, Inc. | 303 | Copyright (C) 2001 STMicroelectronics, Inc. |
304 | Contact: steve.miller@st.com | 304 | Contact: steve.miller@st.com |
305 | Description: This file contains patch data for the CPiA2 (stv0672) VP4. | 305 | Description: This file contains patch data for the CPiA2 (stv0672) VP4. |
306 | 306 | ||
307 | Found in hex form in kernel source. | 307 | Found in hex form in kernel source. |
308 | 308 | ||
309 | -------------------------------------------------------------------------- | 309 | -------------------------------------------------------------------------- |
310 | 310 | ||
311 | Driver: DABUSB -- Digital Audio Broadcasting (DAB) Receiver for USB and Linux | 311 | Driver: DABUSB -- Digital Audio Broadcasting (DAB) Receiver for USB and Linux |
312 | 312 | ||
313 | File: dabusb/firmware.fw | 313 | File: dabusb/firmware.fw |
314 | File: dabusb/bitstream.bin | 314 | File: dabusb/bitstream.bin |
315 | 315 | ||
316 | Licence: Distributable | 316 | Licence: Distributable |
317 | 317 | ||
318 | * Copyright (C) 1999 BayCom GmbH | 318 | * Copyright (C) 1999 BayCom GmbH |
319 | * | 319 | * |
320 | * Redistribution and use in source and binary forms, with or without | 320 | * Redistribution and use in source and binary forms, with or without |
321 | * modification, are permitted provided that redistributions of source | 321 | * modification, are permitted provided that redistributions of source |
322 | * code retain the above copyright notice and this comment without | 322 | * code retain the above copyright notice and this comment without |
323 | * modification. | 323 | * modification. |
324 | 324 | ||
325 | -------------------------------------------------------------------------- | 325 | -------------------------------------------------------------------------- |
326 | 326 | ||
327 | Driver: USB_VICAM -- USB 3com HomeConnect (aka vicam) | 327 | Driver: USB_VICAM -- USB 3com HomeConnect (aka vicam) |
328 | 328 | ||
329 | File: vicam/firmware.fw | 329 | File: vicam/firmware.fw |
330 | 330 | ||
331 | Licence: Unknown | 331 | Licence: Unknown |
332 | 332 | ||
333 | Found in hex form in kernel source. | 333 | Found in hex form in kernel source. |
334 | 334 | ||
335 | -------------------------------------------------------------------------- | 335 | -------------------------------------------------------------------------- |
336 | 336 | ||
337 | Driver: USB_SERIAL_EDGEPORT - USB Inside Out Edgeport Serial Driver | 337 | Driver: USB_SERIAL_EDGEPORT - USB Inside Out Edgeport Serial Driver |
338 | 338 | ||
339 | File: edgeport/boot.fw | 339 | File: edgeport/boot.fw |
340 | File: edgeport/boot2.fw | 340 | File: edgeport/boot2.fw |
341 | File: edgeport/down.fw | 341 | File: edgeport/down.fw |
342 | File: edgeport/down2.fw | 342 | File: edgeport/down2.fw |
343 | 343 | ||
344 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 344 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
345 | //************************************************************** | 345 | //************************************************************** |
346 | //* Edgeport/4 Binary Image | 346 | //* Edgeport/4 Binary Image |
347 | //* Generated by HEX2C v1.06 | 347 | //* Generated by HEX2C v1.06 |
348 | //* Copyright (C) 1998 Inside Out Networks, All rights reserved. | 348 | //* Copyright (C) 1998 Inside Out Networks, All rights reserved. |
349 | //************************************************************** | 349 | //************************************************************** |
350 | 350 | ||
351 | Found in hex form in kernel source. | 351 | Found in hex form in kernel source. |
352 | 352 | ||
353 | -------------------------------------------------------------------------- | 353 | -------------------------------------------------------------------------- |
354 | 354 | ||
355 | Driver: USB_SERIAL_EDGEPORT_TI - USB Inside Out Edgeport Serial Driver | 355 | Driver: USB_SERIAL_EDGEPORT_TI - USB Inside Out Edgeport Serial Driver |
356 | (TI Devices) | 356 | (TI Devices) |
357 | 357 | ||
358 | File: edgeport/down3.bin | 358 | File: edgeport/down3.bin |
359 | 359 | ||
360 | Licence: | 360 | Licence: |
361 | //************************************************************** | 361 | //************************************************************** |
362 | //* Edgeport Binary Image (for TI based products) | 362 | //* Edgeport Binary Image (for TI based products) |
363 | //* Generated by TIBin2C v2.00 (watchport) | 363 | //* Generated by TIBin2C v2.00 (watchport) |
364 | //* Copyright (C) 2001 Inside Out Networks, All rights reserved. | 364 | //* Copyright (C) 2001 Inside Out Networks, All rights reserved. |
365 | //************************************************************** | 365 | //************************************************************** |
366 | 366 | ||
367 | Found in hex form in kernel source. | 367 | Found in hex form in kernel source. |
368 | 368 | ||
369 | -------------------------------------------------------------------------- | 369 | -------------------------------------------------------------------------- |
370 | 370 | ||
371 | Driver: ATARI_DSP56K - Atari DSP56k support | 371 | Driver: ATARI_DSP56K - Atari DSP56k support |
372 | 372 | ||
373 | File: dsp56k/bootstrap.bin | 373 | File: dsp56k/bootstrap.bin |
374 | Source: dsp56k/bootstrap.asm | 374 | Source: dsp56k/bootstrap.asm |
375 | 375 | ||
376 | Licence: GPLv2 or later | 376 | Licence: GPLv2 or later |
377 | 377 | ||
378 | DSP56001 assembler, possibly buildable with a56 from | 378 | DSP56001 assembler, possibly buildable with a56 from |
379 | http://www.zdomain.com/a56.html | 379 | http://www.zdomain.com/a56.html |
380 | 380 | ||
381 | -------------------------------------------------------------------------- | 381 | -------------------------------------------------------------------------- |
382 | 382 | ||
383 | Driver: SND_SB16_CSP - Sound Blaster 16/AWE CSP support | 383 | Driver: SND_SB16_CSP - Sound Blaster 16/AWE CSP support |
384 | 384 | ||
385 | File: sb16/mulaw_main.csp | 385 | File: sb16/mulaw_main.csp |
386 | File: sb16/alaw_main.csp | 386 | File: sb16/alaw_main.csp |
387 | File: sb16/ima_adpcm_init.csp | 387 | File: sb16/ima_adpcm_init.csp |
388 | File: sb16/ima_adpcm_playback.csp | 388 | File: sb16/ima_adpcm_playback.csp |
389 | File: sb16/ima_adpcm_capture.csp | 389 | File: sb16/ima_adpcm_capture.csp |
390 | 390 | ||
391 | Licence: Allegedly GPLv2+, but no source visible. Marked: | 391 | Licence: Allegedly GPLv2+, but no source visible. Marked: |
392 | /* | 392 | /* |
393 | * Copyright (c) 1994 Creative Technology Ltd. | 393 | * Copyright (c) 1994 Creative Technology Ltd. |
394 | * Microcode files for SB16 Advanced Signal Processor | 394 | * Microcode files for SB16 Advanced Signal Processor |
395 | */ | 395 | */ |
396 | 396 | ||
397 | Found in hex form in kernel source. | 397 | Found in hex form in kernel source. |
398 | 398 | ||
399 | -------------------------------------------------------------------------- | 399 | -------------------------------------------------------------------------- |
400 | 400 | ||
401 | Driver: CASSINI - Sun Cassini | 401 | Driver: CASSINI - Sun Cassini |
402 | 402 | ||
403 | File: sun/cassini.bin | 403 | File: sun/cassini.bin |
404 | 404 | ||
405 | Licence: Unknown | 405 | Licence: Unknown |
406 | 406 | ||
407 | Found in hex form in kernel source. | 407 | Found in hex form in kernel source. |
408 | 408 | ||
409 | -------------------------------------------------------------------------- | 409 | -------------------------------------------------------------------------- |
410 | 410 | ||
411 | Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter | 411 | Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter |
412 | 412 | ||
413 | File: cxgb3/t3b_psram-1.1.0.bin.ihex | 413 | File: cxgb3/t3b_psram-1.1.0.bin.ihex |
414 | File: cxgb3/t3c_psram-1.1.0.bin.ihex | 414 | File: cxgb3/t3c_psram-1.1.0.bin.ihex |
415 | file: cxgb3/t3fw-7.4.0.bin.ihex | 415 | file: cxgb3/t3fw-7.4.0.bin.ihex |
416 | 416 | ||
417 | License: GPLv2 or OpenIB.org BSD license, no source visible | 417 | License: GPLv2 or OpenIB.org BSD license, no source visible |
418 | 418 | ||
419 | -------------------------------------------------------------------------- | 419 | -------------------------------------------------------------------------- |
420 | 420 | ||
421 | Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter | 421 | Driver: cxgb3 - Chelsio Terminator 3 1G/10G Ethernet adapter |
422 | 422 | ||
423 | File: cxgb3/ael2005_opt_edc.bin.ihex | 423 | File: cxgb3/ael2005_opt_edc.bin.ihex |
424 | File: cxgb3/ael2005_twx_edc.bin.ihex | 424 | File: cxgb3/ael2005_twx_edc.bin.ihex |
425 | File: cxgb3/ael2020_twx_edc.bin.ihex | 425 | File: cxgb3/ael2020_twx_edc.bin.ihex |
426 | 426 | ||
427 | Licence: | 427 | Licence: |
428 | * Copyright (c) 2007-2009 NetLogic Microsystems, Inc. | 428 | * Copyright (c) 2007-2009 NetLogic Microsystems, Inc. |
429 | * | 429 | * |
430 | * Permission is hereby granted for the distribution of this firmware | 430 | * Permission is hereby granted for the distribution of this firmware |
431 | * data in hexadecimal or equivalent format, provided this copyright | 431 | * data in hexadecimal or equivalent format, provided this copyright |
432 | * notice is accompanying it. | 432 | * notice is accompanying it. |
433 | 433 | ||
434 | Found in hex form in kernel source. | 434 | Found in hex form in kernel source. |
435 | 435 | ||
436 | -------------------------------------------------------------------------- | 436 | -------------------------------------------------------------------------- |
437 | 437 | ||
438 | Driver: e100 -- Intel PRO/100 Ethernet NIC | 438 | Driver: e100 -- Intel PRO/100 Ethernet NIC |
439 | 439 | ||
440 | File: e100/d101m_ucode.bin | 440 | File: e100/d101m_ucode.bin |
441 | File: e100/d101s_ucode.bin | 441 | File: e100/d101s_ucode.bin |
442 | File: e100/d102e_ucode.bin | 442 | File: e100/d102e_ucode.bin |
443 | 443 | ||
444 | Licence: Unknown | 444 | Licence: Unknown |
445 | 445 | ||
446 | Found in hex form in kernel source. | 446 | Found in hex form in kernel source. |
447 | 447 | ||
448 | -------------------------------------------------------------------------- | 448 | -------------------------------------------------------------------------- |
449 | 449 | ||
450 | Driver: acenic -- Alteon AceNIC Gigabit Ethernet card | 450 | Driver: acenic -- Alteon AceNIC Gigabit Ethernet card |
451 | 451 | ||
452 | File: acenic/tg1.bin | 452 | File: acenic/tg1.bin |
453 | File: acenic/tg2.bin | 453 | File: acenic/tg2.bin |
454 | 454 | ||
455 | Licence: Unknown | 455 | Licence: Unknown |
456 | 456 | ||
457 | Found in hex form in kernel source, but source allegedly available at | 457 | Found in hex form in kernel source, but source allegedly available at |
458 | http://alteon.shareable.org/ | 458 | http://alteon.shareable.org/ |
459 | 459 | ||
460 | -------------------------------------------------------------------------- | 460 | -------------------------------------------------------------------------- |
461 | 461 | ||
462 | Driver: tigon3 -- Broadcom Tigon3 based gigabit Ethernet cards | 462 | Driver: tigon3 -- Broadcom Tigon3 based gigabit Ethernet cards |
463 | 463 | ||
464 | File: tigon/tg3.bin | 464 | File: tigon/tg3.bin |
465 | File: tigon/tg3_tso.bin | 465 | File: tigon/tg3_tso.bin |
466 | File: tigon/tg3_tso5.bin | 466 | File: tigon/tg3_tso5.bin |
467 | 467 | ||
468 | Licence: | 468 | Licence: |
469 | * Firmware is: | 469 | * Firmware is: |
470 | * Derived from proprietary unpublished source code, | 470 | * Derived from proprietary unpublished source code, |
471 | * Copyright (C) 2000-2003 Broadcom Corporation. | 471 | * Copyright (C) 2000-2003 Broadcom Corporation. |
472 | * | 472 | * |
473 | * Permission is hereby granted for the distribution of this firmware | 473 | * Permission is hereby granted for the distribution of this firmware |
474 | * data in hexadecimal or equivalent format, provided this copyright | 474 | * data in hexadecimal or equivalent format, provided this copyright |
475 | * notice is accompanying it. | 475 | * notice is accompanying it. |
476 | 476 | ||
477 | Found in hex form in kernel source. | 477 | Found in hex form in kernel source. |
478 | 478 | ||
479 | -------------------------------------------------------------------------- | 479 | -------------------------------------------------------------------------- |
480 | 480 | ||
481 | Driver: ADAPTEC_STARFIRE - Adaptec Starfire/DuraLAN support | 481 | Driver: ADAPTEC_STARFIRE - Adaptec Starfire/DuraLAN support |
482 | 482 | ||
483 | File: adaptec/starfire_rx.bin | 483 | File: adaptec/starfire_rx.bin |
484 | File: adaptec/starfire_tx.bin | 484 | File: adaptec/starfire_tx.bin |
485 | 485 | ||
486 | Licence: Allegedly GPLv2, but no source visible. | 486 | Licence: Allegedly GPLv2, but no source visible. |
487 | 487 | ||
488 | Found in hex form in kernel source, with the following notice: | 488 | Found in hex form in kernel source, with the following notice: |
489 | 489 | ||
490 | BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND | 490 | BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE IT IS LICENSED "AS IS" AND |
491 | THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE | 491 | THERE IS NO WARRANTY FOR THE PROGRAM, INCLUDING BUT NOT LIMITED TO THE |
492 | IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE | 492 | IMPLIED WARRANTIES OF MERCHANTIBILITY OR FITNESS FOR A PARTICULAR PURPOSE |
493 | (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR | 493 | (TO THE EXTENT PERMITTED BY APPLICABLE LAW). USE OF THE PROGRAM IS AT YOUR |
494 | OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR | 494 | OWN RISK. IN NO EVENT WILL ADAPTEC OR ITS LICENSORS BE LIABLE TO YOU FOR |
495 | DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES | 495 | DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES |
496 | ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM. | 496 | ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM. |
497 | 497 | ||
498 | -------------------------------------------------------------------------- | 498 | -------------------------------------------------------------------------- |
499 | 499 | ||
500 | Driver: TEHUTI - Tehuti Networks 10G Ethernet | 500 | Driver: TEHUTI - Tehuti Networks 10G Ethernet |
501 | 501 | ||
502 | File: tehuti/bdx.bin | 502 | File: tehuti/bdx.bin |
503 | 503 | ||
504 | Licence: | 504 | Licence: |
505 | 505 | ||
506 | Copyright (C) 2007 Tehuti Networks Ltd. | 506 | Copyright (C) 2007 Tehuti Networks Ltd. |
507 | 507 | ||
508 | Permission is hereby granted for the distribution of this firmware data | 508 | Permission is hereby granted for the distribution of this firmware data |
509 | in hexadecimal or equivalent format, provided this copyright notice is | 509 | in hexadecimal or equivalent format, provided this copyright notice is |
510 | accompanying it. | 510 | accompanying it. |
511 | 511 | ||
512 | Found in hex form in kernel source. | 512 | Found in hex form in kernel source. |
513 | 513 | ||
514 | -------------------------------------------------------------------------- | 514 | -------------------------------------------------------------------------- |
515 | 515 | ||
516 | Driver: TYPHOON - 3cr990 series Typhoon | 516 | Driver: TYPHOON - 3cr990 series Typhoon |
517 | 517 | ||
518 | File: 3com/typhoon.bin | 518 | File: 3com/typhoon.bin |
519 | 519 | ||
520 | Licence: | 520 | Licence: |
521 | /* | 521 | /* |
522 | * Copyright 1999-2004 3Com Corporation. All Rights Reserved. | 522 | * Copyright 1999-2004 3Com Corporation. All Rights Reserved. |
523 | * | 523 | * |
524 | * Redistribution and use in source and binary forms of the 3c990img.h | 524 | * Redistribution and use in source and binary forms of the 3c990img.h |
525 | * microcode software are permitted provided that the following conditions | 525 | * microcode software are permitted provided that the following conditions |
526 | * are met: | 526 | * are met: |
527 | * 1. Redistribution of source code must retain the above copyright | 527 | * 1. Redistribution of source code must retain the above copyright |
528 | * notice, this list of conditions and the following disclaimer. | 528 | * notice, this list of conditions and the following disclaimer. |
529 | * 2. Redistribution in binary form must reproduce the above copyright | 529 | * 2. Redistribution in binary form must reproduce the above copyright |
530 | * notice, this list of conditions and the following disclaimer in the | 530 | * notice, this list of conditions and the following disclaimer in the |
531 | * documentation and/or other materials provided with the distribution. | 531 | * documentation and/or other materials provided with the distribution. |
532 | * 3. The name of 3Com may not be used to endorse or promote products | 532 | * 3. The name of 3Com may not be used to endorse or promote products |
533 | * derived from this software without specific prior written permission | 533 | * derived from this software without specific prior written permission |
534 | * | 534 | * |
535 | * THIS SOFTWARE IS PROVIDED BY 3COM ``AS IS'' AND ANY EXPRESS OR | 535 | * THIS SOFTWARE IS PROVIDED BY 3COM ``AS IS'' AND ANY EXPRESS OR |
536 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 536 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
537 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | 537 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
538 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | 538 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
539 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | 539 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
540 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 540 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
541 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 541 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
542 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 542 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
543 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 543 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
544 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 544 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
545 | * | 545 | * |
546 | * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3c990img.h | 546 | * USER ACKNOWLEDGES AND AGREES THAT PURCHASE OR USE OF THE 3c990img.h |
547 | * MICROCODE SOFTWARE WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY | 547 | * MICROCODE SOFTWARE WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY |
548 | * IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS | 548 | * IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS |
549 | * (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) | 549 | * (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) |
550 | * EMBODIED IN ANY OTHER 3COM HARDWARE OR SOFTWARE EITHER SOLELY OR IN | 550 | * EMBODIED IN ANY OTHER 3COM HARDWARE OR SOFTWARE EITHER SOLELY OR IN |
551 | * COMBINATION WITH THE 3c990img.h MICROCODE SOFTWARE | 551 | * COMBINATION WITH THE 3c990img.h MICROCODE SOFTWARE |
552 | */ | 552 | */ |
553 | 553 | ||
554 | Found in hex form in kernel source. | 554 | Found in hex form in kernel source. |
555 | 555 | ||
556 | -------------------------------------------------------------------------- | 556 | -------------------------------------------------------------------------- |
557 | 557 | ||
558 | Driver: YAM - YAM driver for AX.25 | 558 | Driver: YAM - YAM driver for AX.25 |
559 | 559 | ||
560 | File: yam/1200.bin | 560 | File: yam/1200.bin |
561 | File: yam/9600.bin | 561 | File: yam/9600.bin |
562 | 562 | ||
563 | Licence: | 563 | Licence: |
564 | * (C) F6FBB 1998 | 564 | * (C) F6FBB 1998 |
565 | 565 | ||
566 | Found in hex form in kernel source. | 566 | Found in hex form in kernel source. |
567 | 567 | ||
568 | -------------------------------------------------------------------------- | 568 | -------------------------------------------------------------------------- |
569 | 569 | ||
570 | Driver: 3C359 - 3Com 3C359 Token Link Velocity XL adapter | 570 | Driver: 3C359 - 3Com 3C359 Token Link Velocity XL adapter |
571 | 571 | ||
572 | File: 3com/3C359.bin | 572 | File: 3com/3C359.bin |
573 | 573 | ||
574 | Licence: | 574 | Licence: |
575 | /* | 575 | /* |
576 | * The firmware this driver downloads into the tokenring card is a | 576 | * The firmware this driver downloads into the tokenring card is a |
577 | * separate program and is not GPL'd source code, even though the Linux | 577 | * separate program and is not GPL'd source code, even though the Linux |
578 | * side driver and the routine that loads this data into the card are. | 578 | * side driver and the routine that loads this data into the card are. |
579 | * | 579 | * |
580 | * This firmware is licensed to you strictly for use in conjunction | 580 | * This firmware is licensed to you strictly for use in conjunction |
581 | * with the use of 3Com 3C359 TokenRing adapters. There is no | 581 | * with the use of 3Com 3C359 TokenRing adapters. There is no |
582 | * waranty expressed or implied about its fitness for any purpose. | 582 | * waranty expressed or implied about its fitness for any purpose. |
583 | */ | 583 | */ |
584 | /* 3c359_microcode.mac: 3Com 3C359 Tokenring microcode. | 584 | /* 3c359_microcode.mac: 3Com 3C359 Tokenring microcode. |
585 | * | 585 | * |
586 | * Notes: | 586 | * Notes: |
587 | * - Loaded from xl_init upon adapter initialization. | 587 | * - Loaded from xl_init upon adapter initialization. |
588 | * | 588 | * |
589 | * Available from 3Com as part of their standard 3C359 driver. | 589 | * Available from 3Com as part of their standard 3C359 driver. |
590 | */ | 590 | */ |
591 | 591 | ||
592 | Found in hex form in kernel source. | 592 | Found in hex form in kernel source. |
593 | 593 | ||
594 | -------------------------------------------------------------------------- | 594 | -------------------------------------------------------------------------- |
595 | 595 | ||
596 | Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter | 596 | Driver: PCMCIA_PCNET - NE2000 compatible PCMCIA adapter |
597 | 597 | ||
598 | File: cis/LA-PCM.cis | 598 | File: cis/LA-PCM.cis |
599 | cis/PCMLM28.cis | 599 | cis/PCMLM28.cis |
600 | cis/DP83903.cis | 600 | cis/DP83903.cis |
601 | cis/NE2K.cis | 601 | cis/NE2K.cis |
602 | cis/tamarack.cis | 602 | cis/tamarack.cis |
603 | cis/PE-200.cis | 603 | cis/PE-200.cis |
604 | cis/PE520.cis | ||
604 | 605 | ||
605 | Licence: GPL | 606 | Licence: GPL |
606 | 607 | ||
607 | Originally developed by the pcmcia-cs project | 608 | Originally developed by the pcmcia-cs project |
608 | 609 | ||
609 | -------------------------------------------------------------------------- | 610 | -------------------------------------------------------------------------- |
610 | 611 | ||
611 | Driver: PCMCIA_3C589 - 3Com PCMCIA adapter | 612 | Driver: PCMCIA_3C589 - 3Com PCMCIA adapter |
612 | 613 | ||
613 | File: cis/3CXEM556.cis | 614 | File: cis/3CXEM556.cis |
614 | 615 | ||
615 | Licence: GPL | 616 | Licence: GPL |
616 | 617 | ||
617 | Originally developed by the pcmcia-cs project | 618 | Originally developed by the pcmcia-cs project |
618 | 619 | ||
619 | -------------------------------------------------------------------------- | 620 | -------------------------------------------------------------------------- |
620 | 621 | ||
621 | Driver: PCMCIA_3C574 - 3Com PCMCIA adapter | 622 | Driver: PCMCIA_3C574 - 3Com PCMCIA adapter |
622 | 623 | ||
623 | File: cis/3CCFEM556.cis | 624 | File: cis/3CCFEM556.cis |
624 | 625 | ||
625 | Licence: GPL | 626 | Licence: GPL |
626 | 627 | ||
627 | Originally developed by the pcmcia-cs project | 628 | Originally developed by the pcmcia-cs project |
628 | 629 | ||
629 | -------------------------------------------------------------------------- | 630 | -------------------------------------------------------------------------- |
630 | 631 | ||
631 | Driver: SERIAL_8250_CS - Serial PCMCIA adapter | 632 | Driver: SERIAL_8250_CS - Serial PCMCIA adapter |
632 | 633 | ||
633 | File: cis/MT5634ZLX.cis | 634 | File: cis/MT5634ZLX.cis |
634 | cis/RS-COM-2P.cis | 635 | cis/RS-COM-2P.cis |
635 | cis/COMpad2.cis | 636 | cis/COMpad2.cis |
636 | cis/COMpad4.cis | 637 | cis/COMpad4.cis |
637 | cis/SW_555_SER.cis | 638 | cis/SW_555_SER.cis |
638 | cis/SW_7xx_SER.cis | 639 | cis/SW_7xx_SER.cis |
639 | cis/SW_8xx_SER.cis | 640 | cis/SW_8xx_SER.cis |
640 | 641 | ||
641 | Licence: GPL | 642 | Licence: GPL |
642 | 643 | ||
643 | Originally developed by the pcmcia-cs project | 644 | Originally developed by the pcmcia-cs project |
644 | 645 | ||
645 | -------------------------------------------------------------------------- | 646 | -------------------------------------------------------------------------- |
646 | 647 | ||
647 | Driver: PCMCIA_SMC91C92 - SMC 91Cxx PCMCIA | 648 | Driver: PCMCIA_SMC91C92 - SMC 91Cxx PCMCIA |
648 | 649 | ||
649 | File: ositech/Xilinx7OD.bin | 650 | File: ositech/Xilinx7OD.bin |
650 | 651 | ||
651 | Licence: Allegedly GPL, but no source visible. Marked: | 652 | Licence: Allegedly GPL, but no source visible. Marked: |
652 | This file contains the firmware of Seven of Diamonds from OSITECH. | 653 | This file contains the firmware of Seven of Diamonds from OSITECH. |
653 | (Special thanks to Kevin MacPherson of OSITECH) | 654 | (Special thanks to Kevin MacPherson of OSITECH) |
654 | 655 | ||
655 | Found in hex form in kernel source. | 656 | Found in hex form in kernel source. |
656 | 657 | ||
657 | -------------------------------------------------------------------------- | 658 | -------------------------------------------------------------------------- |
658 | 659 | ||
659 | Driver: SCSI_QLOGICPTI - PTI Qlogic, ISP Driver | 660 | Driver: SCSI_QLOGICPTI - PTI Qlogic, ISP Driver |
660 | 661 | ||
661 | File: qlogic/isp1000.bin | 662 | File: qlogic/isp1000.bin |
662 | 663 | ||
663 | Licence: Unknown | 664 | Licence: Unknown |
664 | 665 | ||
665 | Found in hex form in kernel source. | 666 | Found in hex form in kernel source. |
666 | 667 | ||
667 | -------------------------------------------------------------------------- | 668 | -------------------------------------------------------------------------- |
668 | 669 | ||
669 | Driver: MYRI_SBUS - MyriCOM Gigabit Ethernet | 670 | Driver: MYRI_SBUS - MyriCOM Gigabit Ethernet |
670 | 671 | ||
671 | File: myricom/lanai.bin | 672 | File: myricom/lanai.bin |
672 | 673 | ||
673 | Licence: Unknown | 674 | Licence: Unknown |
674 | 675 | ||
675 | Found in hex form in kernel source. | 676 | Found in hex form in kernel source. |
676 | 677 | ||
677 | -------------------------------------------------------------------------- | 678 | -------------------------------------------------------------------------- |
678 | 679 | ||
679 | Driver: bnx2x: Broadcom Everest | 680 | Driver: bnx2x: Broadcom Everest |
680 | 681 | ||
681 | File: bnx2x-e1-5.2.7.0.fw.ihex | 682 | File: bnx2x-e1-5.2.7.0.fw.ihex |
682 | File: bnx2x-e1h-5.2.7.0.fw.ihex | 683 | File: bnx2x-e1h-5.2.7.0.fw.ihex |
683 | 684 | ||
684 | License: | 685 | License: |
685 | Copyright (c) 2007-2009 Broadcom Corporation | 686 | Copyright (c) 2007-2009 Broadcom Corporation |
686 | 687 | ||
687 | This file contains firmware data derived from proprietary unpublished | 688 | This file contains firmware data derived from proprietary unpublished |
688 | source code, Copyright (c) 2007-2009 Broadcom Corporation. | 689 | source code, Copyright (c) 2007-2009 Broadcom Corporation. |
689 | 690 | ||
690 | Permission is hereby granted for the distribution of this firmware data | 691 | Permission is hereby granted for the distribution of this firmware data |
691 | in hexadecimal or equivalent format, provided this copyright notice is | 692 | in hexadecimal or equivalent format, provided this copyright notice is |
692 | accompanying it. | 693 | accompanying it. |
693 | 694 | ||
694 | 695 | ||
695 | Found in hex form in kernel source. | 696 | Found in hex form in kernel source. |
696 | 697 | ||
697 | -------------------------------------------------------------------------- | 698 | -------------------------------------------------------------------------- |
698 | 699 | ||
699 | Driver: BNX2 - Broadcom NetXtremeII | 700 | Driver: BNX2 - Broadcom NetXtremeII |
700 | 701 | ||
701 | File: bnx2/bnx2-mips-06-4.6.16.fw | 702 | File: bnx2/bnx2-mips-06-4.6.16.fw |
702 | File: bnx2/bnx2-rv2p-06-4.6.16.fw | 703 | File: bnx2/bnx2-rv2p-06-4.6.16.fw |
703 | File: bnx2/bnx2-mips-09-4.6.17.fw | 704 | File: bnx2/bnx2-mips-09-4.6.17.fw |
704 | File: bnx2/bnx2-rv2p-09-4.6.15.fw | 705 | File: bnx2/bnx2-rv2p-09-4.6.15.fw |
705 | 706 | ||
706 | Licence: | 707 | Licence: |
707 | 708 | ||
708 | This file contains firmware data derived from proprietary unpublished | 709 | This file contains firmware data derived from proprietary unpublished |
709 | source code, Copyright (c) 2004 - 2009 Broadcom Corporation. | 710 | source code, Copyright (c) 2004 - 2009 Broadcom Corporation. |
710 | 711 | ||
711 | Permission is hereby granted for the distribution of this firmware data | 712 | Permission is hereby granted for the distribution of this firmware data |
712 | in hexadecimal or equivalent format, provided this copyright notice is | 713 | in hexadecimal or equivalent format, provided this copyright notice is |
713 | accompanying it. | 714 | accompanying it. |
714 | 715 | ||
715 | Found in hex form in kernel source. | 716 | Found in hex form in kernel source. |
716 | 717 | ||
717 | -------------------------------------------------------------------------- | 718 | -------------------------------------------------------------------------- |
718 | 719 | ||
719 | Driver: DVB AV7110 -- AV7110 cards | 720 | Driver: DVB AV7110 -- AV7110 cards |
720 | 721 | ||
721 | File: av7110/bootcode.bin | 722 | File: av7110/bootcode.bin |
722 | 723 | ||
723 | Licence: GPLv2 or later | 724 | Licence: GPLv2 or later |
724 | 725 | ||
725 | ARM assembly source code available at http://www.linuxtv.org/downloads/firmware/Boot.S | 726 | ARM assembly source code available at http://www.linuxtv.org/downloads/firmware/Boot.S |
726 | 727 | ||
727 | -------------------------------------------------------------------------- | 728 | -------------------------------------------------------------------------- |
728 | 729 | ||
729 | Driver: wavefront - ISA WaveFront sound card | 730 | Driver: wavefront - ISA WaveFront sound card |
730 | 731 | ||
731 | File: yamaha/yss225_registers.bin | 732 | File: yamaha/yss225_registers.bin |
732 | 733 | ||
733 | Licence: Allegedly GPLv2+, but no source visible. | 734 | Licence: Allegedly GPLv2+, but no source visible. |
734 | 735 | ||
735 | Found in hex form in kernel source, with the following comment: | 736 | Found in hex form in kernel source, with the following comment: |
736 | Copyright (c) 1998-2002 by Paul Davis <pbd@op.net> | 737 | Copyright (c) 1998-2002 by Paul Davis <pbd@op.net> |
737 | 738 | ||
738 | -------------------------------------------------------------------------- | 739 | -------------------------------------------------------------------------- |
739 | 740 | ||
740 | Driver: mga - Matrox G200/G400/G550 | 741 | Driver: mga - Matrox G200/G400/G550 |
741 | 742 | ||
742 | File: matrox/g200_warp.fw | 743 | File: matrox/g200_warp.fw |
743 | File: matrox/g400_warp.fw | 744 | File: matrox/g400_warp.fw |
744 | 745 | ||
745 | Licence: | 746 | Licence: |
746 | 747 | ||
747 | Copyright 1999 Matrox Graphics Inc. | 748 | Copyright 1999 Matrox Graphics Inc. |
748 | All Rights Reserved. | 749 | All Rights Reserved. |
749 | 750 | ||
750 | Permission is hereby granted, free of charge, to any person obtaining a | 751 | Permission is hereby granted, free of charge, to any person obtaining a |
751 | copy of this software and associated documentation files (the "Software"), | 752 | copy of this software and associated documentation files (the "Software"), |
752 | to deal in the Software without restriction, including without limitation | 753 | to deal in the Software without restriction, including without limitation |
753 | the rights to use, copy, modify, merge, publish, distribute, sublicense, | 754 | the rights to use, copy, modify, merge, publish, distribute, sublicense, |
754 | and/or sell copies of the Software, and to permit persons to whom the | 755 | and/or sell copies of the Software, and to permit persons to whom the |
755 | Software is furnished to do so, subject to the following conditions: | 756 | Software is furnished to do so, subject to the following conditions: |
756 | 757 | ||
757 | The above copyright notice and this permission notice shall be included | 758 | The above copyright notice and this permission notice shall be included |
758 | in all copies or substantial portions of the Software. | 759 | in all copies or substantial portions of the Software. |
759 | 760 | ||
760 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 761 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
761 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 762 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
762 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 763 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
763 | MATROX GRAPHICS INC., OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, | 764 | MATROX GRAPHICS INC., OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, |
764 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | 765 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
765 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE | 766 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE |
766 | OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 767 | OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
767 | 768 | ||
768 | Found in hex form in kernel source. | 769 | Found in hex form in kernel source. |
769 | 770 | ||
770 | -------------------------------------------------------------------------- | 771 | -------------------------------------------------------------------------- |
771 | 772 | ||
772 | Driver: r128 - ATI Rage 128 | 773 | Driver: r128 - ATI Rage 128 |
773 | 774 | ||
774 | File: r128/r128_cce.bin | 775 | File: r128/r128_cce.bin |
775 | 776 | ||
776 | Licence: | 777 | Licence: |
777 | 778 | ||
778 | Copyright 2000 Advanced Micro Devices, Inc. | 779 | Copyright 2000 Advanced Micro Devices, Inc. |
779 | 780 | ||
780 | * Permission is hereby granted, free of charge, to any person obtaining a | 781 | * Permission is hereby granted, free of charge, to any person obtaining a |
781 | * copy of this software and associated documentation files (the "Software"), | 782 | * copy of this software and associated documentation files (the "Software"), |
782 | * to deal in the Software without restriction, including without limitation | 783 | * to deal in the Software without restriction, including without limitation |
783 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 784 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
784 | * and/or sell copies of the Software, and to permit persons to whom the | 785 | * and/or sell copies of the Software, and to permit persons to whom the |
785 | * Software is furnished to do so, subject to the following conditions: | 786 | * Software is furnished to do so, subject to the following conditions: |
786 | * | 787 | * |
787 | * The above copyright notice and this permission notice (including the next | 788 | * The above copyright notice and this permission notice (including the next |
788 | * paragraph) shall be included in all copies or substantial portions of the | 789 | * paragraph) shall be included in all copies or substantial portions of the |
789 | * Software. | 790 | * Software. |
790 | * | 791 | * |
791 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 792 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
792 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 793 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
793 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 794 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
794 | * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR | 795 | * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
795 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 796 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
796 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 797 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
797 | * DEALINGS IN THE SOFTWARE. | 798 | * DEALINGS IN THE SOFTWARE. |
798 | 799 | ||
799 | Found in decimal form in kernel source. | 800 | Found in decimal form in kernel source. |
800 | 801 | ||
801 | -------------------------------------------------------------------------- | 802 | -------------------------------------------------------------------------- |
802 | 803 | ||
803 | Driver: radeon - ATI Radeon | 804 | Driver: radeon - ATI Radeon |
804 | 805 | ||
805 | File: radeon/R100_cp.bin | 806 | File: radeon/R100_cp.bin |
806 | File: radeon/R200_cp.bin | 807 | File: radeon/R200_cp.bin |
807 | File: radeon/R300_cp.bin | 808 | File: radeon/R300_cp.bin |
808 | File: radeon/R420_cp.bin | 809 | File: radeon/R420_cp.bin |
809 | File: radeon/RS600_cp.bin | 810 | File: radeon/RS600_cp.bin |
810 | File: radeon/RS690_cp.bin | 811 | File: radeon/RS690_cp.bin |
811 | File: radeon/R520_cp.bin | 812 | File: radeon/R520_cp.bin |
812 | File: radeon/R600_pfp.bin | 813 | File: radeon/R600_pfp.bin |
813 | File: radeon/R600_me.bin | 814 | File: radeon/R600_me.bin |
814 | File: radeon/RV610_pfp.bin | 815 | File: radeon/RV610_pfp.bin |
815 | File: radeon/RV610_me.bin | 816 | File: radeon/RV610_me.bin |
816 | File: radeon/RV630_pfp.bin | 817 | File: radeon/RV630_pfp.bin |
817 | File: radeon/RV630_me.bin | 818 | File: radeon/RV630_me.bin |
818 | File: radeon/RV620_pfp.bin | 819 | File: radeon/RV620_pfp.bin |
819 | File: radeon/RV620_me.bin | 820 | File: radeon/RV620_me.bin |
820 | File: radeon/RV635_pfp.bin | 821 | File: radeon/RV635_pfp.bin |
821 | File: radeon/RV635_me.bin | 822 | File: radeon/RV635_me.bin |
822 | File: radeon/RV670_pfp.bin | 823 | File: radeon/RV670_pfp.bin |
823 | File: radeon/RV670_me.bin | 824 | File: radeon/RV670_me.bin |
824 | File: radeon/RS780_pfp.bin | 825 | File: radeon/RS780_pfp.bin |
825 | File: radeon/RS780_me.bin | 826 | File: radeon/RS780_me.bin |
826 | File: radeon/RV770_pfp.bin | 827 | File: radeon/RV770_pfp.bin |
827 | File: radeon/RV770_me.bin | 828 | File: radeon/RV770_me.bin |
828 | File: radeon/RV730_pfp.bin | 829 | File: radeon/RV730_pfp.bin |
829 | File: radeon/RV730_me.bin | 830 | File: radeon/RV730_me.bin |
830 | File: radeon/RV710_pfp.bin | 831 | File: radeon/RV710_pfp.bin |
831 | File: radeon/RV710_me.bin | 832 | File: radeon/RV710_me.bin |
832 | 833 | ||
833 | Licence: | 834 | Licence: |
834 | 835 | ||
835 | * Copyright 2007-2009 Advanced Micro Devices, Inc. | 836 | * Copyright 2007-2009 Advanced Micro Devices, Inc. |
836 | * All Rights Reserved. | 837 | * All Rights Reserved. |
837 | * | 838 | * |
838 | * Permission is hereby granted, free of charge, to any person obtaining a | 839 | * Permission is hereby granted, free of charge, to any person obtaining a |
839 | * copy of this software and associated documentation files (the "Software"), | 840 | * copy of this software and associated documentation files (the "Software"), |
840 | * to deal in the Software without restriction, including without limitation | 841 | * to deal in the Software without restriction, including without limitation |
841 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 842 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
842 | * and/or sell copies of the Software, and to permit persons to whom the | 843 | * and/or sell copies of the Software, and to permit persons to whom the |
843 | * Software is furnished to do so, subject to the following conditions: | 844 | * Software is furnished to do so, subject to the following conditions: |
844 | * | 845 | * |
845 | * The above copyright notice and this permission notice (including the next | 846 | * The above copyright notice and this permission notice (including the next |
846 | * paragraph) shall be included in all copies or substantial portions of the | 847 | * paragraph) shall be included in all copies or substantial portions of the |
847 | * Software. | 848 | * Software. |
848 | * | 849 | * |
849 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 850 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
850 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 851 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
851 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | 852 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
852 | * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE | 853 | * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE |
853 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | 854 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
854 | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | 855 | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
855 | * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | 856 | * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
856 | 857 | ||
857 | Found in hex form in kernel source. | 858 | Found in hex form in kernel source. |
858 | 859 | ||
859 | -------------------------------------------------------------------------- | 860 | -------------------------------------------------------------------------- |
860 | 861 |
firmware/cis/PE520.cis.ihex
File was created | 1 | :1000000001030000FF152304014B544900504535FE | |
2 | :10001000323020504C55530050434D434941204508 | ||
3 | :10002000746865726E65740000FF20046101100041 | ||
4 | :10003000210206001A050101D00F0B1B09C101198D | ||
5 | :0A00400001556530FFFF1400FF00BA | ||
6 | :00000001FF | ||
7 | # | ||
8 | # Replacement CIS for PE520 ethernet card | ||
9 | # | ||
10 |