1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <linux/blkdev.h>
32#include <linux/bug.h>
33#include <linux/completion.h>
34#include <linux/delay.h>
35#include <linux/device.h>
36#include <linux/dma-mapping.h>
37#include <linux/firewire.h>
38#include <linux/firewire-constants.h>
39#include <linux/init.h>
40#include <linux/jiffies.h>
41#include <linux/kernel.h>
42#include <linux/kref.h>
43#include <linux/list.h>
44#include <linux/mod_devicetable.h>
45#include <linux/module.h>
46#include <linux/moduleparam.h>
47#include <linux/scatterlist.h>
48#include <linux/slab.h>
49#include <linux/spinlock.h>
50#include <linux/string.h>
51#include <linux/stringify.h>
52#include <linux/workqueue.h>
53
54#include <asm/byteorder.h>
55
56#include <scsi/scsi.h>
57#include <scsi/scsi_cmnd.h>
58#include <scsi/scsi_device.h>
59#include <scsi/scsi_host.h>
60
61
62
63
64
65
66
67
68static bool sbp2_param_exclusive_login = 1;
69module_param_named(exclusive_login, sbp2_param_exclusive_login, bool, 0644);
70MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
71 "(default = Y, use N for concurrent initiators)");
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105#define SBP2_WORKAROUND_128K_MAX_TRANS 0x1
106#define SBP2_WORKAROUND_INQUIRY_36 0x2
107#define SBP2_WORKAROUND_MODE_SENSE_8 0x4
108#define SBP2_WORKAROUND_FIX_CAPACITY 0x8
109#define SBP2_WORKAROUND_DELAY_INQUIRY 0x10
110#define SBP2_INQUIRY_DELAY 12
111#define SBP2_WORKAROUND_POWER_CONDITION 0x20
112#define SBP2_WORKAROUND_OVERRIDE 0x100
113
114static int sbp2_param_workarounds;
115module_param_named(workarounds, sbp2_param_workarounds, int, 0644);
116MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
117 ", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS)
118 ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36)
119 ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
120 ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
121 ", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY)
122 ", set power condition in start stop unit = "
123 __stringify(SBP2_WORKAROUND_POWER_CONDITION)
124 ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
125 ", or a combination)");
126
127
128
129
130
131struct sbp2_logical_unit {
132 struct sbp2_target *tgt;
133 struct list_head link;
134 struct fw_address_handler address_handler;
135 struct list_head orb_list;
136
137 u64 command_block_agent_address;
138 u16 lun;
139 int login_id;
140
141
142
143
144
145
146
147 int generation;
148 int retries;
149 work_func_t workfn;
150 struct delayed_work work;
151 bool has_sdev;
152 bool blocked;
153};
154
155static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay)
156{
157 queue_delayed_work(fw_workqueue, &lu->work, delay);
158}
159
160
161
162
163
164struct sbp2_target {
165 struct fw_unit *unit;
166 struct list_head lu_list;
167
168 u64 management_agent_address;
169 u64 guid;
170 int directory_id;
171 int node_id;
172 int address_high;
173 unsigned int workarounds;
174 unsigned int mgt_orb_timeout;
175 unsigned int max_payload;
176
177 spinlock_t lock;
178 int dont_block;
179 int blocked;
180};
181
182static struct fw_device *target_parent_device(struct sbp2_target *tgt)
183{
184 return fw_parent_device(tgt->unit);
185}
186
187static const struct device *tgt_dev(const struct sbp2_target *tgt)
188{
189 return &tgt->unit->device;
190}
191
192static const struct device *lu_dev(const struct sbp2_logical_unit *lu)
193{
194 return &lu->tgt->unit->device;
195}
196
197
198#define INVALID_LOGIN_ID 0x10000
199
200#define SBP2_ORB_TIMEOUT 2000U
201#define SBP2_ORB_NULL 0x80000000
202#define SBP2_RETRY_LIMIT 0xf
203#define SBP2_CYCLE_LIMIT (0xc8 << 12)
204
205
206
207
208
209#define SBP2_MAX_CDB_SIZE 16
210
211
212
213
214
215#define SBP2_MAX_SEG_SIZE 0xfffc
216
217
218#define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a
219#define SBP2_CSR_FIRMWARE_REVISION 0x3c
220#define SBP2_CSR_LOGICAL_UNIT_NUMBER 0x14
221#define SBP2_CSR_UNIT_UNIQUE_ID 0x8d
222#define SBP2_CSR_LOGICAL_UNIT_DIRECTORY 0xd4
223
224
225#define SBP2_LOGIN_REQUEST 0x0
226#define SBP2_QUERY_LOGINS_REQUEST 0x1
227#define SBP2_RECONNECT_REQUEST 0x3
228#define SBP2_SET_PASSWORD_REQUEST 0x4
229#define SBP2_LOGOUT_REQUEST 0x7
230#define SBP2_ABORT_TASK_REQUEST 0xb
231#define SBP2_ABORT_TASK_SET 0xc
232#define SBP2_LOGICAL_UNIT_RESET 0xe
233#define SBP2_TARGET_RESET_REQUEST 0xf
234
235
236#define SBP2_AGENT_STATE 0x00
237#define SBP2_AGENT_RESET 0x04
238#define SBP2_ORB_POINTER 0x08
239#define SBP2_DOORBELL 0x10
240#define SBP2_UNSOLICITED_STATUS_ENABLE 0x14
241
242
243#define SBP2_STATUS_REQUEST_COMPLETE 0x0
244#define SBP2_STATUS_TRANSPORT_FAILURE 0x1
245#define SBP2_STATUS_ILLEGAL_REQUEST 0x2
246#define SBP2_STATUS_VENDOR_DEPENDENT 0x3
247
248#define STATUS_GET_ORB_HIGH(v) ((v).status & 0xffff)
249#define STATUS_GET_SBP_STATUS(v) (((v).status >> 16) & 0xff)
250#define STATUS_GET_LEN(v) (((v).status >> 24) & 0x07)
251#define STATUS_GET_DEAD(v) (((v).status >> 27) & 0x01)
252#define STATUS_GET_RESPONSE(v) (((v).status >> 28) & 0x03)
253#define STATUS_GET_SOURCE(v) (((v).status >> 30) & 0x03)
254#define STATUS_GET_ORB_LOW(v) ((v).orb_low)
255#define STATUS_GET_DATA(v) ((v).data)
256
257struct sbp2_status {
258 u32 status;
259 u32 orb_low;
260 u8 data[24];
261};
262
263struct sbp2_pointer {
264 __be32 high;
265 __be32 low;
266};
267
268struct sbp2_orb {
269 struct fw_transaction t;
270 struct kref kref;
271 dma_addr_t request_bus;
272 int rcode;
273 void (*callback)(struct sbp2_orb * orb, struct sbp2_status * status);
274 struct sbp2_logical_unit *lu;
275 struct list_head link;
276};
277
278#define MANAGEMENT_ORB_LUN(v) ((v))
279#define MANAGEMENT_ORB_FUNCTION(v) ((v) << 16)
280#define MANAGEMENT_ORB_RECONNECT(v) ((v) << 20)
281#define MANAGEMENT_ORB_EXCLUSIVE(v) ((v) ? 1 << 28 : 0)
282#define MANAGEMENT_ORB_REQUEST_FORMAT(v) ((v) << 29)
283#define MANAGEMENT_ORB_NOTIFY ((1) << 31)
284
285#define MANAGEMENT_ORB_RESPONSE_LENGTH(v) ((v))
286#define MANAGEMENT_ORB_PASSWORD_LENGTH(v) ((v) << 16)
287
288struct sbp2_management_orb {
289 struct sbp2_orb base;
290 struct {
291 struct sbp2_pointer password;
292 struct sbp2_pointer response;
293 __be32 misc;
294 __be32 length;
295 struct sbp2_pointer status_fifo;
296 } request;
297 __be32 response[4];
298 dma_addr_t response_bus;
299 struct completion done;
300 struct sbp2_status status;
301};
302
303struct sbp2_login_response {
304 __be32 misc;
305 struct sbp2_pointer command_block_agent;
306 __be32 reconnect_hold;
307};
308#define COMMAND_ORB_DATA_SIZE(v) ((v))
309#define COMMAND_ORB_PAGE_SIZE(v) ((v) << 16)
310#define COMMAND_ORB_PAGE_TABLE_PRESENT ((1) << 19)
311#define COMMAND_ORB_MAX_PAYLOAD(v) ((v) << 20)
312#define COMMAND_ORB_SPEED(v) ((v) << 24)
313#define COMMAND_ORB_DIRECTION ((1) << 27)
314#define COMMAND_ORB_REQUEST_FORMAT(v) ((v) << 29)
315#define COMMAND_ORB_NOTIFY ((1) << 31)
316
317struct sbp2_command_orb {
318 struct sbp2_orb base;
319 struct {
320 struct sbp2_pointer next;
321 struct sbp2_pointer data_descriptor;
322 __be32 misc;
323 u8 command_block[SBP2_MAX_CDB_SIZE];
324 } request;
325 struct scsi_cmnd *cmd;
326
327 struct sbp2_pointer page_table[SG_ALL] __attribute__((aligned(8)));
328 dma_addr_t page_table_bus;
329};
330
331#define SBP2_ROM_VALUE_WILDCARD ~0
332#define SBP2_ROM_VALUE_MISSING 0xff000000
333
334
335
336
337
338
339
340
341
342static const struct {
343 u32 firmware_revision;
344 u32 model;
345 unsigned int workarounds;
346} sbp2_workarounds_table[] = {
347 {
348 .firmware_revision = 0x002800,
349 .model = 0x001010,
350 .workarounds = SBP2_WORKAROUND_INQUIRY_36 |
351 SBP2_WORKAROUND_MODE_SENSE_8 |
352 SBP2_WORKAROUND_POWER_CONDITION,
353 },
354 {
355 .firmware_revision = 0x002800,
356 .model = 0x000000,
357 .workarounds = SBP2_WORKAROUND_POWER_CONDITION,
358 },
359 {
360 .firmware_revision = 0x000200,
361 .model = SBP2_ROM_VALUE_WILDCARD,
362 .workarounds = SBP2_WORKAROUND_INQUIRY_36,
363 },
364 {
365 .firmware_revision = 0x012800,
366 .model = SBP2_ROM_VALUE_WILDCARD,
367 .workarounds = SBP2_WORKAROUND_POWER_CONDITION,
368 },
369 {
370 .firmware_revision = 0xa0b800,
371 .model = SBP2_ROM_VALUE_WILDCARD,
372 .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
373 },
374 {
375 .firmware_revision = 0x002600,
376 .model = SBP2_ROM_VALUE_WILDCARD,
377 .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS,
378 },
379
380
381
382
383 {
384 .firmware_revision = 0x0a2700,
385 .model = 0x000000,
386 .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS |
387 SBP2_WORKAROUND_FIX_CAPACITY,
388 },
389 {
390 .firmware_revision = 0x0a2700,
391 .model = 0x000021,
392 .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
393 },
394 {
395 .firmware_revision = 0x0a2700,
396 .model = 0x000022,
397 .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
398 },
399 {
400 .firmware_revision = 0x0a2700,
401 .model = 0x000023,
402 .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
403 },
404 {
405 .firmware_revision = 0x0a2700,
406 .model = 0x00007e,
407 .workarounds = SBP2_WORKAROUND_FIX_CAPACITY,
408 }
409};
410
411static void free_orb(struct kref *kref)
412{
413 struct sbp2_orb *orb = container_of(kref, struct sbp2_orb, kref);
414
415 kfree(orb);
416}
417
418static void sbp2_status_write(struct fw_card *card, struct fw_request *request,
419 int tcode, int destination, int source,
420 int generation, unsigned long long offset,
421 void *payload, size_t length, void *callback_data)
422{
423 struct sbp2_logical_unit *lu = callback_data;
424 struct sbp2_orb *orb;
425 struct sbp2_status status;
426 unsigned long flags;
427
428 if (tcode != TCODE_WRITE_BLOCK_REQUEST ||
429 length < 8 || length > sizeof(status)) {
430 fw_send_response(card, request, RCODE_TYPE_ERROR);
431 return;
432 }
433
434 status.status = be32_to_cpup(payload);
435 status.orb_low = be32_to_cpup(payload + 4);
436 memset(status.data, 0, sizeof(status.data));
437 if (length > 8)
438 memcpy(status.data, payload + 8, length - 8);
439
440 if (STATUS_GET_SOURCE(status) == 2 || STATUS_GET_SOURCE(status) == 3) {
441 dev_notice(lu_dev(lu),
442 "non-ORB related status write, not handled\n");
443 fw_send_response(card, request, RCODE_COMPLETE);
444 return;
445 }
446
447
448 spin_lock_irqsave(&lu->tgt->lock, flags);
449 list_for_each_entry(orb, &lu->orb_list, link) {
450 if (STATUS_GET_ORB_HIGH(status) == 0 &&
451 STATUS_GET_ORB_LOW(status) == orb->request_bus) {
452 orb->rcode = RCODE_COMPLETE;
453 list_del(&orb->link);
454 break;
455 }
456 }
457 spin_unlock_irqrestore(&lu->tgt->lock, flags);
458
459 if (&orb->link != &lu->orb_list) {
460 orb->callback(orb, &status);
461 kref_put(&orb->kref, free_orb);
462 } else {
463 dev_err(lu_dev(lu), "status write for unknown ORB\n");
464 }
465
466 fw_send_response(card, request, RCODE_COMPLETE);
467}
468
469static void complete_transaction(struct fw_card *card, int rcode,
470 void *payload, size_t length, void *data)
471{
472 struct sbp2_orb *orb = data;
473 unsigned long flags;
474
475
476
477
478
479
480
481
482
483
484 spin_lock_irqsave(&orb->lu->tgt->lock, flags);
485
486 if (orb->rcode == -1)
487 orb->rcode = rcode;
488 if (orb->rcode != RCODE_COMPLETE) {
489 list_del(&orb->link);
490 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags);
491
492 orb->callback(orb, NULL);
493 kref_put(&orb->kref, free_orb);
494 } else {
495 spin_unlock_irqrestore(&orb->lu->tgt->lock, flags);
496 }
497
498 kref_put(&orb->kref, free_orb);
499}
500
501static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu,
502 int node_id, int generation, u64 offset)
503{
504 struct fw_device *device = target_parent_device(lu->tgt);
505 struct sbp2_pointer orb_pointer;
506 unsigned long flags;
507
508 orb_pointer.high = 0;
509 orb_pointer.low = cpu_to_be32(orb->request_bus);
510
511 orb->lu = lu;
512 spin_lock_irqsave(&lu->tgt->lock, flags);
513 list_add_tail(&orb->link, &lu->orb_list);
514 spin_unlock_irqrestore(&lu->tgt->lock, flags);
515
516 kref_get(&orb->kref);
517 kref_get(&orb->kref);
518
519 fw_send_request(device->card, &orb->t, TCODE_WRITE_BLOCK_REQUEST,
520 node_id, generation, device->max_speed, offset,
521 &orb_pointer, 8, complete_transaction, orb);
522}
523
524static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu)
525{
526 struct fw_device *device = target_parent_device(lu->tgt);
527 struct sbp2_orb *orb, *next;
528 struct list_head list;
529 int retval = -ENOENT;
530
531 INIT_LIST_HEAD(&list);
532 spin_lock_irq(&lu->tgt->lock);
533 list_splice_init(&lu->orb_list, &list);
534 spin_unlock_irq(&lu->tgt->lock);
535
536 list_for_each_entry_safe(orb, next, &list, link) {
537 retval = 0;
538 if (fw_cancel_transaction(device->card, &orb->t) == 0)
539 continue;
540
541 orb->rcode = RCODE_CANCELLED;
542 orb->callback(orb, NULL);
543 kref_put(&orb->kref, free_orb);
544 }
545
546 return retval;
547}
548
549static void complete_management_orb(struct sbp2_orb *base_orb,
550 struct sbp2_status *status)
551{
552 struct sbp2_management_orb *orb =
553 container_of(base_orb, struct sbp2_management_orb, base);
554
555 if (status)
556 memcpy(&orb->status, status, sizeof(*status));
557 complete(&orb->done);
558}
559
560static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id,
561 int generation, int function,
562 int lun_or_login_id, void *response)
563{
564 struct fw_device *device = target_parent_device(lu->tgt);
565 struct sbp2_management_orb *orb;
566 unsigned int timeout;
567 int retval = -ENOMEM;
568
569 if (function == SBP2_LOGOUT_REQUEST && fw_device_is_shutdown(device))
570 return 0;
571
572 orb = kzalloc(sizeof(*orb), GFP_NOIO);
573 if (orb == NULL)
574 return -ENOMEM;
575
576 kref_init(&orb->base.kref);
577 orb->response_bus =
578 dma_map_single(device->card->device, &orb->response,
579 sizeof(orb->response), DMA_FROM_DEVICE);
580 if (dma_mapping_error(device->card->device, orb->response_bus))
581 goto fail_mapping_response;
582
583 orb->request.response.high = 0;
584 orb->request.response.low = cpu_to_be32(orb->response_bus);
585
586 orb->request.misc = cpu_to_be32(
587 MANAGEMENT_ORB_NOTIFY |
588 MANAGEMENT_ORB_FUNCTION(function) |
589 MANAGEMENT_ORB_LUN(lun_or_login_id));
590 orb->request.length = cpu_to_be32(
591 MANAGEMENT_ORB_RESPONSE_LENGTH(sizeof(orb->response)));
592
593 orb->request.status_fifo.high =
594 cpu_to_be32(lu->address_handler.offset >> 32);
595 orb->request.status_fifo.low =
596 cpu_to_be32(lu->address_handler.offset);
597
598 if (function == SBP2_LOGIN_REQUEST) {
599
600 orb->request.misc |= cpu_to_be32(
601 MANAGEMENT_ORB_RECONNECT(2) |
602 MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login));
603 timeout = lu->tgt->mgt_orb_timeout;
604 } else {
605 timeout = SBP2_ORB_TIMEOUT;
606 }
607
608 init_completion(&orb->done);
609 orb->base.callback = complete_management_orb;
610
611 orb->base.request_bus =
612 dma_map_single(device->card->device, &orb->request,
613 sizeof(orb->request), DMA_TO_DEVICE);
614 if (dma_mapping_error(device->card->device, orb->base.request_bus))
615 goto fail_mapping_request;
616
617 sbp2_send_orb(&orb->base, lu, node_id, generation,
618 lu->tgt->management_agent_address);
619
620 wait_for_completion_timeout(&orb->done, msecs_to_jiffies(timeout));
621
622 retval = -EIO;
623 if (sbp2_cancel_orbs(lu) == 0) {
624 dev_err(lu_dev(lu), "ORB reply timed out, rcode 0x%02x\n",
625 orb->base.rcode);
626 goto out;
627 }
628
629 if (orb->base.rcode != RCODE_COMPLETE) {
630 dev_err(lu_dev(lu), "management write failed, rcode 0x%02x\n",
631 orb->base.rcode);
632 goto out;
633 }
634
635 if (STATUS_GET_RESPONSE(orb->status) != 0 ||
636 STATUS_GET_SBP_STATUS(orb->status) != 0) {
637 dev_err(lu_dev(lu), "error status: %d:%d\n",
638 STATUS_GET_RESPONSE(orb->status),
639 STATUS_GET_SBP_STATUS(orb->status));
640 goto out;
641 }
642
643 retval = 0;
644 out:
645 dma_unmap_single(device->card->device, orb->base.request_bus,
646 sizeof(orb->request), DMA_TO_DEVICE);
647 fail_mapping_request:
648 dma_unmap_single(device->card->device, orb->response_bus,
649 sizeof(orb->response), DMA_FROM_DEVICE);
650 fail_mapping_response:
651 if (response)
652 memcpy(response, orb->response, sizeof(orb->response));
653 kref_put(&orb->base.kref, free_orb);
654
655 return retval;
656}
657
658static void sbp2_agent_reset(struct sbp2_logical_unit *lu)
659{
660 struct fw_device *device = target_parent_device(lu->tgt);
661 __be32 d = 0;
662
663 fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST,
664 lu->tgt->node_id, lu->generation, device->max_speed,
665 lu->command_block_agent_address + SBP2_AGENT_RESET,
666 &d, 4);
667}
668
669static void complete_agent_reset_write_no_wait(struct fw_card *card,
670 int rcode, void *payload, size_t length, void *data)
671{
672 kfree(data);
673}
674
675static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu)
676{
677 struct fw_device *device = target_parent_device(lu->tgt);
678 struct fw_transaction *t;
679 static __be32 d;
680
681 t = kmalloc(sizeof(*t), GFP_ATOMIC);
682 if (t == NULL)
683 return;
684
685 fw_send_request(device->card, t, TCODE_WRITE_QUADLET_REQUEST,
686 lu->tgt->node_id, lu->generation, device->max_speed,
687 lu->command_block_agent_address + SBP2_AGENT_RESET,
688 &d, 4, complete_agent_reset_write_no_wait, t);
689}
690
691static inline void sbp2_allow_block(struct sbp2_target *tgt)
692{
693 spin_lock_irq(&tgt->lock);
694 --tgt->dont_block;
695 spin_unlock_irq(&tgt->lock);
696}
697
698
699
700
701
702
703
704
705
706
707
708static void sbp2_conditionally_block(struct sbp2_logical_unit *lu)
709{
710 struct sbp2_target *tgt = lu->tgt;
711 struct fw_card *card = target_parent_device(tgt)->card;
712 struct Scsi_Host *shost =
713 container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
714 unsigned long flags;
715
716 spin_lock_irqsave(&tgt->lock, flags);
717 if (!tgt->dont_block && !lu->blocked &&
718 lu->generation != card->generation) {
719 lu->blocked = true;
720 if (++tgt->blocked == 1)
721 scsi_block_requests(shost);
722 }
723 spin_unlock_irqrestore(&tgt->lock, flags);
724}
725
726
727
728
729
730
731
732static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu)
733{
734 struct sbp2_target *tgt = lu->tgt;
735 struct fw_card *card = target_parent_device(tgt)->card;
736 struct Scsi_Host *shost =
737 container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
738 bool unblock = false;
739
740 spin_lock_irq(&tgt->lock);
741 if (lu->blocked && lu->generation == card->generation) {
742 lu->blocked = false;
743 unblock = --tgt->blocked == 0;
744 }
745 spin_unlock_irq(&tgt->lock);
746
747 if (unblock)
748 scsi_unblock_requests(shost);
749}
750
751
752
753
754
755
756
757static void sbp2_unblock(struct sbp2_target *tgt)
758{
759 struct Scsi_Host *shost =
760 container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
761
762 spin_lock_irq(&tgt->lock);
763 ++tgt->dont_block;
764 spin_unlock_irq(&tgt->lock);
765
766 scsi_unblock_requests(shost);
767}
768
769static int sbp2_lun2int(u16 lun)
770{
771 struct scsi_lun eight_bytes_lun;
772
773 memset(&eight_bytes_lun, 0, sizeof(eight_bytes_lun));
774 eight_bytes_lun.scsi_lun[0] = (lun >> 8) & 0xff;
775 eight_bytes_lun.scsi_lun[1] = lun & 0xff;
776
777 return scsilun_to_int(&eight_bytes_lun);
778}
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu)
797{
798 struct fw_device *device = target_parent_device(lu->tgt);
799 __be32 d = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT);
800
801 fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST,
802 lu->tgt->node_id, lu->generation, device->max_speed,
803 CSR_REGISTER_BASE + CSR_BUSY_TIMEOUT, &d, 4);
804}
805
806static void sbp2_reconnect(struct work_struct *work);
807
808static void sbp2_login(struct work_struct *work)
809{
810 struct sbp2_logical_unit *lu =
811 container_of(work, struct sbp2_logical_unit, work.work);
812 struct sbp2_target *tgt = lu->tgt;
813 struct fw_device *device = target_parent_device(tgt);
814 struct Scsi_Host *shost;
815 struct scsi_device *sdev;
816 struct sbp2_login_response response;
817 int generation, node_id, local_node_id;
818
819 if (fw_device_is_shutdown(device))
820 return;
821
822 generation = device->generation;
823 smp_rmb();
824 node_id = device->node_id;
825 local_node_id = device->card->node_id;
826
827
828 if (lu->has_sdev)
829 sbp2_send_management_orb(lu, device->node_id, generation,
830 SBP2_LOGOUT_REQUEST, lu->login_id, NULL);
831
832 if (sbp2_send_management_orb(lu, node_id, generation,
833 SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) {
834 if (lu->retries++ < 5) {
835 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
836 } else {
837 dev_err(tgt_dev(tgt), "failed to login to LUN %04x\n",
838 lu->lun);
839
840 sbp2_unblock(lu->tgt);
841 }
842 return;
843 }
844
845 tgt->node_id = node_id;
846 tgt->address_high = local_node_id << 16;
847 smp_wmb();
848 lu->generation = generation;
849
850 lu->command_block_agent_address =
851 ((u64)(be32_to_cpu(response.command_block_agent.high) & 0xffff)
852 << 32) | be32_to_cpu(response.command_block_agent.low);
853 lu->login_id = be32_to_cpu(response.misc) & 0xffff;
854
855 dev_notice(tgt_dev(tgt), "logged in to LUN %04x (%d retries)\n",
856 lu->lun, lu->retries);
857
858
859 sbp2_set_busy_timeout(lu);
860
861 lu->workfn = sbp2_reconnect;
862 sbp2_agent_reset(lu);
863
864
865 if (lu->has_sdev) {
866 sbp2_cancel_orbs(lu);
867 sbp2_conditionally_unblock(lu);
868
869 return;
870 }
871
872 if (lu->tgt->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY)
873 ssleep(SBP2_INQUIRY_DELAY);
874
875 shost = container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
876 sdev = __scsi_add_device(shost, 0, 0, sbp2_lun2int(lu->lun), lu);
877
878
879
880
881
882
883
884
885
886 if (IS_ERR(sdev))
887 goto out_logout_login;
888
889
890 smp_rmb();
891 if (generation != device->card->generation) {
892 scsi_remove_device(sdev);
893 scsi_device_put(sdev);
894 goto out_logout_login;
895 }
896
897
898 lu->has_sdev = true;
899 scsi_device_put(sdev);
900 sbp2_allow_block(tgt);
901
902 return;
903
904 out_logout_login:
905 smp_rmb();
906 generation = device->generation;
907 smp_rmb();
908
909 sbp2_send_management_orb(lu, device->node_id, generation,
910 SBP2_LOGOUT_REQUEST, lu->login_id, NULL);
911
912
913
914
915 lu->workfn = sbp2_login;
916}
917
918static void sbp2_reconnect(struct work_struct *work)
919{
920 struct sbp2_logical_unit *lu =
921 container_of(work, struct sbp2_logical_unit, work.work);
922 struct sbp2_target *tgt = lu->tgt;
923 struct fw_device *device = target_parent_device(tgt);
924 int generation, node_id, local_node_id;
925
926 if (fw_device_is_shutdown(device))
927 return;
928
929 generation = device->generation;
930 smp_rmb();
931 node_id = device->node_id;
932 local_node_id = device->card->node_id;
933
934 if (sbp2_send_management_orb(lu, node_id, generation,
935 SBP2_RECONNECT_REQUEST,
936 lu->login_id, NULL) < 0) {
937
938
939
940
941
942
943
944 smp_rmb();
945 if (generation == device->card->generation ||
946 lu->retries++ >= 5) {
947 dev_err(tgt_dev(tgt), "failed to reconnect\n");
948 lu->retries = 0;
949 lu->workfn = sbp2_login;
950 }
951 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
952
953 return;
954 }
955
956 tgt->node_id = node_id;
957 tgt->address_high = local_node_id << 16;
958 smp_wmb();
959 lu->generation = generation;
960
961 dev_notice(tgt_dev(tgt), "reconnected to LUN %04x (%d retries)\n",
962 lu->lun, lu->retries);
963
964 sbp2_agent_reset(lu);
965 sbp2_cancel_orbs(lu);
966 sbp2_conditionally_unblock(lu);
967}
968
969static void sbp2_lu_workfn(struct work_struct *work)
970{
971 struct sbp2_logical_unit *lu = container_of(to_delayed_work(work),
972 struct sbp2_logical_unit, work);
973 lu->workfn(work);
974}
975
976static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry)
977{
978 struct sbp2_logical_unit *lu;
979
980 lu = kmalloc(sizeof(*lu), GFP_KERNEL);
981 if (!lu)
982 return -ENOMEM;
983
984 lu->address_handler.length = 0x100;
985 lu->address_handler.address_callback = sbp2_status_write;
986 lu->address_handler.callback_data = lu;
987
988 if (fw_core_add_address_handler(&lu->address_handler,
989 &fw_high_memory_region) < 0) {
990 kfree(lu);
991 return -ENOMEM;
992 }
993
994 lu->tgt = tgt;
995 lu->lun = lun_entry & 0xffff;
996 lu->login_id = INVALID_LOGIN_ID;
997 lu->retries = 0;
998 lu->has_sdev = false;
999 lu->blocked = false;
1000 ++tgt->dont_block;
1001 INIT_LIST_HEAD(&lu->orb_list);
1002 lu->workfn = sbp2_login;
1003 INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn);
1004
1005 list_add_tail(&lu->link, &tgt->lu_list);
1006 return 0;
1007}
1008
1009static void sbp2_get_unit_unique_id(struct sbp2_target *tgt,
1010 const u32 *leaf)
1011{
1012 if ((leaf[0] & 0xffff0000) == 0x00020000)
1013 tgt->guid = (u64)leaf[1] << 32 | leaf[2];
1014}
1015
1016static int sbp2_scan_logical_unit_dir(struct sbp2_target *tgt,
1017 const u32 *directory)
1018{
1019 struct fw_csr_iterator ci;
1020 int key, value;
1021
1022 fw_csr_iterator_init(&ci, directory);
1023 while (fw_csr_iterator_next(&ci, &key, &value))
1024 if (key == SBP2_CSR_LOGICAL_UNIT_NUMBER &&
1025 sbp2_add_logical_unit(tgt, value) < 0)
1026 return -ENOMEM;
1027 return 0;
1028}
1029
1030static int sbp2_scan_unit_dir(struct sbp2_target *tgt, const u32 *directory,
1031 u32 *model, u32 *firmware_revision)
1032{
1033 struct fw_csr_iterator ci;
1034 int key, value;
1035
1036 fw_csr_iterator_init(&ci, directory);
1037 while (fw_csr_iterator_next(&ci, &key, &value)) {
1038 switch (key) {
1039
1040 case CSR_DEPENDENT_INFO | CSR_OFFSET:
1041 tgt->management_agent_address =
1042 CSR_REGISTER_BASE + 4 * value;
1043 break;
1044
1045 case CSR_DIRECTORY_ID:
1046 tgt->directory_id = value;
1047 break;
1048
1049 case CSR_MODEL:
1050 *model = value;
1051 break;
1052
1053 case SBP2_CSR_FIRMWARE_REVISION:
1054 *firmware_revision = value;
1055 break;
1056
1057 case SBP2_CSR_UNIT_CHARACTERISTICS:
1058
1059 tgt->mgt_orb_timeout = (value >> 8 & 0xff) * 500;
1060 break;
1061
1062 case SBP2_CSR_LOGICAL_UNIT_NUMBER:
1063 if (sbp2_add_logical_unit(tgt, value) < 0)
1064 return -ENOMEM;
1065 break;
1066
1067 case SBP2_CSR_UNIT_UNIQUE_ID:
1068 sbp2_get_unit_unique_id(tgt, ci.p - 1 + value);
1069 break;
1070
1071 case SBP2_CSR_LOGICAL_UNIT_DIRECTORY:
1072
1073 if (sbp2_scan_logical_unit_dir(tgt, ci.p - 1 + value) < 0)
1074 return -ENOMEM;
1075 break;
1076 }
1077 }
1078 return 0;
1079}
1080
1081
1082
1083
1084
1085
1086static void sbp2_clamp_management_orb_timeout(struct sbp2_target *tgt)
1087{
1088 unsigned int timeout = tgt->mgt_orb_timeout;
1089
1090 if (timeout > 40000)
1091 dev_notice(tgt_dev(tgt), "%ds mgt_ORB_timeout limited to 40s\n",
1092 timeout / 1000);
1093
1094 tgt->mgt_orb_timeout = clamp_val(timeout, 5000, 40000);
1095}
1096
1097static void sbp2_init_workarounds(struct sbp2_target *tgt, u32 model,
1098 u32 firmware_revision)
1099{
1100 int i;
1101 unsigned int w = sbp2_param_workarounds;
1102
1103 if (w)
1104 dev_notice(tgt_dev(tgt),
1105 "Please notify linux1394-devel@lists.sf.net "
1106 "if you need the workarounds parameter\n");
1107
1108 if (w & SBP2_WORKAROUND_OVERRIDE)
1109 goto out;
1110
1111 for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) {
1112
1113 if (sbp2_workarounds_table[i].firmware_revision !=
1114 (firmware_revision & 0xffffff00))
1115 continue;
1116
1117 if (sbp2_workarounds_table[i].model != model &&
1118 sbp2_workarounds_table[i].model != SBP2_ROM_VALUE_WILDCARD)
1119 continue;
1120
1121 w |= sbp2_workarounds_table[i].workarounds;
1122 break;
1123 }
1124 out:
1125 if (w)
1126 dev_notice(tgt_dev(tgt), "workarounds 0x%x "
1127 "(firmware_revision 0x%06x, model_id 0x%06x)\n",
1128 w, firmware_revision, model);
1129 tgt->workarounds = w;
1130}
1131
1132static struct scsi_host_template scsi_driver_template;
1133static void sbp2_remove(struct fw_unit *unit);
1134
1135static int sbp2_probe(struct fw_unit *unit, const struct ieee1394_device_id *id)
1136{
1137 struct fw_device *device = fw_parent_device(unit);
1138 struct sbp2_target *tgt;
1139 struct sbp2_logical_unit *lu;
1140 struct Scsi_Host *shost;
1141 u32 model, firmware_revision;
1142
1143
1144 if (device->is_local)
1145 return -ENODEV;
1146
1147 shost = scsi_host_alloc(&scsi_driver_template, sizeof(*tgt));
1148 if (shost == NULL)
1149 return -ENOMEM;
1150
1151 tgt = (struct sbp2_target *)shost->hostdata;
1152 dev_set_drvdata(&unit->device, tgt);
1153 tgt->unit = unit;
1154 INIT_LIST_HEAD(&tgt->lu_list);
1155 spin_lock_init(&tgt->lock);
1156 tgt->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4];
1157
1158 if (fw_device_enable_phys_dma(device) < 0)
1159 goto fail_shost_put;
1160
1161 shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
1162
1163 if (scsi_add_host_with_dma(shost, &unit->device,
1164 device->card->device) < 0)
1165 goto fail_shost_put;
1166
1167
1168 tgt->directory_id = ((unit->directory - device->config_rom) * 4
1169 + CSR_CONFIG_ROM) & 0xffffff;
1170
1171 firmware_revision = SBP2_ROM_VALUE_MISSING;
1172 model = SBP2_ROM_VALUE_MISSING;
1173
1174 if (sbp2_scan_unit_dir(tgt, unit->directory, &model,
1175 &firmware_revision) < 0)
1176 goto fail_remove;
1177
1178 sbp2_clamp_management_orb_timeout(tgt);
1179 sbp2_init_workarounds(tgt, model, firmware_revision);
1180
1181
1182
1183
1184
1185
1186
1187 tgt->max_payload = min3(device->max_speed + 7, 10U,
1188 device->card->max_receive - 1);
1189
1190
1191 list_for_each_entry(lu, &tgt->lu_list, link)
1192 sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
1193
1194 return 0;
1195
1196 fail_remove:
1197 sbp2_remove(unit);
1198 return -ENOMEM;
1199
1200 fail_shost_put:
1201 scsi_host_put(shost);
1202 return -ENOMEM;
1203}
1204
1205static void sbp2_update(struct fw_unit *unit)
1206{
1207 struct sbp2_target *tgt = dev_get_drvdata(&unit->device);
1208 struct sbp2_logical_unit *lu;
1209
1210 fw_device_enable_phys_dma(fw_parent_device(unit));
1211
1212
1213
1214
1215
1216 list_for_each_entry(lu, &tgt->lu_list, link) {
1217 sbp2_conditionally_block(lu);
1218 lu->retries = 0;
1219 sbp2_queue_work(lu, 0);
1220 }
1221}
1222
1223static void sbp2_remove(struct fw_unit *unit)
1224{
1225 struct fw_device *device = fw_parent_device(unit);
1226 struct sbp2_target *tgt = dev_get_drvdata(&unit->device);
1227 struct sbp2_logical_unit *lu, *next;
1228 struct Scsi_Host *shost =
1229 container_of((void *)tgt, struct Scsi_Host, hostdata[0]);
1230 struct scsi_device *sdev;
1231
1232
1233 sbp2_unblock(tgt);
1234
1235 list_for_each_entry_safe(lu, next, &tgt->lu_list, link) {
1236 cancel_delayed_work_sync(&lu->work);
1237 sdev = scsi_device_lookup(shost, 0, 0, sbp2_lun2int(lu->lun));
1238 if (sdev) {
1239 scsi_remove_device(sdev);
1240 scsi_device_put(sdev);
1241 }
1242 if (lu->login_id != INVALID_LOGIN_ID) {
1243 int generation, node_id;
1244
1245
1246
1247
1248
1249 generation = device->generation;
1250 smp_rmb();
1251 node_id = device->node_id;
1252 sbp2_send_management_orb(lu, node_id, generation,
1253 SBP2_LOGOUT_REQUEST,
1254 lu->login_id, NULL);
1255 }
1256 fw_core_remove_address_handler(&lu->address_handler);
1257 list_del(&lu->link);
1258 kfree(lu);
1259 }
1260 scsi_remove_host(shost);
1261 dev_notice(&unit->device, "released target %d:0:0\n", shost->host_no);
1262
1263 scsi_host_put(shost);
1264}
1265
1266#define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e
1267#define SBP2_SW_VERSION_ENTRY 0x00010483
1268
1269static const struct ieee1394_device_id sbp2_id_table[] = {
1270 {
1271 .match_flags = IEEE1394_MATCH_SPECIFIER_ID |
1272 IEEE1394_MATCH_VERSION,
1273 .specifier_id = SBP2_UNIT_SPEC_ID_ENTRY,
1274 .version = SBP2_SW_VERSION_ENTRY,
1275 },
1276 { }
1277};
1278
1279static struct fw_driver sbp2_driver = {
1280 .driver = {
1281 .owner = THIS_MODULE,
1282 .name = KBUILD_MODNAME,
1283 .bus = &fw_bus_type,
1284 },
1285 .probe = sbp2_probe,
1286 .update = sbp2_update,
1287 .remove = sbp2_remove,
1288 .id_table = sbp2_id_table,
1289};
1290
1291static void sbp2_unmap_scatterlist(struct device *card_device,
1292 struct sbp2_command_orb *orb)
1293{
1294 scsi_dma_unmap(orb->cmd);
1295
1296 if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
1297 dma_unmap_single(card_device, orb->page_table_bus,
1298 sizeof(orb->page_table), DMA_TO_DEVICE);
1299}
1300
1301static unsigned int sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
1302{
1303 int sam_status;
1304 int sfmt = (sbp2_status[0] >> 6) & 0x03;
1305
1306 if (sfmt == 2 || sfmt == 3) {
1307
1308
1309
1310
1311 return DID_ERROR << 16;
1312 }
1313
1314 sense_data[0] = 0x70 | sfmt | (sbp2_status[1] & 0x80);
1315 sense_data[1] = 0x0;
1316 sense_data[2] = ((sbp2_status[1] << 1) & 0xe0) | (sbp2_status[1] & 0x0f);
1317 sense_data[3] = sbp2_status[4];
1318 sense_data[4] = sbp2_status[5];
1319 sense_data[5] = sbp2_status[6];
1320 sense_data[6] = sbp2_status[7];
1321 sense_data[7] = 10;
1322 sense_data[8] = sbp2_status[8];
1323 sense_data[9] = sbp2_status[9];
1324 sense_data[10] = sbp2_status[10];
1325 sense_data[11] = sbp2_status[11];
1326 sense_data[12] = sbp2_status[2];
1327 sense_data[13] = sbp2_status[3];
1328 sense_data[14] = sbp2_status[12];
1329 sense_data[15] = sbp2_status[13];
1330
1331 sam_status = sbp2_status[0] & 0x3f;
1332
1333 switch (sam_status) {
1334 case SAM_STAT_GOOD:
1335 case SAM_STAT_CHECK_CONDITION:
1336 case SAM_STAT_CONDITION_MET:
1337 case SAM_STAT_BUSY:
1338 case SAM_STAT_RESERVATION_CONFLICT:
1339 case SAM_STAT_COMMAND_TERMINATED:
1340 return DID_OK << 16 | sam_status;
1341
1342 default:
1343 return DID_ERROR << 16;
1344 }
1345}
1346
1347static void complete_command_orb(struct sbp2_orb *base_orb,
1348 struct sbp2_status *status)
1349{
1350 struct sbp2_command_orb *orb =
1351 container_of(base_orb, struct sbp2_command_orb, base);
1352 struct fw_device *device = target_parent_device(base_orb->lu->tgt);
1353 int result;
1354
1355 if (status != NULL) {
1356 if (STATUS_GET_DEAD(*status))
1357 sbp2_agent_reset_no_wait(base_orb->lu);
1358
1359 switch (STATUS_GET_RESPONSE(*status)) {
1360 case SBP2_STATUS_REQUEST_COMPLETE:
1361 result = DID_OK << 16;
1362 break;
1363 case SBP2_STATUS_TRANSPORT_FAILURE:
1364 result = DID_BUS_BUSY << 16;
1365 break;
1366 case SBP2_STATUS_ILLEGAL_REQUEST:
1367 case SBP2_STATUS_VENDOR_DEPENDENT:
1368 default:
1369 result = DID_ERROR << 16;
1370 break;
1371 }
1372
1373 if (result == DID_OK << 16 && STATUS_GET_LEN(*status) > 1)
1374 result = sbp2_status_to_sense_data(STATUS_GET_DATA(*status),
1375 orb->cmd->sense_buffer);
1376 } else {
1377
1378
1379
1380
1381
1382 result = DID_BUS_BUSY << 16;
1383 sbp2_conditionally_block(base_orb->lu);
1384 }
1385
1386 dma_unmap_single(device->card->device, orb->base.request_bus,
1387 sizeof(orb->request), DMA_TO_DEVICE);
1388 sbp2_unmap_scatterlist(device->card->device, orb);
1389
1390 orb->cmd->result = result;
1391 orb->cmd->scsi_done(orb->cmd);
1392}
1393
1394static int sbp2_map_scatterlist(struct sbp2_command_orb *orb,
1395 struct fw_device *device, struct sbp2_logical_unit *lu)
1396{
1397 struct scatterlist *sg = scsi_sglist(orb->cmd);
1398 int i, n;
1399
1400 n = scsi_dma_map(orb->cmd);
1401 if (n <= 0)
1402 goto fail;
1403
1404
1405
1406
1407
1408
1409
1410
1411 if (n == 1) {
1412 orb->request.data_descriptor.high =
1413 cpu_to_be32(lu->tgt->address_high);
1414 orb->request.data_descriptor.low =
1415 cpu_to_be32(sg_dma_address(sg));
1416 orb->request.misc |=
1417 cpu_to_be32(COMMAND_ORB_DATA_SIZE(sg_dma_len(sg)));
1418 return 0;
1419 }
1420
1421 for_each_sg(sg, sg, n, i) {
1422 orb->page_table[i].high = cpu_to_be32(sg_dma_len(sg) << 16);
1423 orb->page_table[i].low = cpu_to_be32(sg_dma_address(sg));
1424 }
1425
1426 orb->page_table_bus =
1427 dma_map_single(device->card->device, orb->page_table,
1428 sizeof(orb->page_table), DMA_TO_DEVICE);
1429 if (dma_mapping_error(device->card->device, orb->page_table_bus))
1430 goto fail_page_table;
1431
1432
1433
1434
1435
1436
1437
1438
1439 orb->request.data_descriptor.high = cpu_to_be32(lu->tgt->address_high);
1440 orb->request.data_descriptor.low = cpu_to_be32(orb->page_table_bus);
1441 orb->request.misc |= cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT |
1442 COMMAND_ORB_DATA_SIZE(n));
1443
1444 return 0;
1445
1446 fail_page_table:
1447 scsi_dma_unmap(orb->cmd);
1448 fail:
1449 return -ENOMEM;
1450}
1451
1452
1453
1454static int sbp2_scsi_queuecommand(struct Scsi_Host *shost,
1455 struct scsi_cmnd *cmd)
1456{
1457 struct sbp2_logical_unit *lu = cmd->device->hostdata;
1458 struct fw_device *device = target_parent_device(lu->tgt);
1459 struct sbp2_command_orb *orb;
1460 int generation, retval = SCSI_MLQUEUE_HOST_BUSY;
1461
1462 orb = kzalloc(sizeof(*orb), GFP_ATOMIC);
1463 if (orb == NULL)
1464 return SCSI_MLQUEUE_HOST_BUSY;
1465
1466
1467 orb->base.rcode = -1;
1468 kref_init(&orb->base.kref);
1469 orb->cmd = cmd;
1470 orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL);
1471 orb->request.misc = cpu_to_be32(
1472 COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) |
1473 COMMAND_ORB_SPEED(device->max_speed) |
1474 COMMAND_ORB_NOTIFY);
1475
1476 if (cmd->sc_data_direction == DMA_FROM_DEVICE)
1477 orb->request.misc |= cpu_to_be32(COMMAND_ORB_DIRECTION);
1478
1479 generation = device->generation;
1480 smp_rmb();
1481
1482 if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0)
1483 goto out;
1484
1485 memcpy(orb->request.command_block, cmd->cmnd, cmd->cmd_len);
1486
1487 orb->base.callback = complete_command_orb;
1488 orb->base.request_bus =
1489 dma_map_single(device->card->device, &orb->request,
1490 sizeof(orb->request), DMA_TO_DEVICE);
1491 if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
1492 sbp2_unmap_scatterlist(device->card->device, orb);
1493 goto out;
1494 }
1495
1496 sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation,
1497 lu->command_block_agent_address + SBP2_ORB_POINTER);
1498 retval = 0;
1499 out:
1500 kref_put(&orb->base.kref, free_orb);
1501 return retval;
1502}
1503
1504static int sbp2_scsi_slave_alloc(struct scsi_device *sdev)
1505{
1506 struct sbp2_logical_unit *lu = sdev->hostdata;
1507
1508
1509 if (!lu)
1510 return -ENOSYS;
1511
1512 sdev->allow_restart = 1;
1513
1514
1515
1516
1517
1518 blk_queue_update_dma_alignment(sdev->request_queue, 4 - 1);
1519
1520 if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36)
1521 sdev->inquiry_len = 36;
1522
1523 return 0;
1524}
1525
1526static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
1527{
1528 struct sbp2_logical_unit *lu = sdev->hostdata;
1529
1530 sdev->use_10_for_rw = 1;
1531
1532 if (sbp2_param_exclusive_login)
1533 sdev->manage_start_stop = 1;
1534
1535 if (sdev->type == TYPE_ROM)
1536 sdev->use_10_for_ms = 1;
1537
1538 if (sdev->type == TYPE_DISK &&
1539 lu->tgt->workarounds & SBP2_WORKAROUND_MODE_SENSE_8)
1540 sdev->skip_ms_page_8 = 1;
1541
1542 if (lu->tgt->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
1543 sdev->fix_capacity = 1;
1544
1545 if (lu->tgt->workarounds & SBP2_WORKAROUND_POWER_CONDITION)
1546 sdev->start_stop_pwr_cond = 1;
1547
1548 if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS)
1549 blk_queue_max_hw_sectors(sdev->request_queue, 128 * 1024 / 512);
1550
1551 return 0;
1552}
1553
1554
1555
1556
1557
1558static int sbp2_scsi_abort(struct scsi_cmnd *cmd)
1559{
1560 struct sbp2_logical_unit *lu = cmd->device->hostdata;
1561
1562 dev_notice(lu_dev(lu), "sbp2_scsi_abort\n");
1563 sbp2_agent_reset(lu);
1564 sbp2_cancel_orbs(lu);
1565
1566 return SUCCESS;
1567}
1568
1569
1570
1571
1572
1573
1574
1575
1576static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
1577 struct device_attribute *attr, char *buf)
1578{
1579 struct scsi_device *sdev = to_scsi_device(dev);
1580 struct sbp2_logical_unit *lu;
1581
1582 if (!sdev)
1583 return 0;
1584
1585 lu = sdev->hostdata;
1586
1587 return sprintf(buf, "%016llx:%06x:%04x\n",
1588 (unsigned long long)lu->tgt->guid,
1589 lu->tgt->directory_id, lu->lun);
1590}
1591
1592static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL);
1593
1594static struct device_attribute *sbp2_scsi_sysfs_attrs[] = {
1595 &dev_attr_ieee1394_id,
1596 NULL
1597};
1598
1599static struct scsi_host_template scsi_driver_template = {
1600 .module = THIS_MODULE,
1601 .name = "SBP-2 IEEE-1394",
1602 .proc_name = "sbp2",
1603 .queuecommand = sbp2_scsi_queuecommand,
1604 .slave_alloc = sbp2_scsi_slave_alloc,
1605 .slave_configure = sbp2_scsi_slave_configure,
1606 .eh_abort_handler = sbp2_scsi_abort,
1607 .this_id = -1,
1608 .sg_tablesize = SG_ALL,
1609 .max_segment_size = SBP2_MAX_SEG_SIZE,
1610 .can_queue = 1,
1611 .sdev_attrs = sbp2_scsi_sysfs_attrs,
1612};
1613
1614MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
1615MODULE_DESCRIPTION("SCSI over IEEE1394");
1616MODULE_LICENSE("GPL");
1617MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table);
1618
1619
1620MODULE_ALIAS("sbp2");
1621
1622static int __init sbp2_init(void)
1623{
1624 return driver_register(&sbp2_driver.driver);
1625}
1626
1627static void __exit sbp2_cleanup(void)
1628{
1629 driver_unregister(&sbp2_driver.driver);
1630}
1631
1632module_init(sbp2_init);
1633module_exit(sbp2_cleanup);
1634