diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/ipmi/ipmi_poweroff.c | 2 | ||||
-rw-r--r-- | drivers/connector/cn_queue.c | 32 | ||||
-rw-r--r-- | drivers/connector/connector.c | 74 | ||||
-rw-r--r-- | drivers/ide/legacy/ide-cs.c | 2 | ||||
-rw-r--r-- | drivers/md/dm-ioctl.c | 9 | ||||
-rw-r--r-- | drivers/md/dm-mpath.c | 16 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/tda10021.c | 4 | ||||
-rw-r--r-- | drivers/net/cs89x0.c | 1 | ||||
-rw-r--r-- | drivers/net/tg3.c | 94 | ||||
-rw-r--r-- | drivers/net/tg3.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco.c | 2 | ||||
-rw-r--r-- | drivers/pcmcia/Kconfig | 2 | ||||
-rw-r--r-- | drivers/pcmcia/cardbus.c | 5 | ||||
-rw-r--r-- | drivers/pcmcia/ti113x.h | 115 | ||||
-rw-r--r-- | drivers/pcmcia/yenta_socket.c | 62 | ||||
-rw-r--r-- | drivers/serial/serial_cs.c | 1 |
16 files changed, 303 insertions, 119 deletions
diff --git a/drivers/char/ipmi/ipmi_poweroff.c b/drivers/char/ipmi/ipmi_poweroff.c index e82a96ba396b..f66947722e12 100644 --- a/drivers/char/ipmi/ipmi_poweroff.c +++ b/drivers/char/ipmi/ipmi_poweroff.c | |||
@@ -55,7 +55,7 @@ extern void (*pm_power_off)(void); | |||
55 | static int poweroff_powercycle; | 55 | static int poweroff_powercycle; |
56 | 56 | ||
57 | /* parameter definition to allow user to flag power cycle */ | 57 | /* parameter definition to allow user to flag power cycle */ |
58 | module_param(poweroff_powercycle, int, 0); | 58 | module_param(poweroff_powercycle, int, 0644); |
59 | MODULE_PARM_DESC(poweroff_powercycles, " Set to non-zero to enable power cycle instead of power down. Power cycle is contingent on hardware support, otherwise it defaults back to power down."); | 59 | MODULE_PARM_DESC(poweroff_powercycles, " Set to non-zero to enable power cycle instead of power down. Power cycle is contingent on hardware support, otherwise it defaults back to power down."); |
60 | 60 | ||
61 | /* Stuff from the get device id command. */ | 61 | /* Stuff from the get device id command. */ |
diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c index 966632182e2d..9f2f00d82917 100644 --- a/drivers/connector/cn_queue.c +++ b/drivers/connector/cn_queue.c | |||
@@ -31,16 +31,19 @@ | |||
31 | #include <linux/connector.h> | 31 | #include <linux/connector.h> |
32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
33 | 33 | ||
34 | static void cn_queue_wrapper(void *data) | 34 | void cn_queue_wrapper(void *data) |
35 | { | 35 | { |
36 | struct cn_callback_entry *cbq = data; | 36 | struct cn_callback_data *d = data; |
37 | 37 | ||
38 | cbq->cb->callback(cbq->cb->priv); | 38 | d->callback(d->callback_priv); |
39 | cbq->destruct_data(cbq->ddata); | 39 | |
40 | cbq->ddata = NULL; | 40 | d->destruct_data(d->ddata); |
41 | d->ddata = NULL; | ||
42 | |||
43 | kfree(d->free); | ||
41 | } | 44 | } |
42 | 45 | ||
43 | static struct cn_callback_entry *cn_queue_alloc_callback_entry(struct cn_callback *cb) | 46 | static struct cn_callback_entry *cn_queue_alloc_callback_entry(char *name, struct cb_id *id, void (*callback)(void *)) |
44 | { | 47 | { |
45 | struct cn_callback_entry *cbq; | 48 | struct cn_callback_entry *cbq; |
46 | 49 | ||
@@ -50,8 +53,11 @@ static struct cn_callback_entry *cn_queue_alloc_callback_entry(struct cn_callbac | |||
50 | return NULL; | 53 | return NULL; |
51 | } | 54 | } |
52 | 55 | ||
53 | cbq->cb = cb; | 56 | snprintf(cbq->id.name, sizeof(cbq->id.name), "%s", name); |
54 | INIT_WORK(&cbq->work, &cn_queue_wrapper, cbq); | 57 | memcpy(&cbq->id.id, id, sizeof(struct cb_id)); |
58 | cbq->data.callback = callback; | ||
59 | |||
60 | INIT_WORK(&cbq->work, &cn_queue_wrapper, &cbq->data); | ||
55 | return cbq; | 61 | return cbq; |
56 | } | 62 | } |
57 | 63 | ||
@@ -68,12 +74,12 @@ int cn_cb_equal(struct cb_id *i1, struct cb_id *i2) | |||
68 | return ((i1->idx == i2->idx) && (i1->val == i2->val)); | 74 | return ((i1->idx == i2->idx) && (i1->val == i2->val)); |
69 | } | 75 | } |
70 | 76 | ||
71 | int cn_queue_add_callback(struct cn_queue_dev *dev, struct cn_callback *cb) | 77 | int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id, void (*callback)(void *)) |
72 | { | 78 | { |
73 | struct cn_callback_entry *cbq, *__cbq; | 79 | struct cn_callback_entry *cbq, *__cbq; |
74 | int found = 0; | 80 | int found = 0; |
75 | 81 | ||
76 | cbq = cn_queue_alloc_callback_entry(cb); | 82 | cbq = cn_queue_alloc_callback_entry(name, id, callback); |
77 | if (!cbq) | 83 | if (!cbq) |
78 | return -ENOMEM; | 84 | return -ENOMEM; |
79 | 85 | ||
@@ -82,7 +88,7 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, struct cn_callback *cb) | |||
82 | 88 | ||
83 | spin_lock_bh(&dev->queue_lock); | 89 | spin_lock_bh(&dev->queue_lock); |
84 | list_for_each_entry(__cbq, &dev->queue_list, callback_entry) { | 90 | list_for_each_entry(__cbq, &dev->queue_list, callback_entry) { |
85 | if (cn_cb_equal(&__cbq->cb->id, &cb->id)) { | 91 | if (cn_cb_equal(&__cbq->id.id, id)) { |
86 | found = 1; | 92 | found = 1; |
87 | break; | 93 | break; |
88 | } | 94 | } |
@@ -99,7 +105,7 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, struct cn_callback *cb) | |||
99 | 105 | ||
100 | cbq->nls = dev->nls; | 106 | cbq->nls = dev->nls; |
101 | cbq->seq = 0; | 107 | cbq->seq = 0; |
102 | cbq->group = cbq->cb->id.idx; | 108 | cbq->group = cbq->id.id.idx; |
103 | 109 | ||
104 | return 0; | 110 | return 0; |
105 | } | 111 | } |
@@ -111,7 +117,7 @@ void cn_queue_del_callback(struct cn_queue_dev *dev, struct cb_id *id) | |||
111 | 117 | ||
112 | spin_lock_bh(&dev->queue_lock); | 118 | spin_lock_bh(&dev->queue_lock); |
113 | list_for_each_entry_safe(cbq, n, &dev->queue_list, callback_entry) { | 119 | list_for_each_entry_safe(cbq, n, &dev->queue_list, callback_entry) { |
114 | if (cn_cb_equal(&cbq->cb->id, id)) { | 120 | if (cn_cb_equal(&cbq->id.id, id)) { |
115 | list_del(&cbq->callback_entry); | 121 | list_del(&cbq->callback_entry); |
116 | found = 1; | 122 | found = 1; |
117 | break; | 123 | break; |
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index aaf6d468a8b9..bb0b3a8de14b 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
@@ -84,7 +84,7 @@ int cn_netlink_send(struct cn_msg *msg, u32 __group, int gfp_mask) | |||
84 | spin_lock_bh(&dev->cbdev->queue_lock); | 84 | spin_lock_bh(&dev->cbdev->queue_lock); |
85 | list_for_each_entry(__cbq, &dev->cbdev->queue_list, | 85 | list_for_each_entry(__cbq, &dev->cbdev->queue_list, |
86 | callback_entry) { | 86 | callback_entry) { |
87 | if (cn_cb_equal(&__cbq->cb->id, &msg->id)) { | 87 | if (cn_cb_equal(&__cbq->id.id, &msg->id)) { |
88 | found = 1; | 88 | found = 1; |
89 | group = __cbq->group; | 89 | group = __cbq->group; |
90 | } | 90 | } |
@@ -127,42 +127,56 @@ static int cn_call_callback(struct cn_msg *msg, void (*destruct_data)(void *), v | |||
127 | { | 127 | { |
128 | struct cn_callback_entry *__cbq; | 128 | struct cn_callback_entry *__cbq; |
129 | struct cn_dev *dev = &cdev; | 129 | struct cn_dev *dev = &cdev; |
130 | int found = 0; | 130 | int err = -ENODEV; |
131 | 131 | ||
132 | spin_lock_bh(&dev->cbdev->queue_lock); | 132 | spin_lock_bh(&dev->cbdev->queue_lock); |
133 | list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { | 133 | list_for_each_entry(__cbq, &dev->cbdev->queue_list, callback_entry) { |
134 | if (cn_cb_equal(&__cbq->cb->id, &msg->id)) { | 134 | if (cn_cb_equal(&__cbq->id.id, &msg->id)) { |
135 | /* | ||
136 | * Let's scream if there is some magic and the | ||
137 | * data will arrive asynchronously here. | ||
138 | * [i.e. netlink messages will be queued]. | ||
139 | * After the first warning I will fix it | ||
140 | * quickly, but now I think it is | ||
141 | * impossible. --zbr (2004_04_27). | ||
142 | */ | ||
143 | if (likely(!test_bit(0, &__cbq->work.pending) && | 135 | if (likely(!test_bit(0, &__cbq->work.pending) && |
144 | __cbq->ddata == NULL)) { | 136 | __cbq->data.ddata == NULL)) { |
145 | __cbq->cb->priv = msg; | 137 | __cbq->data.callback_priv = msg; |
146 | 138 | ||
147 | __cbq->ddata = data; | 139 | __cbq->data.ddata = data; |
148 | __cbq->destruct_data = destruct_data; | 140 | __cbq->data.destruct_data = destruct_data; |
149 | 141 | ||
150 | if (queue_work(dev->cbdev->cn_queue, | 142 | if (queue_work(dev->cbdev->cn_queue, |
151 | &__cbq->work)) | 143 | &__cbq->work)) |
152 | found = 1; | 144 | err = 0; |
153 | } else { | 145 | } else { |
154 | printk("%s: cbq->data=%p, " | 146 | struct work_struct *w; |
155 | "work->pending=%08lx.\n", | 147 | struct cn_callback_data *d; |
156 | __func__, __cbq->ddata, | 148 | |
157 | __cbq->work.pending); | 149 | w = kzalloc(sizeof(*w) + sizeof(*d), GFP_ATOMIC); |
158 | WARN_ON(1); | 150 | if (w) { |
151 | d = (struct cn_callback_data *)(w+1); | ||
152 | |||
153 | d->callback_priv = msg; | ||
154 | d->callback = __cbq->data.callback; | ||
155 | d->ddata = data; | ||
156 | d->destruct_data = destruct_data; | ||
157 | d->free = w; | ||
158 | |||
159 | INIT_LIST_HEAD(&w->entry); | ||
160 | w->pending = 0; | ||
161 | w->func = &cn_queue_wrapper; | ||
162 | w->data = d; | ||
163 | init_timer(&w->timer); | ||
164 | |||
165 | if (queue_work(dev->cbdev->cn_queue, w)) | ||
166 | err = 0; | ||
167 | else { | ||
168 | kfree(w); | ||
169 | err = -EINVAL; | ||
170 | } | ||
171 | } else | ||
172 | err = -ENOMEM; | ||
159 | } | 173 | } |
160 | break; | 174 | break; |
161 | } | 175 | } |
162 | } | 176 | } |
163 | spin_unlock_bh(&dev->cbdev->queue_lock); | 177 | spin_unlock_bh(&dev->cbdev->queue_lock); |
164 | 178 | ||
165 | return found ? 0 : -ENODEV; | 179 | return err; |
166 | } | 180 | } |
167 | 181 | ||
168 | /* | 182 | /* |
@@ -291,22 +305,10 @@ int cn_add_callback(struct cb_id *id, char *name, void (*callback)(void *)) | |||
291 | { | 305 | { |
292 | int err; | 306 | int err; |
293 | struct cn_dev *dev = &cdev; | 307 | struct cn_dev *dev = &cdev; |
294 | struct cn_callback *cb; | ||
295 | |||
296 | cb = kzalloc(sizeof(*cb), GFP_KERNEL); | ||
297 | if (!cb) | ||
298 | return -ENOMEM; | ||
299 | |||
300 | scnprintf(cb->name, sizeof(cb->name), "%s", name); | ||
301 | 308 | ||
302 | memcpy(&cb->id, id, sizeof(cb->id)); | 309 | err = cn_queue_add_callback(dev->cbdev, name, id, callback); |
303 | cb->callback = callback; | 310 | if (err) |
304 | |||
305 | err = cn_queue_add_callback(dev->cbdev, cb); | ||
306 | if (err) { | ||
307 | kfree(cb); | ||
308 | return err; | 311 | return err; |
309 | } | ||
310 | 312 | ||
311 | cn_notify(id, 0); | 313 | cn_notify(id, 0); |
312 | 314 | ||
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 0ccf85fcee34..a35a58bef1a4 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
@@ -477,7 +477,7 @@ static struct pcmcia_device_id ide_ids[] = { | |||
477 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149), | 477 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDE", 0x547e66dc, 0x5c5ab149), |
478 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674), | 478 | PCMCIA_DEVICE_PROD_ID12("IO DATA", "PCIDEII", 0x547e66dc, 0xb3662674), |
479 | PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b), | 479 | PCMCIA_DEVICE_PROD_ID12("LOOKMEET", "CBIDE2 ", 0xe37be2b5, 0x8671043b), |
480 | PCMCIA_DEVICE_PROD_ID12(" ", "NinjaATA-", 0x3b6e20c8, 0xebe0bd79), | 480 | PCMCIA_DEVICE_PROD_ID2("NinjaATA-", 0xebe0bd79), |
481 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591), | 481 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "CD-ROM", 0x281f1c5d, 0x66536591), |
482 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728), | 482 | PCMCIA_DEVICE_PROD_ID12("PCMCIA", "PnPIDE", 0x281f1c5d, 0x0c694728), |
483 | PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1), | 483 | PCMCIA_DEVICE_PROD_ID12("SHUTTLE TECHNOLOGY LTD.", "PCCARD-IDE/ATAPI Adapter", 0x4a3f0ba0, 0x322560e1), |
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 200a0688f717..54ec737195e0 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -230,11 +230,20 @@ static int dm_hash_insert(const char *name, const char *uuid, struct mapped_devi | |||
230 | 230 | ||
231 | static void __hash_remove(struct hash_cell *hc) | 231 | static void __hash_remove(struct hash_cell *hc) |
232 | { | 232 | { |
233 | struct dm_table *table; | ||
234 | |||
233 | /* remove from the dev hash */ | 235 | /* remove from the dev hash */ |
234 | list_del(&hc->uuid_list); | 236 | list_del(&hc->uuid_list); |
235 | list_del(&hc->name_list); | 237 | list_del(&hc->name_list); |
236 | unregister_with_devfs(hc); | 238 | unregister_with_devfs(hc); |
237 | dm_set_mdptr(hc->md, NULL); | 239 | dm_set_mdptr(hc->md, NULL); |
240 | |||
241 | table = dm_get_table(hc->md); | ||
242 | if (table) { | ||
243 | dm_table_event(table); | ||
244 | dm_table_put(table); | ||
245 | } | ||
246 | |||
238 | dm_put(hc->md); | 247 | dm_put(hc->md); |
239 | if (hc->new_map) | 248 | if (hc->new_map) |
240 | dm_table_put(hc->new_map); | 249 | dm_table_put(hc->new_map); |
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 785806bdb248..f9b7b32d5d5c 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c | |||
@@ -329,13 +329,17 @@ static int map_io(struct multipath *m, struct bio *bio, struct mpath_io *mpio, | |||
329 | /* | 329 | /* |
330 | * If we run out of usable paths, should we queue I/O or error it? | 330 | * If we run out of usable paths, should we queue I/O or error it? |
331 | */ | 331 | */ |
332 | static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path) | 332 | static int queue_if_no_path(struct multipath *m, unsigned queue_if_no_path, |
333 | unsigned save_old_value) | ||
333 | { | 334 | { |
334 | unsigned long flags; | 335 | unsigned long flags; |
335 | 336 | ||
336 | spin_lock_irqsave(&m->lock, flags); | 337 | spin_lock_irqsave(&m->lock, flags); |
337 | 338 | ||
338 | m->saved_queue_if_no_path = m->queue_if_no_path; | 339 | if (save_old_value) |
340 | m->saved_queue_if_no_path = m->queue_if_no_path; | ||
341 | else | ||
342 | m->saved_queue_if_no_path = queue_if_no_path; | ||
339 | m->queue_if_no_path = queue_if_no_path; | 343 | m->queue_if_no_path = queue_if_no_path; |
340 | if (!m->queue_if_no_path && m->queue_size) | 344 | if (!m->queue_if_no_path && m->queue_size) |
341 | queue_work(kmultipathd, &m->process_queued_ios); | 345 | queue_work(kmultipathd, &m->process_queued_ios); |
@@ -677,7 +681,7 @@ static int parse_features(struct arg_set *as, struct multipath *m, | |||
677 | return 0; | 681 | return 0; |
678 | 682 | ||
679 | if (!strnicmp(shift(as), MESG_STR("queue_if_no_path"))) | 683 | if (!strnicmp(shift(as), MESG_STR("queue_if_no_path"))) |
680 | return queue_if_no_path(m, 1); | 684 | return queue_if_no_path(m, 1, 0); |
681 | else { | 685 | else { |
682 | ti->error = "Unrecognised multipath feature request"; | 686 | ti->error = "Unrecognised multipath feature request"; |
683 | return -EINVAL; | 687 | return -EINVAL; |
@@ -1077,7 +1081,7 @@ static void multipath_presuspend(struct dm_target *ti) | |||
1077 | { | 1081 | { |
1078 | struct multipath *m = (struct multipath *) ti->private; | 1082 | struct multipath *m = (struct multipath *) ti->private; |
1079 | 1083 | ||
1080 | queue_if_no_path(m, 0); | 1084 | queue_if_no_path(m, 0, 1); |
1081 | } | 1085 | } |
1082 | 1086 | ||
1083 | /* | 1087 | /* |
@@ -1222,9 +1226,9 @@ static int multipath_message(struct dm_target *ti, unsigned argc, char **argv) | |||
1222 | 1226 | ||
1223 | if (argc == 1) { | 1227 | if (argc == 1) { |
1224 | if (!strnicmp(argv[0], MESG_STR("queue_if_no_path"))) | 1228 | if (!strnicmp(argv[0], MESG_STR("queue_if_no_path"))) |
1225 | return queue_if_no_path(m, 1); | 1229 | return queue_if_no_path(m, 1, 0); |
1226 | else if (!strnicmp(argv[0], MESG_STR("fail_if_no_path"))) | 1230 | else if (!strnicmp(argv[0], MESG_STR("fail_if_no_path"))) |
1227 | return queue_if_no_path(m, 0); | 1231 | return queue_if_no_path(m, 0, 0); |
1228 | } | 1232 | } |
1229 | 1233 | ||
1230 | if (argc != 2) | 1234 | if (argc != 2) |
diff --git a/drivers/media/dvb/frontends/tda10021.c b/drivers/media/dvb/frontends/tda10021.c index 87d5f4d8790f..eaf130e666d8 100644 --- a/drivers/media/dvb/frontends/tda10021.c +++ b/drivers/media/dvb/frontends/tda10021.c | |||
@@ -100,8 +100,8 @@ static u8 tda10021_readreg (struct tda10021_state* state, u8 reg) | |||
100 | 100 | ||
101 | ret = i2c_transfer (state->i2c, msg, 2); | 101 | ret = i2c_transfer (state->i2c, msg, 2); |
102 | if (ret != 2) | 102 | if (ret != 2) |
103 | printk("DVB: TDA10021(%d): %s: readreg error (ret == %i)\n", | 103 | printk("DVB: TDA10021: %s: readreg error (ret == %i)\n", |
104 | state->frontend.dvb->num, __FUNCTION__, ret); | 104 | __FUNCTION__, ret); |
105 | return b1[0]; | 105 | return b1[0]; |
106 | } | 106 | } |
107 | 107 | ||
diff --git a/drivers/net/cs89x0.c b/drivers/net/cs89x0.c index cdc07ccd7332..a6078ad9b654 100644 --- a/drivers/net/cs89x0.c +++ b/drivers/net/cs89x0.c | |||
@@ -140,6 +140,7 @@ | |||
140 | 140 | ||
141 | #include <asm/system.h> | 141 | #include <asm/system.h> |
142 | #include <asm/io.h> | 142 | #include <asm/io.h> |
143 | #include <asm/irq.h> | ||
143 | #if ALLOW_DMA | 144 | #if ALLOW_DMA |
144 | #include <asm/dma.h> | 145 | #include <asm/dma.h> |
145 | #endif | 146 | #endif |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 81f4aedf534c..25f85fb9df46 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -67,8 +67,8 @@ | |||
67 | 67 | ||
68 | #define DRV_MODULE_NAME "tg3" | 68 | #define DRV_MODULE_NAME "tg3" |
69 | #define PFX DRV_MODULE_NAME ": " | 69 | #define PFX DRV_MODULE_NAME ": " |
70 | #define DRV_MODULE_VERSION "3.40" | 70 | #define DRV_MODULE_VERSION "3.41" |
71 | #define DRV_MODULE_RELDATE "September 15, 2005" | 71 | #define DRV_MODULE_RELDATE "September 27, 2005" |
72 | 72 | ||
73 | #define TG3_DEF_MAC_MODE 0 | 73 | #define TG3_DEF_MAC_MODE 0 |
74 | #define TG3_DEF_RX_MODE 0 | 74 | #define TG3_DEF_RX_MODE 0 |
@@ -3389,7 +3389,8 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id, | |||
3389 | struct tg3 *tp = netdev_priv(dev); | 3389 | struct tg3 *tp = netdev_priv(dev); |
3390 | struct tg3_hw_status *sblk = tp->hw_status; | 3390 | struct tg3_hw_status *sblk = tp->hw_status; |
3391 | 3391 | ||
3392 | if (sblk->status & SD_STATUS_UPDATED) { | 3392 | if ((sblk->status & SD_STATUS_UPDATED) || |
3393 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { | ||
3393 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | 3394 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, |
3394 | 0x00000001); | 3395 | 0x00000001); |
3395 | return IRQ_RETVAL(1); | 3396 | return IRQ_RETVAL(1); |
@@ -5395,6 +5396,9 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p) | |||
5395 | struct tg3 *tp = netdev_priv(dev); | 5396 | struct tg3 *tp = netdev_priv(dev); |
5396 | struct sockaddr *addr = p; | 5397 | struct sockaddr *addr = p; |
5397 | 5398 | ||
5399 | if (!is_valid_ether_addr(addr->sa_data)) | ||
5400 | return -EINVAL; | ||
5401 | |||
5398 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); | 5402 | memcpy(dev->dev_addr, addr->sa_data, dev->addr_len); |
5399 | 5403 | ||
5400 | spin_lock_bh(&tp->lock); | 5404 | spin_lock_bh(&tp->lock); |
@@ -5806,6 +5810,13 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5806 | } | 5810 | } |
5807 | memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); | 5811 | memset(tp->hw_status, 0, TG3_HW_STATUS_SIZE); |
5808 | 5812 | ||
5813 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
5814 | tp->tg3_flags2 &= ~TG3_FLG2_PARALLEL_DETECT; | ||
5815 | /* reset to prevent losing 1st rx packet intermittently */ | ||
5816 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | ||
5817 | udelay(10); | ||
5818 | } | ||
5819 | |||
5809 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | | 5820 | tp->mac_mode = MAC_MODE_TXSTAT_ENABLE | MAC_MODE_RXSTAT_ENABLE | |
5810 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; | 5821 | MAC_MODE_TDE_ENABLE | MAC_MODE_RDE_ENABLE | MAC_MODE_FHDE_ENABLE; |
5811 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); | 5822 | tw32_f(MAC_MODE, tp->mac_mode | MAC_MODE_RXSTAT_CLEAR | MAC_MODE_TXSTAT_CLEAR); |
@@ -5937,7 +5948,7 @@ static int tg3_reset_hw(struct tg3 *tp) | |||
5937 | tw32(MAC_LED_CTRL, tp->led_ctrl); | 5948 | tw32(MAC_LED_CTRL, tp->led_ctrl); |
5938 | 5949 | ||
5939 | tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); | 5950 | tw32(MAC_MI_STAT, MAC_MI_STAT_LNKSTAT_ATTN_ENAB); |
5940 | if (tp->tg3_flags2 & TG3_FLG2_ANY_SERDES) { | 5951 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) { |
5941 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | 5952 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); |
5942 | udelay(10); | 5953 | udelay(10); |
5943 | } | 5954 | } |
@@ -7360,12 +7371,17 @@ static int tg3_nway_reset(struct net_device *dev) | |||
7360 | if (!netif_running(dev)) | 7371 | if (!netif_running(dev)) |
7361 | return -EAGAIN; | 7372 | return -EAGAIN; |
7362 | 7373 | ||
7374 | if (tp->tg3_flags2 & TG3_FLG2_PHY_SERDES) | ||
7375 | return -EINVAL; | ||
7376 | |||
7363 | spin_lock_bh(&tp->lock); | 7377 | spin_lock_bh(&tp->lock); |
7364 | r = -EINVAL; | 7378 | r = -EINVAL; |
7365 | tg3_readphy(tp, MII_BMCR, &bmcr); | 7379 | tg3_readphy(tp, MII_BMCR, &bmcr); |
7366 | if (!tg3_readphy(tp, MII_BMCR, &bmcr) && | 7380 | if (!tg3_readphy(tp, MII_BMCR, &bmcr) && |
7367 | (bmcr & BMCR_ANENABLE)) { | 7381 | ((bmcr & BMCR_ANENABLE) || |
7368 | tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART); | 7382 | (tp->tg3_flags2 & TG3_FLG2_PARALLEL_DETECT))) { |
7383 | tg3_writephy(tp, MII_BMCR, bmcr | BMCR_ANRESTART | | ||
7384 | BMCR_ANENABLE); | ||
7369 | r = 0; | 7385 | r = 0; |
7370 | } | 7386 | } |
7371 | spin_unlock_bh(&tp->lock); | 7387 | spin_unlock_bh(&tp->lock); |
@@ -7927,19 +7943,32 @@ static int tg3_run_loopback(struct tg3 *tp, int loopback_mode) | |||
7927 | struct tg3_rx_buffer_desc *desc; | 7943 | struct tg3_rx_buffer_desc *desc; |
7928 | 7944 | ||
7929 | if (loopback_mode == TG3_MAC_LOOPBACK) { | 7945 | if (loopback_mode == TG3_MAC_LOOPBACK) { |
7946 | /* HW errata - mac loopback fails in some cases on 5780. | ||
7947 | * Normal traffic and PHY loopback are not affected by | ||
7948 | * errata. | ||
7949 | */ | ||
7950 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5780) | ||
7951 | return 0; | ||
7952 | |||
7930 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 7953 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
7931 | MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY | | 7954 | MAC_MODE_PORT_INT_LPBACK | MAC_MODE_LINK_POLARITY | |
7932 | MAC_MODE_PORT_MODE_GMII; | 7955 | MAC_MODE_PORT_MODE_GMII; |
7933 | tw32(MAC_MODE, mac_mode); | 7956 | tw32(MAC_MODE, mac_mode); |
7934 | } else if (loopback_mode == TG3_PHY_LOOPBACK) { | 7957 | } else if (loopback_mode == TG3_PHY_LOOPBACK) { |
7958 | tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX | | ||
7959 | BMCR_SPEED1000); | ||
7960 | udelay(40); | ||
7961 | /* reset to prevent losing 1st rx packet intermittently */ | ||
7962 | if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES) { | ||
7963 | tw32_f(MAC_RX_MODE, RX_MODE_RESET); | ||
7964 | udelay(10); | ||
7965 | tw32_f(MAC_RX_MODE, tp->rx_mode); | ||
7966 | } | ||
7935 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | | 7967 | mac_mode = (tp->mac_mode & ~MAC_MODE_PORT_MODE_MASK) | |
7936 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; | 7968 | MAC_MODE_LINK_POLARITY | MAC_MODE_PORT_MODE_GMII; |
7937 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) | 7969 | if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) |
7938 | mac_mode &= ~MAC_MODE_LINK_POLARITY; | 7970 | mac_mode &= ~MAC_MODE_LINK_POLARITY; |
7939 | tw32(MAC_MODE, mac_mode); | 7971 | tw32(MAC_MODE, mac_mode); |
7940 | |||
7941 | tg3_writephy(tp, MII_BMCR, BMCR_LOOPBACK | BMCR_FULLDPLX | | ||
7942 | BMCR_SPEED1000); | ||
7943 | } | 7972 | } |
7944 | else | 7973 | else |
7945 | return -EINVAL; | 7974 | return -EINVAL; |
@@ -10324,6 +10353,44 @@ static char * __devinit tg3_phy_string(struct tg3 *tp) | |||
10324 | }; | 10353 | }; |
10325 | } | 10354 | } |
10326 | 10355 | ||
10356 | static char * __devinit tg3_bus_string(struct tg3 *tp, char *str) | ||
10357 | { | ||
10358 | if (tp->tg3_flags2 & TG3_FLG2_PCI_EXPRESS) { | ||
10359 | strcpy(str, "PCI Express"); | ||
10360 | return str; | ||
10361 | } else if (tp->tg3_flags & TG3_FLAG_PCIX_MODE) { | ||
10362 | u32 clock_ctrl = tr32(TG3PCI_CLOCK_CTRL) & 0x1f; | ||
10363 | |||
10364 | strcpy(str, "PCIX:"); | ||
10365 | |||
10366 | if ((clock_ctrl == 7) || | ||
10367 | ((tr32(GRC_MISC_CFG) & GRC_MISC_CFG_BOARD_ID_MASK) == | ||
10368 | GRC_MISC_CFG_BOARD_ID_5704CIOBE)) | ||
10369 | strcat(str, "133MHz"); | ||
10370 | else if (clock_ctrl == 0) | ||
10371 | strcat(str, "33MHz"); | ||
10372 | else if (clock_ctrl == 2) | ||
10373 | strcat(str, "50MHz"); | ||
10374 | else if (clock_ctrl == 4) | ||
10375 | strcat(str, "66MHz"); | ||
10376 | else if (clock_ctrl == 6) | ||
10377 | strcat(str, "100MHz"); | ||
10378 | else if (clock_ctrl == 7) | ||
10379 | strcat(str, "133MHz"); | ||
10380 | } else { | ||
10381 | strcpy(str, "PCI:"); | ||
10382 | if (tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) | ||
10383 | strcat(str, "66MHz"); | ||
10384 | else | ||
10385 | strcat(str, "33MHz"); | ||
10386 | } | ||
10387 | if (tp->tg3_flags & TG3_FLAG_PCI_32BIT) | ||
10388 | strcat(str, ":32-bit"); | ||
10389 | else | ||
10390 | strcat(str, ":64-bit"); | ||
10391 | return str; | ||
10392 | } | ||
10393 | |||
10327 | static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) | 10394 | static struct pci_dev * __devinit tg3_find_5704_peer(struct tg3 *tp) |
10328 | { | 10395 | { |
10329 | struct pci_dev *peer; | 10396 | struct pci_dev *peer; |
@@ -10386,6 +10453,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
10386 | struct net_device *dev; | 10453 | struct net_device *dev; |
10387 | struct tg3 *tp; | 10454 | struct tg3 *tp; |
10388 | int i, err, pci_using_dac, pm_cap; | 10455 | int i, err, pci_using_dac, pm_cap; |
10456 | char str[40]; | ||
10389 | 10457 | ||
10390 | if (tg3_version_printed++ == 0) | 10458 | if (tg3_version_printed++ == 0) |
10391 | printk(KERN_INFO "%s", version); | 10459 | printk(KERN_INFO "%s", version); |
@@ -10631,16 +10699,12 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
10631 | 10699 | ||
10632 | pci_set_drvdata(pdev, dev); | 10700 | pci_set_drvdata(pdev, dev); |
10633 | 10701 | ||
10634 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (PCI%s:%s:%s) %sBaseT Ethernet ", | 10702 | printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %sBaseT Ethernet ", |
10635 | dev->name, | 10703 | dev->name, |
10636 | tp->board_part_number, | 10704 | tp->board_part_number, |
10637 | tp->pci_chip_rev_id, | 10705 | tp->pci_chip_rev_id, |
10638 | tg3_phy_string(tp), | 10706 | tg3_phy_string(tp), |
10639 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "X" : ""), | 10707 | tg3_bus_string(tp, str), |
10640 | ((tp->tg3_flags & TG3_FLAG_PCI_HIGH_SPEED) ? | ||
10641 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "133MHz" : "66MHz") : | ||
10642 | ((tp->tg3_flags & TG3_FLAG_PCIX_MODE) ? "100MHz" : "33MHz")), | ||
10643 | ((tp->tg3_flags & TG3_FLAG_PCI_32BIT) ? "32-bit" : "64-bit"), | ||
10644 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000"); | 10708 | (tp->tg3_flags & TG3_FLAG_10_100_ONLY) ? "10/100" : "10/100/1000"); |
10645 | 10709 | ||
10646 | for (i = 0; i < 6; i++) | 10710 | for (i = 0; i < 6; i++) |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index c184b773e585..2e733c60bfa4 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2246,6 +2246,7 @@ struct tg3 { | |||
2246 | (X) == PHY_ID_BCM5411 || (X) == PHY_ID_BCM5701 || \ | 2246 | (X) == PHY_ID_BCM5411 || (X) == PHY_ID_BCM5701 || \ |
2247 | (X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \ | 2247 | (X) == PHY_ID_BCM5703 || (X) == PHY_ID_BCM5704 || \ |
2248 | (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \ | 2248 | (X) == PHY_ID_BCM5705 || (X) == PHY_ID_BCM5750 || \ |
2249 | (X) == PHY_ID_BCM5752 || (X) == PHY_ID_BCM5780 || \ | ||
2249 | (X) == PHY_ID_BCM8002) | 2250 | (X) == PHY_ID_BCM8002) |
2250 | 2251 | ||
2251 | struct tg3_hw_stats *hw_stats; | 2252 | struct tg3_hw_stats *hw_stats; |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index 8de49fe57233..6deb7cc810cc 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
@@ -2458,7 +2458,6 @@ struct net_device *alloc_orinocodev(int sizeof_card, | |||
2458 | dev->watchdog_timeo = HZ; /* 1 second timeout */ | 2458 | dev->watchdog_timeo = HZ; /* 1 second timeout */ |
2459 | dev->get_stats = orinoco_get_stats; | 2459 | dev->get_stats = orinoco_get_stats; |
2460 | dev->ethtool_ops = &orinoco_ethtool_ops; | 2460 | dev->ethtool_ops = &orinoco_ethtool_ops; |
2461 | dev->get_wireless_stats = orinoco_get_wireless_stats; | ||
2462 | dev->wireless_handlers = (struct iw_handler_def *)&orinoco_handler_def; | 2461 | dev->wireless_handlers = (struct iw_handler_def *)&orinoco_handler_def; |
2463 | dev->change_mtu = orinoco_change_mtu; | 2462 | dev->change_mtu = orinoco_change_mtu; |
2464 | dev->set_multicast_list = orinoco_set_multicast_list; | 2463 | dev->set_multicast_list = orinoco_set_multicast_list; |
@@ -4399,6 +4398,7 @@ static const struct iw_handler_def orinoco_handler_def = { | |||
4399 | .standard = orinoco_handler, | 4398 | .standard = orinoco_handler, |
4400 | .private = orinoco_private_handler, | 4399 | .private = orinoco_private_handler, |
4401 | .private_args = orinoco_privtab, | 4400 | .private_args = orinoco_privtab, |
4401 | .get_wireless_stats = orinoco_get_wireless_stats, | ||
4402 | }; | 4402 | }; |
4403 | 4403 | ||
4404 | static void orinoco_get_drvinfo(struct net_device *dev, | 4404 | static void orinoco_get_drvinfo(struct net_device *dev, |
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index ddc741e6ecbf..36cc9a96a338 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -146,7 +146,7 @@ config I82365 | |||
146 | 146 | ||
147 | config TCIC | 147 | config TCIC |
148 | tristate "Databook TCIC host bridge support" | 148 | tristate "Databook TCIC host bridge support" |
149 | depends on PCMCIA | 149 | depends on PCMCIA && ISA |
150 | select PCCARD_NONSTATIC | 150 | select PCCARD_NONSTATIC |
151 | help | 151 | help |
152 | Say Y here to include support for the Databook TCIC family of PCMCIA | 152 | Say Y here to include support for the Databook TCIC family of PCMCIA |
diff --git a/drivers/pcmcia/cardbus.c b/drivers/pcmcia/cardbus.c index 1d755e20880c..3f6d51d11374 100644 --- a/drivers/pcmcia/cardbus.c +++ b/drivers/pcmcia/cardbus.c | |||
@@ -228,6 +228,11 @@ int cb_alloc(struct pcmcia_socket * s) | |||
228 | pci_bus_size_bridges(bus); | 228 | pci_bus_size_bridges(bus); |
229 | pci_bus_assign_resources(bus); | 229 | pci_bus_assign_resources(bus); |
230 | cardbus_assign_irqs(bus, s->pci_irq); | 230 | cardbus_assign_irqs(bus, s->pci_irq); |
231 | |||
232 | /* socket specific tune function */ | ||
233 | if (s->tune_bridge) | ||
234 | s->tune_bridge(s, bus); | ||
235 | |||
231 | pci_enable_bridges(bus); | 236 | pci_enable_bridges(bus); |
232 | pci_bus_add_devices(bus); | 237 | pci_bus_add_devices(bus); |
233 | 238 | ||
diff --git a/drivers/pcmcia/ti113x.h b/drivers/pcmcia/ti113x.h index fbe233e19ceb..da0b404561c9 100644 --- a/drivers/pcmcia/ti113x.h +++ b/drivers/pcmcia/ti113x.h | |||
@@ -59,6 +59,7 @@ | |||
59 | 59 | ||
60 | #define TI122X_SCR_SER_STEP 0xc0000000 | 60 | #define TI122X_SCR_SER_STEP 0xc0000000 |
61 | #define TI122X_SCR_INTRTIE 0x20000000 | 61 | #define TI122X_SCR_INTRTIE 0x20000000 |
62 | #define TIXX21_SCR_TIEALL 0x10000000 | ||
62 | #define TI122X_SCR_CBRSVD 0x00400000 | 63 | #define TI122X_SCR_CBRSVD 0x00400000 |
63 | #define TI122X_SCR_MRBURSTDN 0x00008000 | 64 | #define TI122X_SCR_MRBURSTDN 0x00008000 |
64 | #define TI122X_SCR_MRBURSTUP 0x00004000 | 65 | #define TI122X_SCR_MRBURSTUP 0x00004000 |
@@ -153,6 +154,12 @@ | |||
153 | /* EnE test register */ | 154 | /* EnE test register */ |
154 | #define ENE_TEST_C9 0xc9 /* 8bit */ | 155 | #define ENE_TEST_C9 0xc9 /* 8bit */ |
155 | #define ENE_TEST_C9_TLTENABLE 0x02 | 156 | #define ENE_TEST_C9_TLTENABLE 0x02 |
157 | #define ENE_TEST_C9_PFENABLE_F0 0x04 | ||
158 | #define ENE_TEST_C9_PFENABLE_F1 0x08 | ||
159 | #define ENE_TEST_C9_PFENABLE (ENE_TEST_C9_PFENABLE_F0 | ENE_TEST_C9_PFENABLE_F0) | ||
160 | #define ENE_TEST_C9_WPDISALBLE_F0 0x40 | ||
161 | #define ENE_TEST_C9_WPDISALBLE_F1 0x80 | ||
162 | #define ENE_TEST_C9_WPDISALBLE (ENE_TEST_C9_WPDISALBLE_F0 | ENE_TEST_C9_WPDISALBLE_F1) | ||
156 | 163 | ||
157 | /* | 164 | /* |
158 | * Texas Instruments CardBus controller overrides. | 165 | * Texas Instruments CardBus controller overrides. |
@@ -618,6 +625,7 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
618 | int devfn; | 625 | int devfn; |
619 | unsigned int state; | 626 | unsigned int state; |
620 | int ret = 1; | 627 | int ret = 1; |
628 | u32 sysctl; | ||
621 | 629 | ||
622 | /* catch the two-slot controllers */ | 630 | /* catch the two-slot controllers */ |
623 | switch (socket->dev->device) { | 631 | switch (socket->dev->device) { |
@@ -640,6 +648,24 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
640 | */ | 648 | */ |
641 | break; | 649 | break; |
642 | 650 | ||
651 | case PCI_DEVICE_ID_TI_X515: | ||
652 | case PCI_DEVICE_ID_TI_X420: | ||
653 | case PCI_DEVICE_ID_TI_X620: | ||
654 | case PCI_DEVICE_ID_TI_XX21_XX11: | ||
655 | case PCI_DEVICE_ID_TI_7410: | ||
656 | case PCI_DEVICE_ID_TI_7610: | ||
657 | /* | ||
658 | * those are either single or dual slot CB with additional functions | ||
659 | * like 1394, smartcard reader, etc. check the TIEALL flag for them | ||
660 | * the TIEALL flag binds the IRQ of all functions toghether. | ||
661 | * we catch the single slot variants later. | ||
662 | */ | ||
663 | sysctl = config_readl(socket, TI113X_SYSTEM_CONTROL); | ||
664 | if (sysctl & TIXX21_SCR_TIEALL) | ||
665 | return 0; | ||
666 | |||
667 | break; | ||
668 | |||
643 | /* single-slot controllers have the 2nd slot empty always :) */ | 669 | /* single-slot controllers have the 2nd slot empty always :) */ |
644 | default: | 670 | default: |
645 | return 1; | 671 | return 1; |
@@ -652,6 +678,15 @@ static int ti12xx_2nd_slot_empty(struct yenta_socket *socket) | |||
652 | if (!func) | 678 | if (!func) |
653 | return 1; | 679 | return 1; |
654 | 680 | ||
681 | /* | ||
682 | * check that the device id of both slots match. this is needed for the | ||
683 | * XX21 and the XX11 controller that share the same device id for single | ||
684 | * and dual slot controllers. return '2nd slot empty'. we already checked | ||
685 | * if the interrupt is tied to another function. | ||
686 | */ | ||
687 | if (socket->dev->device != func->device) | ||
688 | goto out; | ||
689 | |||
655 | slot2 = pci_get_drvdata(func); | 690 | slot2 = pci_get_drvdata(func); |
656 | if (!slot2) | 691 | if (!slot2) |
657 | goto out; | 692 | goto out; |
@@ -791,16 +826,6 @@ static int ti12xx_override(struct yenta_socket *socket) | |||
791 | config_writel(socket, TI113X_SYSTEM_CONTROL, val); | 826 | config_writel(socket, TI113X_SYSTEM_CONTROL, val); |
792 | 827 | ||
793 | /* | 828 | /* |
794 | * for EnE bridges only: clear testbit TLTEnable. this makes the | ||
795 | * RME Hammerfall DSP sound card working. | ||
796 | */ | ||
797 | if (socket->dev->vendor == PCI_VENDOR_ID_ENE) { | ||
798 | u8 test_c9 = config_readb(socket, ENE_TEST_C9); | ||
799 | test_c9 &= ~ENE_TEST_C9_TLTENABLE; | ||
800 | config_writeb(socket, ENE_TEST_C9, test_c9); | ||
801 | } | ||
802 | |||
803 | /* | ||
804 | * Yenta expects controllers to use CSCINT to route | 829 | * Yenta expects controllers to use CSCINT to route |
805 | * CSC interrupts to PCI rather than INTVAL. | 830 | * CSC interrupts to PCI rather than INTVAL. |
806 | */ | 831 | */ |
@@ -841,5 +866,75 @@ static int ti1250_override(struct yenta_socket *socket) | |||
841 | return ti12xx_override(socket); | 866 | return ti12xx_override(socket); |
842 | } | 867 | } |
843 | 868 | ||
869 | |||
870 | /** | ||
871 | * EnE specific part. EnE bridges are register compatible with TI bridges but | ||
872 | * have their own test registers and more important their own little problems. | ||
873 | * Some fixup code to make everybody happy (TM). | ||
874 | */ | ||
875 | |||
876 | /** | ||
877 | * set/clear various test bits: | ||
878 | * Defaults to clear the bit. | ||
879 | * - mask (u8) defines what bits to change | ||
880 | * - bits (u8) is the values to change them to | ||
881 | * -> it's | ||
882 | * current = (current & ~mask) | bits | ||
883 | */ | ||
884 | /* pci ids of devices that wants to have the bit set */ | ||
885 | #define DEVID(_vend,_dev,_subvend,_subdev,mask,bits) { \ | ||
886 | .vendor = _vend, \ | ||
887 | .device = _dev, \ | ||
888 | .subvendor = _subvend, \ | ||
889 | .subdevice = _subdev, \ | ||
890 | .driver_data = ((mask) << 8 | (bits)), \ | ||
891 | } | ||
892 | static struct pci_device_id ene_tune_tbl[] = { | ||
893 | /* Echo Audio products based on motorola DSP56301 and DSP56361 */ | ||
894 | DEVID(PCI_VENDOR_ID_MOTOROLA, 0x1801, 0xECC0, PCI_ANY_ID, | ||
895 | ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE), | ||
896 | DEVID(PCI_VENDOR_ID_MOTOROLA, 0x3410, 0xECC0, PCI_ANY_ID, | ||
897 | ENE_TEST_C9_TLTENABLE | ENE_TEST_C9_PFENABLE, ENE_TEST_C9_TLTENABLE), | ||
898 | |||
899 | {} | ||
900 | }; | ||
901 | |||
902 | static void ene_tune_bridge(struct pcmcia_socket *sock, struct pci_bus *bus) | ||
903 | { | ||
904 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); | ||
905 | struct pci_dev *dev; | ||
906 | struct pci_device_id *id = NULL; | ||
907 | u8 test_c9, old_c9, mask, bits; | ||
908 | |||
909 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
910 | id = (struct pci_device_id *) pci_match_id(ene_tune_tbl, dev); | ||
911 | if (id) | ||
912 | break; | ||
913 | } | ||
914 | |||
915 | test_c9 = old_c9 = config_readb(socket, ENE_TEST_C9); | ||
916 | if (id) { | ||
917 | mask = (id->driver_data >> 8) & 0xFF; | ||
918 | bits = id->driver_data & 0xFF; | ||
919 | |||
920 | test_c9 = (test_c9 & ~mask) | bits; | ||
921 | } | ||
922 | else | ||
923 | /* default to clear TLTEnable bit, old behaviour */ | ||
924 | test_c9 &= ~ENE_TEST_C9_TLTENABLE; | ||
925 | |||
926 | printk(KERN_INFO "yenta EnE: chaning testregister 0xC9, %02x -> %02x\n", old_c9, test_c9); | ||
927 | config_writeb(socket, ENE_TEST_C9, test_c9); | ||
928 | } | ||
929 | |||
930 | |||
931 | static int ene_override(struct yenta_socket *socket) | ||
932 | { | ||
933 | /* install tune_bridge() function */ | ||
934 | socket->socket.tune_bridge = ene_tune_bridge; | ||
935 | |||
936 | return ti1250_override(socket); | ||
937 | } | ||
938 | |||
844 | #endif /* _LINUX_TI113X_H */ | 939 | #endif /* _LINUX_TI113X_H */ |
845 | 940 | ||
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c index ba4d78e5b121..db9f952f9e3c 100644 --- a/drivers/pcmcia/yenta_socket.c +++ b/drivers/pcmcia/yenta_socket.c | |||
@@ -559,12 +559,6 @@ static void yenta_interrogate(struct yenta_socket *socket) | |||
559 | static int yenta_sock_init(struct pcmcia_socket *sock) | 559 | static int yenta_sock_init(struct pcmcia_socket *sock) |
560 | { | 560 | { |
561 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); | 561 | struct yenta_socket *socket = container_of(sock, struct yenta_socket, socket); |
562 | u16 bridge; | ||
563 | |||
564 | bridge = config_readw(socket, CB_BRIDGE_CONTROL) & ~CB_BRIDGE_INTR; | ||
565 | if (!socket->cb_irq) | ||
566 | bridge |= CB_BRIDGE_INTR; | ||
567 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | ||
568 | 562 | ||
569 | exca_writeb(socket, I365_GBLCTL, 0x00); | 563 | exca_writeb(socket, I365_GBLCTL, 0x00); |
570 | exca_writeb(socket, I365_GENCTL, 0x00); | 564 | exca_writeb(socket, I365_GENCTL, 0x00); |
@@ -819,6 +813,7 @@ enum { | |||
819 | CARDBUS_TYPE_TOPIC95, | 813 | CARDBUS_TYPE_TOPIC95, |
820 | CARDBUS_TYPE_TOPIC97, | 814 | CARDBUS_TYPE_TOPIC97, |
821 | CARDBUS_TYPE_O2MICRO, | 815 | CARDBUS_TYPE_O2MICRO, |
816 | CARDBUS_TYPE_ENE, | ||
822 | }; | 817 | }; |
823 | 818 | ||
824 | /* | 819 | /* |
@@ -865,6 +860,12 @@ static struct cardbus_type cardbus_type[] = { | |||
865 | .override = o2micro_override, | 860 | .override = o2micro_override, |
866 | .restore_state = o2micro_restore_state, | 861 | .restore_state = o2micro_restore_state, |
867 | }, | 862 | }, |
863 | [CARDBUS_TYPE_ENE] = { | ||
864 | .override = ene_override, | ||
865 | .save_state = ti_save_state, | ||
866 | .restore_state = ti_restore_state, | ||
867 | .sock_init = ti_init, | ||
868 | }, | ||
868 | }; | 869 | }; |
869 | 870 | ||
870 | 871 | ||
@@ -883,16 +884,8 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
883 | { | 884 | { |
884 | int i; | 885 | int i; |
885 | unsigned long val; | 886 | unsigned long val; |
886 | u16 bridge_ctrl; | ||
887 | u32 mask; | 887 | u32 mask; |
888 | 888 | ||
889 | /* Set up ISA irq routing to probe the ISA irqs.. */ | ||
890 | bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL); | ||
891 | if (!(bridge_ctrl & CB_BRIDGE_INTR)) { | ||
892 | bridge_ctrl |= CB_BRIDGE_INTR; | ||
893 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
894 | } | ||
895 | |||
896 | /* | 889 | /* |
897 | * Probe for usable interrupts using the force | 890 | * Probe for usable interrupts using the force |
898 | * register to generate bogus card status events. | 891 | * register to generate bogus card status events. |
@@ -914,9 +907,6 @@ static unsigned int yenta_probe_irq(struct yenta_socket *socket, u32 isa_irq_mas | |||
914 | 907 | ||
915 | mask = probe_irq_mask(val) & 0xffff; | 908 | mask = probe_irq_mask(val) & 0xffff; |
916 | 909 | ||
917 | bridge_ctrl &= ~CB_BRIDGE_INTR; | ||
918 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
919 | |||
920 | return mask; | 910 | return mask; |
921 | } | 911 | } |
922 | 912 | ||
@@ -944,18 +934,11 @@ static irqreturn_t yenta_probe_handler(int irq, void *dev_id, struct pt_regs *re | |||
944 | /* probes the PCI interrupt, use only on override functions */ | 934 | /* probes the PCI interrupt, use only on override functions */ |
945 | static int yenta_probe_cb_irq(struct yenta_socket *socket) | 935 | static int yenta_probe_cb_irq(struct yenta_socket *socket) |
946 | { | 936 | { |
947 | u16 bridge_ctrl; | ||
948 | |||
949 | if (!socket->cb_irq) | 937 | if (!socket->cb_irq) |
950 | return -1; | 938 | return -1; |
951 | 939 | ||
952 | socket->probe_status = 0; | 940 | socket->probe_status = 0; |
953 | 941 | ||
954 | /* disable ISA interrupts */ | ||
955 | bridge_ctrl = config_readw(socket, CB_BRIDGE_CONTROL); | ||
956 | bridge_ctrl &= ~CB_BRIDGE_INTR; | ||
957 | config_writew(socket, CB_BRIDGE_CONTROL, bridge_ctrl); | ||
958 | |||
959 | if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { | 942 | if (request_irq(socket->cb_irq, yenta_probe_handler, SA_SHIRQ, "yenta", socket)) { |
960 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); | 943 | printk(KERN_WARNING "Yenta: request_irq() in yenta_probe_cb_irq() failed!\n"); |
961 | return -1; | 944 | return -1; |
@@ -966,7 +949,7 @@ static int yenta_probe_cb_irq(struct yenta_socket *socket) | |||
966 | cb_writel(socket, CB_SOCKET_EVENT, -1); | 949 | cb_writel(socket, CB_SOCKET_EVENT, -1); |
967 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); | 950 | cb_writel(socket, CB_SOCKET_MASK, CB_CSTSMASK); |
968 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); | 951 | cb_writel(socket, CB_SOCKET_FORCE, CB_FCARDSTS); |
969 | 952 | ||
970 | msleep(100); | 953 | msleep(100); |
971 | 954 | ||
972 | /* disable interrupts */ | 955 | /* disable interrupts */ |
@@ -1004,11 +987,12 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
1004 | { | 987 | { |
1005 | u16 bridge; | 988 | u16 bridge; |
1006 | struct pci_dev *dev = socket->dev; | 989 | struct pci_dev *dev = socket->dev; |
990 | struct pci_bus_region region; | ||
1007 | 991 | ||
1008 | pci_set_power_state(socket->dev, 0); | 992 | pcibios_resource_to_bus(socket->dev, ®ion, &dev->resource[0]); |
1009 | 993 | ||
1010 | config_writel(socket, CB_LEGACY_MODE_BASE, 0); | 994 | config_writel(socket, CB_LEGACY_MODE_BASE, 0); |
1011 | config_writel(socket, PCI_BASE_ADDRESS_0, dev->resource[0].start); | 995 | config_writel(socket, PCI_BASE_ADDRESS_0, region.start); |
1012 | config_writew(socket, PCI_COMMAND, | 996 | config_writew(socket, PCI_COMMAND, |
1013 | PCI_COMMAND_IO | | 997 | PCI_COMMAND_IO | |
1014 | PCI_COMMAND_MEMORY | | 998 | PCI_COMMAND_MEMORY | |
@@ -1031,8 +1015,8 @@ static void yenta_config_init(struct yenta_socket *socket) | |||
1031 | * - PCI interrupts enabled if a PCI interrupt exists.. | 1015 | * - PCI interrupts enabled if a PCI interrupt exists.. |
1032 | */ | 1016 | */ |
1033 | bridge = config_readw(socket, CB_BRIDGE_CONTROL); | 1017 | bridge = config_readw(socket, CB_BRIDGE_CONTROL); |
1034 | bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_INTR | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN); | 1018 | bridge &= ~(CB_BRIDGE_CRST | CB_BRIDGE_PREFETCH1 | CB_BRIDGE_ISAEN | CB_BRIDGE_VGAEN); |
1035 | bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN | CB_BRIDGE_INTR; | 1019 | bridge |= CB_BRIDGE_PREFETCH0 | CB_BRIDGE_POSTEN; |
1036 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); | 1020 | config_writew(socket, CB_BRIDGE_CONTROL, bridge); |
1037 | } | 1021 | } |
1038 | 1022 | ||
@@ -1265,10 +1249,22 @@ static struct pci_device_id yenta_table [] = { | |||
1265 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250), | 1249 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1250, TI1250), |
1266 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1410, TI1250), | 1250 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1410, TI1250), |
1267 | 1251 | ||
1268 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, TI12XX), | 1252 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XX21_XX11, TI12XX), |
1269 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, TI12XX), | 1253 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X515, TI12XX), |
1270 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, TI1250), | 1254 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X420, TI12XX), |
1271 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, TI12XX), | 1255 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_X620, TI12XX), |
1256 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7410, TI12XX), | ||
1257 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7510, TI12XX), | ||
1258 | CB_ID(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_7610, TI12XX), | ||
1259 | |||
1260 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_710, TI12XX), | ||
1261 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_712, TI12XX), | ||
1262 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_720, TI12XX), | ||
1263 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_722, TI12XX), | ||
1264 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1211, ENE), | ||
1265 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1225, ENE), | ||
1266 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1410, ENE), | ||
1267 | CB_ID(PCI_VENDOR_ID_ENE, PCI_DEVICE_ID_ENE_1420, ENE), | ||
1272 | 1268 | ||
1273 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C465, RICOH), | 1269 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C465, RICOH), |
1274 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C466, RICOH), | 1270 | CB_ID(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_RL5C466, RICOH), |
diff --git a/drivers/serial/serial_cs.c b/drivers/serial/serial_cs.c index 1ae0b381c162..2c7d3ef76e8e 100644 --- a/drivers/serial/serial_cs.c +++ b/drivers/serial/serial_cs.c | |||
@@ -859,6 +859,7 @@ static struct pcmcia_device_id serial_ids[] = { | |||
859 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "DP83903.cis"), | 859 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0175, 0x0000, "DP83903.cis"), |
860 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "3CXEM556.cis"), | 860 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x0035, "3CXEM556.cis"), |
861 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "3CXEM556.cis"), | 861 | PCMCIA_MFC_DEVICE_CIS_MANF_CARD(1, 0x0101, 0x003d, "3CXEM556.cis"), |
862 | PCMCIA_DEVICE_CIS_MANF_CARD(0x0192, 0x0710, "SW_7xx_SER.cis"), /* Sierra Wireless AC710/AC750 GPRS Network Adapter R1 */ | ||
862 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), | 863 | PCMCIA_DEVICE_CIS_PROD_ID12("MultiTech", "PCMCIA 56K DataFax", 0x842047ee, 0xc2efcf03, "MT5634ZLX.cis"), |
863 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), | 864 | PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "COMpad4.cis"), |
864 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), | 865 | PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "COMpad2.cis"), |