diff options
Diffstat (limited to 'drivers/s390')
-rw-r--r-- | drivers/s390/block/dasd_eer.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/fs3270.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/tape_char.c | 1 | ||||
-rw-r--r-- | drivers/s390/char/tape_core.c | 68 | ||||
-rw-r--r-- | drivers/s390/char/vmlogrdr.c | 37 | ||||
-rw-r--r-- | drivers/s390/char/vmur.c | 1 | ||||
-rw-r--r-- | drivers/s390/cio/device.c | 11 | ||||
-rw-r--r-- | drivers/s390/cio/qdio_thinint.c | 2 | ||||
-rw-r--r-- | drivers/s390/crypto/zcrypt_api.c | 1 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core.h | 9 | ||||
-rw-r--r-- | drivers/s390/net/qeth_core_main.c | 55 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 4 |
12 files changed, 106 insertions, 85 deletions
diff --git a/drivers/s390/block/dasd_eer.c b/drivers/s390/block/dasd_eer.c index c71d89dba302..83b4615a3b62 100644 --- a/drivers/s390/block/dasd_eer.c +++ b/drivers/s390/block/dasd_eer.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/device.h> | 17 | #include <linux/device.h> |
18 | #include <linux/poll.h> | 18 | #include <linux/poll.h> |
19 | #include <linux/mutex.h> | 19 | #include <linux/mutex.h> |
20 | #include <linux/smp_lock.h> | ||
21 | #include <linux/err.h> | 20 | #include <linux/err.h> |
22 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
23 | 22 | ||
diff --git a/drivers/s390/char/fs3270.c b/drivers/s390/char/fs3270.c index eb28fb01a38a..f6489eb7e976 100644 --- a/drivers/s390/char/fs3270.c +++ b/drivers/s390/char/fs3270.c | |||
@@ -14,7 +14,6 @@ | |||
14 | #include <linux/list.h> | 14 | #include <linux/list.h> |
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/types.h> | 16 | #include <linux/types.h> |
17 | #include <linux/smp_lock.h> | ||
18 | 17 | ||
19 | #include <asm/compat.h> | 18 | #include <asm/compat.h> |
20 | #include <asm/ccwdev.h> | 19 | #include <asm/ccwdev.h> |
diff --git a/drivers/s390/char/tape_char.c b/drivers/s390/char/tape_char.c index 883e2db02bd3..e090a307fdee 100644 --- a/drivers/s390/char/tape_char.c +++ b/drivers/s390/char/tape_char.c | |||
@@ -17,7 +17,6 @@ | |||
17 | #include <linux/types.h> | 17 | #include <linux/types.h> |
18 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
19 | #include <linux/mtio.h> | 19 | #include <linux/mtio.h> |
20 | #include <linux/smp_lock.h> | ||
21 | #include <linux/compat.h> | 20 | #include <linux/compat.h> |
22 | 21 | ||
23 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
diff --git a/drivers/s390/char/tape_core.c b/drivers/s390/char/tape_core.c index 6c408670e08d..b3a3e8e8656e 100644 --- a/drivers/s390/char/tape_core.c +++ b/drivers/s390/char/tape_core.c | |||
@@ -209,29 +209,79 @@ tape_state_set(struct tape_device *device, enum tape_state newstate) | |||
209 | wake_up(&device->state_change_wq); | 209 | wake_up(&device->state_change_wq); |
210 | } | 210 | } |
211 | 211 | ||
212 | struct tape_med_state_work_data { | ||
213 | struct tape_device *device; | ||
214 | enum tape_medium_state state; | ||
215 | struct work_struct work; | ||
216 | }; | ||
217 | |||
218 | static void | ||
219 | tape_med_state_work_handler(struct work_struct *work) | ||
220 | { | ||
221 | static char env_state_loaded[] = "MEDIUM_STATE=LOADED"; | ||
222 | static char env_state_unloaded[] = "MEDIUM_STATE=UNLOADED"; | ||
223 | struct tape_med_state_work_data *p = | ||
224 | container_of(work, struct tape_med_state_work_data, work); | ||
225 | struct tape_device *device = p->device; | ||
226 | char *envp[] = { NULL, NULL }; | ||
227 | |||
228 | switch (p->state) { | ||
229 | case MS_UNLOADED: | ||
230 | pr_info("%s: The tape cartridge has been successfully " | ||
231 | "unloaded\n", dev_name(&device->cdev->dev)); | ||
232 | envp[0] = env_state_unloaded; | ||
233 | kobject_uevent_env(&device->cdev->dev.kobj, KOBJ_CHANGE, envp); | ||
234 | break; | ||
235 | case MS_LOADED: | ||
236 | pr_info("%s: A tape cartridge has been mounted\n", | ||
237 | dev_name(&device->cdev->dev)); | ||
238 | envp[0] = env_state_loaded; | ||
239 | kobject_uevent_env(&device->cdev->dev.kobj, KOBJ_CHANGE, envp); | ||
240 | break; | ||
241 | default: | ||
242 | break; | ||
243 | } | ||
244 | tape_put_device(device); | ||
245 | kfree(p); | ||
246 | } | ||
247 | |||
248 | static void | ||
249 | tape_med_state_work(struct tape_device *device, enum tape_medium_state state) | ||
250 | { | ||
251 | struct tape_med_state_work_data *p; | ||
252 | |||
253 | p = kzalloc(sizeof(*p), GFP_ATOMIC); | ||
254 | if (p) { | ||
255 | INIT_WORK(&p->work, tape_med_state_work_handler); | ||
256 | p->device = tape_get_device(device); | ||
257 | p->state = state; | ||
258 | schedule_work(&p->work); | ||
259 | } | ||
260 | } | ||
261 | |||
212 | void | 262 | void |
213 | tape_med_state_set(struct tape_device *device, enum tape_medium_state newstate) | 263 | tape_med_state_set(struct tape_device *device, enum tape_medium_state newstate) |
214 | { | 264 | { |
215 | if (device->medium_state == newstate) | 265 | enum tape_medium_state oldstate; |
266 | |||
267 | oldstate = device->medium_state; | ||
268 | if (oldstate == newstate) | ||
216 | return; | 269 | return; |
270 | device->medium_state = newstate; | ||
217 | switch(newstate){ | 271 | switch(newstate){ |
218 | case MS_UNLOADED: | 272 | case MS_UNLOADED: |
219 | device->tape_generic_status |= GMT_DR_OPEN(~0); | 273 | device->tape_generic_status |= GMT_DR_OPEN(~0); |
220 | if (device->medium_state == MS_LOADED) | 274 | if (oldstate == MS_LOADED) |
221 | pr_info("%s: The tape cartridge has been successfully " | 275 | tape_med_state_work(device, MS_UNLOADED); |
222 | "unloaded\n", dev_name(&device->cdev->dev)); | ||
223 | break; | 276 | break; |
224 | case MS_LOADED: | 277 | case MS_LOADED: |
225 | device->tape_generic_status &= ~GMT_DR_OPEN(~0); | 278 | device->tape_generic_status &= ~GMT_DR_OPEN(~0); |
226 | if (device->medium_state == MS_UNLOADED) | 279 | if (oldstate == MS_UNLOADED) |
227 | pr_info("%s: A tape cartridge has been mounted\n", | 280 | tape_med_state_work(device, MS_LOADED); |
228 | dev_name(&device->cdev->dev)); | ||
229 | break; | 281 | break; |
230 | default: | 282 | default: |
231 | // print nothing | ||
232 | break; | 283 | break; |
233 | } | 284 | } |
234 | device->medium_state = newstate; | ||
235 | wake_up(&device->state_change_wq); | 285 | wake_up(&device->state_change_wq); |
236 | } | 286 | } |
237 | 287 | ||
diff --git a/drivers/s390/char/vmlogrdr.c b/drivers/s390/char/vmlogrdr.c index 9f661426e4a1..c837d7419a6a 100644 --- a/drivers/s390/char/vmlogrdr.c +++ b/drivers/s390/char/vmlogrdr.c | |||
@@ -30,7 +30,6 @@ | |||
30 | #include <linux/kmod.h> | 30 | #include <linux/kmod.h> |
31 | #include <linux/cdev.h> | 31 | #include <linux/cdev.h> |
32 | #include <linux/device.h> | 32 | #include <linux/device.h> |
33 | #include <linux/smp_lock.h> | ||
34 | #include <linux/string.h> | 33 | #include <linux/string.h> |
35 | 34 | ||
36 | MODULE_AUTHOR | 35 | MODULE_AUTHOR |
@@ -249,27 +248,25 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, | |||
249 | char cp_command[80]; | 248 | char cp_command[80]; |
250 | char cp_response[160]; | 249 | char cp_response[160]; |
251 | char *onoff, *qid_string; | 250 | char *onoff, *qid_string; |
251 | int rc; | ||
252 | 252 | ||
253 | memset(cp_command, 0x00, sizeof(cp_command)); | 253 | onoff = ((action == 1) ? "ON" : "OFF"); |
254 | memset(cp_response, 0x00, sizeof(cp_response)); | ||
255 | |||
256 | onoff = ((action == 1) ? "ON" : "OFF"); | ||
257 | qid_string = ((recording_class_AB == 1) ? " QID * " : ""); | 254 | qid_string = ((recording_class_AB == 1) ? " QID * " : ""); |
258 | 255 | ||
259 | /* | 256 | /* |
260 | * The recording commands needs to be called with option QID | 257 | * The recording commands needs to be called with option QID |
261 | * for guests that have previlege classes A or B. | 258 | * for guests that have previlege classes A or B. |
262 | * Purging has to be done as separate step, because recording | 259 | * Purging has to be done as separate step, because recording |
263 | * can't be switched on as long as records are on the queue. | 260 | * can't be switched on as long as records are on the queue. |
264 | * Doing both at the same time doesn't work. | 261 | * Doing both at the same time doesn't work. |
265 | */ | 262 | */ |
266 | 263 | if (purge && (action == 1)) { | |
267 | if (purge) { | 264 | memset(cp_command, 0x00, sizeof(cp_command)); |
265 | memset(cp_response, 0x00, sizeof(cp_response)); | ||
268 | snprintf(cp_command, sizeof(cp_command), | 266 | snprintf(cp_command, sizeof(cp_command), |
269 | "RECORDING %s PURGE %s", | 267 | "RECORDING %s PURGE %s", |
270 | logptr->recording_name, | 268 | logptr->recording_name, |
271 | qid_string); | 269 | qid_string); |
272 | |||
273 | cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); | 270 | cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); |
274 | } | 271 | } |
275 | 272 | ||
@@ -279,19 +276,33 @@ static int vmlogrdr_recording(struct vmlogrdr_priv_t * logptr, | |||
279 | logptr->recording_name, | 276 | logptr->recording_name, |
280 | onoff, | 277 | onoff, |
281 | qid_string); | 278 | qid_string); |
282 | |||
283 | cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); | 279 | cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); |
284 | /* The recording command will usually answer with 'Command complete' | 280 | /* The recording command will usually answer with 'Command complete' |
285 | * on success, but when the specific service was never connected | 281 | * on success, but when the specific service was never connected |
286 | * before then there might be an additional informational message | 282 | * before then there might be an additional informational message |
287 | * 'HCPCRC8072I Recording entry not found' before the | 283 | * 'HCPCRC8072I Recording entry not found' before the |
288 | * 'Command complete'. So I use strstr rather then the strncmp. | 284 | * 'Command complete'. So I use strstr rather then the strncmp. |
289 | */ | 285 | */ |
290 | if (strstr(cp_response,"Command complete")) | 286 | if (strstr(cp_response,"Command complete")) |
291 | return 0; | 287 | rc = 0; |
292 | else | 288 | else |
293 | return -EIO; | 289 | rc = -EIO; |
290 | /* | ||
291 | * If we turn recording off, we have to purge any remaining records | ||
292 | * afterwards, as a large number of queued records may impact z/VM | ||
293 | * performance. | ||
294 | */ | ||
295 | if (purge && (action == 0)) { | ||
296 | memset(cp_command, 0x00, sizeof(cp_command)); | ||
297 | memset(cp_response, 0x00, sizeof(cp_response)); | ||
298 | snprintf(cp_command, sizeof(cp_command), | ||
299 | "RECORDING %s PURGE %s", | ||
300 | logptr->recording_name, | ||
301 | qid_string); | ||
302 | cpcmd(cp_command, cp_response, sizeof(cp_response), NULL); | ||
303 | } | ||
294 | 304 | ||
305 | return rc; | ||
295 | } | 306 | } |
296 | 307 | ||
297 | 308 | ||
diff --git a/drivers/s390/char/vmur.c b/drivers/s390/char/vmur.c index 1de672f21037..f7e4ae6bf15a 100644 --- a/drivers/s390/char/vmur.c +++ b/drivers/s390/char/vmur.c | |||
@@ -13,7 +13,6 @@ | |||
13 | 13 | ||
14 | #include <linux/cdev.h> | 14 | #include <linux/cdev.h> |
15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
16 | #include <linux/smp_lock.h> | ||
17 | 16 | ||
18 | #include <asm/uaccess.h> | 17 | #include <asm/uaccess.h> |
19 | #include <asm/cio.h> | 18 | #include <asm/cio.h> |
diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c index 2ff8a22d4257..e8391b89eff4 100644 --- a/drivers/s390/cio/device.c +++ b/drivers/s390/cio/device.c | |||
@@ -1455,7 +1455,16 @@ static int io_subchannel_sch_event(struct subchannel *sch, int process) | |||
1455 | break; | 1455 | break; |
1456 | case IO_SCH_UNREG_ATTACH: | 1456 | case IO_SCH_UNREG_ATTACH: |
1457 | case IO_SCH_UNREG: | 1457 | case IO_SCH_UNREG: |
1458 | if (cdev) | 1458 | if (!cdev) |
1459 | break; | ||
1460 | if (cdev->private->state == DEV_STATE_SENSE_ID) { | ||
1461 | /* | ||
1462 | * Note: delayed work triggered by this event | ||
1463 | * and repeated calls to sch_event are synchronized | ||
1464 | * by the above check for work_pending(cdev). | ||
1465 | */ | ||
1466 | dev_fsm_event(cdev, DEV_EVENT_NOTOPER); | ||
1467 | } else | ||
1459 | ccw_device_set_notoper(cdev); | 1468 | ccw_device_set_notoper(cdev); |
1460 | break; | 1469 | break; |
1461 | case IO_SCH_NOP: | 1470 | case IO_SCH_NOP: |
diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c index 752dbee06af5..5d9c66627b6e 100644 --- a/drivers/s390/cio/qdio_thinint.c +++ b/drivers/s390/cio/qdio_thinint.c | |||
@@ -292,8 +292,8 @@ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr) | |||
292 | return; | 292 | return; |
293 | 293 | ||
294 | /* reset adapter interrupt indicators */ | 294 | /* reset adapter interrupt indicators */ |
295 | put_indicator(irq_ptr->dsci); | ||
296 | set_subchannel_ind(irq_ptr, 1); | 295 | set_subchannel_ind(irq_ptr, 1); |
296 | put_indicator(irq_ptr->dsci); | ||
297 | } | 297 | } |
298 | 298 | ||
299 | void __exit tiqdio_unregister_thinints(void) | 299 | void __exit tiqdio_unregister_thinints(void) |
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index f5221749d180..7fca9c10ffcf 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c | |||
@@ -35,7 +35,6 @@ | |||
35 | #include <linux/proc_fs.h> | 35 | #include <linux/proc_fs.h> |
36 | #include <linux/seq_file.h> | 36 | #include <linux/seq_file.h> |
37 | #include <linux/compat.h> | 37 | #include <linux/compat.h> |
38 | #include <linux/smp_lock.h> | ||
39 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
40 | #include <asm/atomic.h> | 39 | #include <asm/atomic.h> |
41 | #include <asm/uaccess.h> | 40 | #include <asm/uaccess.h> |
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index 6be43eb126b4..f47a714538db 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
@@ -440,7 +440,6 @@ struct qeth_qdio_out_q { | |||
440 | * index of buffer to be filled by driver; state EMPTY or PACKING | 440 | * index of buffer to be filled by driver; state EMPTY or PACKING |
441 | */ | 441 | */ |
442 | int next_buf_to_fill; | 442 | int next_buf_to_fill; |
443 | int sync_iqdio_error; | ||
444 | /* | 443 | /* |
445 | * number of buffers that are currently filled (PRIMED) | 444 | * number of buffers that are currently filled (PRIMED) |
446 | * -> these buffers are hardware-owned | 445 | * -> these buffers are hardware-owned |
@@ -695,14 +694,6 @@ struct qeth_mc_mac { | |||
695 | int is_vmac; | 694 | int is_vmac; |
696 | }; | 695 | }; |
697 | 696 | ||
698 | struct qeth_skb_data { | ||
699 | __u32 magic; | ||
700 | int count; | ||
701 | }; | ||
702 | |||
703 | #define QETH_SKB_MAGIC 0x71657468 | ||
704 | #define QETH_SIGA_CC2_RETRIES 3 | ||
705 | |||
706 | struct qeth_rx { | 697 | struct qeth_rx { |
707 | int b_count; | 698 | int b_count; |
708 | int b_index; | 699 | int b_index; |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 764267062601..e6b2df0e73f5 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
@@ -877,8 +877,8 @@ out: | |||
877 | return; | 877 | return; |
878 | } | 878 | } |
879 | 879 | ||
880 | static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | 880 | static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, |
881 | struct qeth_qdio_out_buffer *buf, unsigned int qeth_skip_skb) | 881 | struct qeth_qdio_out_buffer *buf) |
882 | { | 882 | { |
883 | int i; | 883 | int i; |
884 | struct sk_buff *skb; | 884 | struct sk_buff *skb; |
@@ -887,13 +887,11 @@ static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | |||
887 | if (buf->buffer->element[0].flags & 0x40) | 887 | if (buf->buffer->element[0].flags & 0x40) |
888 | atomic_dec(&queue->set_pci_flags_count); | 888 | atomic_dec(&queue->set_pci_flags_count); |
889 | 889 | ||
890 | if (!qeth_skip_skb) { | 890 | skb = skb_dequeue(&buf->skb_list); |
891 | while (skb) { | ||
892 | atomic_dec(&skb->users); | ||
893 | dev_kfree_skb_any(skb); | ||
891 | skb = skb_dequeue(&buf->skb_list); | 894 | skb = skb_dequeue(&buf->skb_list); |
892 | while (skb) { | ||
893 | atomic_dec(&skb->users); | ||
894 | dev_kfree_skb_any(skb); | ||
895 | skb = skb_dequeue(&buf->skb_list); | ||
896 | } | ||
897 | } | 895 | } |
898 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { | 896 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { |
899 | if (buf->buffer->element[i].addr && buf->is_header[i]) | 897 | if (buf->buffer->element[i].addr && buf->is_header[i]) |
@@ -909,12 +907,6 @@ static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | |||
909 | atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); | 907 | atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); |
910 | } | 908 | } |
911 | 909 | ||
912 | static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | ||
913 | struct qeth_qdio_out_buffer *buf) | ||
914 | { | ||
915 | __qeth_clear_output_buffer(queue, buf, 0); | ||
916 | } | ||
917 | |||
918 | void qeth_clear_qdio_buffers(struct qeth_card *card) | 910 | void qeth_clear_qdio_buffers(struct qeth_card *card) |
919 | { | 911 | { |
920 | int i, j; | 912 | int i, j; |
@@ -2833,7 +2825,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, | |||
2833 | } | 2825 | } |
2834 | } | 2826 | } |
2835 | 2827 | ||
2836 | queue->sync_iqdio_error = 0; | ||
2837 | queue->card->dev->trans_start = jiffies; | 2828 | queue->card->dev->trans_start = jiffies; |
2838 | if (queue->card->options.performance_stats) { | 2829 | if (queue->card->options.performance_stats) { |
2839 | queue->card->perf_stats.outbound_do_qdio_cnt++; | 2830 | queue->card->perf_stats.outbound_do_qdio_cnt++; |
@@ -2849,10 +2840,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, | |||
2849 | queue->card->perf_stats.outbound_do_qdio_time += | 2840 | queue->card->perf_stats.outbound_do_qdio_time += |
2850 | qeth_get_micros() - | 2841 | qeth_get_micros() - |
2851 | queue->card->perf_stats.outbound_do_qdio_start_time; | 2842 | queue->card->perf_stats.outbound_do_qdio_start_time; |
2852 | if (rc > 0) { | ||
2853 | if (!(rc & QDIO_ERROR_SIGA_BUSY)) | ||
2854 | queue->sync_iqdio_error = rc & 3; | ||
2855 | } | ||
2856 | if (rc) { | 2843 | if (rc) { |
2857 | queue->card->stats.tx_errors += count; | 2844 | queue->card->stats.tx_errors += count; |
2858 | /* ignore temporary SIGA errors without busy condition */ | 2845 | /* ignore temporary SIGA errors without busy condition */ |
@@ -2916,7 +2903,7 @@ void qeth_qdio_start_poll(struct ccw_device *ccwdev, int queue, | |||
2916 | { | 2903 | { |
2917 | struct qeth_card *card = (struct qeth_card *)card_ptr; | 2904 | struct qeth_card *card = (struct qeth_card *)card_ptr; |
2918 | 2905 | ||
2919 | if (card->dev) | 2906 | if (card->dev && (card->dev->flags & IFF_UP)) |
2920 | napi_schedule(&card->napi); | 2907 | napi_schedule(&card->napi); |
2921 | } | 2908 | } |
2922 | EXPORT_SYMBOL_GPL(qeth_qdio_start_poll); | 2909 | EXPORT_SYMBOL_GPL(qeth_qdio_start_poll); |
@@ -2940,7 +2927,6 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, | |||
2940 | struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; | 2927 | struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; |
2941 | struct qeth_qdio_out_buffer *buffer; | 2928 | struct qeth_qdio_out_buffer *buffer; |
2942 | int i; | 2929 | int i; |
2943 | unsigned qeth_send_err; | ||
2944 | 2930 | ||
2945 | QETH_CARD_TEXT(card, 6, "qdouhdl"); | 2931 | QETH_CARD_TEXT(card, 6, "qdouhdl"); |
2946 | if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { | 2932 | if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { |
@@ -2956,9 +2942,8 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, | |||
2956 | } | 2942 | } |
2957 | for (i = first_element; i < (first_element + count); ++i) { | 2943 | for (i = first_element; i < (first_element + count); ++i) { |
2958 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; | 2944 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; |
2959 | qeth_send_err = qeth_handle_send_error(card, buffer, qdio_error); | 2945 | qeth_handle_send_error(card, buffer, qdio_error); |
2960 | __qeth_clear_output_buffer(queue, buffer, | 2946 | qeth_clear_output_buffer(queue, buffer); |
2961 | (qeth_send_err == QETH_SEND_ERROR_RETRY) ? 1 : 0); | ||
2962 | } | 2947 | } |
2963 | atomic_sub(count, &queue->used_buffers); | 2948 | atomic_sub(count, &queue->used_buffers); |
2964 | /* check if we need to do something on this outbound queue */ | 2949 | /* check if we need to do something on this outbound queue */ |
@@ -3183,10 +3168,7 @@ int qeth_do_send_packet_fast(struct qeth_card *card, | |||
3183 | int offset, int hd_len) | 3168 | int offset, int hd_len) |
3184 | { | 3169 | { |
3185 | struct qeth_qdio_out_buffer *buffer; | 3170 | struct qeth_qdio_out_buffer *buffer; |
3186 | struct sk_buff *skb1; | ||
3187 | struct qeth_skb_data *retry_ctrl; | ||
3188 | int index; | 3171 | int index; |
3189 | int rc; | ||
3190 | 3172 | ||
3191 | /* spin until we get the queue ... */ | 3173 | /* spin until we get the queue ... */ |
3192 | while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, | 3174 | while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, |
@@ -3205,25 +3187,6 @@ int qeth_do_send_packet_fast(struct qeth_card *card, | |||
3205 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); | 3187 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); |
3206 | qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len); | 3188 | qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len); |
3207 | qeth_flush_buffers(queue, index, 1); | 3189 | qeth_flush_buffers(queue, index, 1); |
3208 | if (queue->sync_iqdio_error == 2) { | ||
3209 | skb1 = skb_dequeue(&buffer->skb_list); | ||
3210 | while (skb1) { | ||
3211 | atomic_dec(&skb1->users); | ||
3212 | skb1 = skb_dequeue(&buffer->skb_list); | ||
3213 | } | ||
3214 | retry_ctrl = (struct qeth_skb_data *) &skb->cb[16]; | ||
3215 | if (retry_ctrl->magic != QETH_SKB_MAGIC) { | ||
3216 | retry_ctrl->magic = QETH_SKB_MAGIC; | ||
3217 | retry_ctrl->count = 0; | ||
3218 | } | ||
3219 | if (retry_ctrl->count < QETH_SIGA_CC2_RETRIES) { | ||
3220 | retry_ctrl->count++; | ||
3221 | rc = dev_queue_xmit(skb); | ||
3222 | } else { | ||
3223 | dev_kfree_skb_any(skb); | ||
3224 | QETH_CARD_TEXT(card, 2, "qrdrop"); | ||
3225 | } | ||
3226 | } | ||
3227 | return 0; | 3190 | return 0; |
3228 | out: | 3191 | out: |
3229 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); | 3192 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 50286d8707f3..6bd2dbc4c316 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -76,7 +76,7 @@ static void zfcp_scsi_command_fail(struct scsi_cmnd *scpnt, int result) | |||
76 | scpnt->scsi_done(scpnt); | 76 | scpnt->scsi_done(scpnt); |
77 | } | 77 | } |
78 | 78 | ||
79 | static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt, | 79 | static int zfcp_scsi_queuecommand_lck(struct scsi_cmnd *scpnt, |
80 | void (*done) (struct scsi_cmnd *)) | 80 | void (*done) (struct scsi_cmnd *)) |
81 | { | 81 | { |
82 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device); | 82 | struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(scpnt->device); |
@@ -127,6 +127,8 @@ static int zfcp_scsi_queuecommand(struct scsi_cmnd *scpnt, | |||
127 | return ret; | 127 | return ret; |
128 | } | 128 | } |
129 | 129 | ||
130 | static DEF_SCSI_QCMD(zfcp_scsi_queuecommand) | ||
131 | |||
130 | static int zfcp_scsi_slave_alloc(struct scsi_device *sdev) | 132 | static int zfcp_scsi_slave_alloc(struct scsi_device *sdev) |
131 | { | 133 | { |
132 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); | 134 | struct fc_rport *rport = starget_to_rport(scsi_target(sdev)); |