diff options
| -rw-r--r-- | drivers/firewire/core-device.c | 4 | ||||
| -rw-r--r-- | drivers/firewire/sbp2.c | 37 | ||||
| -rw-r--r-- | include/linux/firewire.h | 5 |
3 files changed, 28 insertions, 18 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index 65d84dd6c1de..3f4e646367b7 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c | |||
| @@ -93,7 +93,7 @@ static int fw_unit_match(struct device *dev, struct device_driver *drv) | |||
| 93 | if (!is_fw_unit(dev)) | 93 | if (!is_fw_unit(dev)) |
| 94 | return 0; | 94 | return 0; |
| 95 | 95 | ||
| 96 | device = fw_device(unit->device.parent); | 96 | device = fw_parent_device(unit); |
| 97 | id = container_of(drv, struct fw_driver, driver)->id_table; | 97 | id = container_of(drv, struct fw_driver, driver)->id_table; |
| 98 | 98 | ||
| 99 | for (; id->match_flags != 0; id++) { | 99 | for (; id->match_flags != 0; id++) { |
| @@ -114,7 +114,7 @@ static int fw_unit_match(struct device *dev, struct device_driver *drv) | |||
| 114 | 114 | ||
| 115 | static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size) | 115 | static int get_modalias(struct fw_unit *unit, char *buffer, size_t buffer_size) |
| 116 | { | 116 | { |
| 117 | struct fw_device *device = fw_device(unit->device.parent); | 117 | struct fw_device *device = fw_parent_device(unit); |
| 118 | struct fw_csr_iterator ci; | 118 | struct fw_csr_iterator ci; |
| 119 | 119 | ||
| 120 | int key, value; | 120 | int key, value; |
diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index d41cb6e455bc..2353643721c1 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c | |||
| @@ -180,6 +180,11 @@ struct sbp2_target { | |||
| 180 | int blocked; /* ditto */ | 180 | int blocked; /* ditto */ |
| 181 | }; | 181 | }; |
| 182 | 182 | ||
| 183 | static struct fw_device *target_device(struct sbp2_target *tgt) | ||
| 184 | { | ||
| 185 | return fw_parent_device(tgt->unit); | ||
| 186 | } | ||
| 187 | |||
| 183 | /* Impossible login_id, to detect logout attempt before successful login */ | 188 | /* Impossible login_id, to detect logout attempt before successful login */ |
| 184 | #define INVALID_LOGIN_ID 0x10000 | 189 | #define INVALID_LOGIN_ID 0x10000 |
| 185 | 190 | ||
| @@ -488,7 +493,7 @@ static void complete_transaction(struct fw_card *card, int rcode, | |||
| 488 | static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, | 493 | static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, |
| 489 | int node_id, int generation, u64 offset) | 494 | int node_id, int generation, u64 offset) |
| 490 | { | 495 | { |
| 491 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 496 | struct fw_device *device = target_device(lu->tgt); |
| 492 | unsigned long flags; | 497 | unsigned long flags; |
| 493 | 498 | ||
| 494 | orb->pointer.high = 0; | 499 | orb->pointer.high = 0; |
| @@ -510,7 +515,7 @@ static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, | |||
| 510 | 515 | ||
| 511 | static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu) | 516 | static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu) |
| 512 | { | 517 | { |
| 513 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 518 | struct fw_device *device = target_device(lu->tgt); |
| 514 | struct sbp2_orb *orb, *next; | 519 | struct sbp2_orb *orb, *next; |
| 515 | struct list_head list; | 520 | struct list_head list; |
| 516 | unsigned long flags; | 521 | unsigned long flags; |
| @@ -548,7 +553,7 @@ static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
| 548 | int generation, int function, | 553 | int generation, int function, |
| 549 | int lun_or_login_id, void *response) | 554 | int lun_or_login_id, void *response) |
| 550 | { | 555 | { |
| 551 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 556 | struct fw_device *device = target_device(lu->tgt); |
| 552 | struct sbp2_management_orb *orb; | 557 | struct sbp2_management_orb *orb; |
| 553 | unsigned int timeout; | 558 | unsigned int timeout; |
| 554 | int retval = -ENOMEM; | 559 | int retval = -ENOMEM; |
| @@ -644,7 +649,7 @@ static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, | |||
| 644 | 649 | ||
| 645 | static void sbp2_agent_reset(struct sbp2_logical_unit *lu) | 650 | static void sbp2_agent_reset(struct sbp2_logical_unit *lu) |
| 646 | { | 651 | { |
| 647 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 652 | struct fw_device *device = target_device(lu->tgt); |
| 648 | __be32 d = 0; | 653 | __be32 d = 0; |
| 649 | 654 | ||
| 650 | fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, | 655 | fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, |
| @@ -661,7 +666,7 @@ static void complete_agent_reset_write_no_wait(struct fw_card *card, | |||
| 661 | 666 | ||
| 662 | static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) | 667 | static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) |
| 663 | { | 668 | { |
| 664 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 669 | struct fw_device *device = target_device(lu->tgt); |
| 665 | struct fw_transaction *t; | 670 | struct fw_transaction *t; |
| 666 | static __be32 d; | 671 | static __be32 d; |
| 667 | 672 | ||
| @@ -700,7 +705,7 @@ static inline void sbp2_allow_block(struct sbp2_logical_unit *lu) | |||
| 700 | static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) | 705 | static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) |
| 701 | { | 706 | { |
| 702 | struct sbp2_target *tgt = lu->tgt; | 707 | struct sbp2_target *tgt = lu->tgt; |
| 703 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | 708 | struct fw_card *card = target_device(tgt)->card; |
| 704 | struct Scsi_Host *shost = | 709 | struct Scsi_Host *shost = |
| 705 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | 710 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
| 706 | unsigned long flags; | 711 | unsigned long flags; |
| @@ -724,7 +729,7 @@ static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) | |||
| 724 | static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) | 729 | static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) |
| 725 | { | 730 | { |
| 726 | struct sbp2_target *tgt = lu->tgt; | 731 | struct sbp2_target *tgt = lu->tgt; |
| 727 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | 732 | struct fw_card *card = target_device(tgt)->card; |
| 728 | struct Scsi_Host *shost = | 733 | struct Scsi_Host *shost = |
| 729 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | 734 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
| 730 | unsigned long flags; | 735 | unsigned long flags; |
| @@ -749,7 +754,7 @@ static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) | |||
| 749 | */ | 754 | */ |
| 750 | static void sbp2_unblock(struct sbp2_target *tgt) | 755 | static void sbp2_unblock(struct sbp2_target *tgt) |
| 751 | { | 756 | { |
| 752 | struct fw_card *card = fw_device(tgt->unit->device.parent)->card; | 757 | struct fw_card *card = target_device(tgt)->card; |
| 753 | struct Scsi_Host *shost = | 758 | struct Scsi_Host *shost = |
| 754 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | 759 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
| 755 | unsigned long flags; | 760 | unsigned long flags; |
| @@ -779,7 +784,7 @@ static void sbp2_release_target(struct kref *kref) | |||
| 779 | struct Scsi_Host *shost = | 784 | struct Scsi_Host *shost = |
| 780 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); | 785 | container_of((void *)tgt, struct Scsi_Host, hostdata[0]); |
| 781 | struct scsi_device *sdev; | 786 | struct scsi_device *sdev; |
| 782 | struct fw_device *device = fw_device(tgt->unit->device.parent); | 787 | struct fw_device *device = target_device(tgt); |
| 783 | 788 | ||
| 784 | /* prevent deadlocks */ | 789 | /* prevent deadlocks */ |
| 785 | sbp2_unblock(tgt); | 790 | sbp2_unblock(tgt); |
| @@ -852,7 +857,7 @@ static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay) | |||
| 852 | */ | 857 | */ |
| 853 | static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) | 858 | static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) |
| 854 | { | 859 | { |
| 855 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 860 | struct fw_device *device = target_device(lu->tgt); |
| 856 | __be32 d = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT); | 861 | __be32 d = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT); |
| 857 | 862 | ||
| 858 | fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, | 863 | fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, |
| @@ -868,7 +873,7 @@ static void sbp2_login(struct work_struct *work) | |||
| 868 | struct sbp2_logical_unit *lu = | 873 | struct sbp2_logical_unit *lu = |
| 869 | container_of(work, struct sbp2_logical_unit, work.work); | 874 | container_of(work, struct sbp2_logical_unit, work.work); |
| 870 | struct sbp2_target *tgt = lu->tgt; | 875 | struct sbp2_target *tgt = lu->tgt; |
| 871 | struct fw_device *device = fw_device(tgt->unit->device.parent); | 876 | struct fw_device *device = target_device(tgt); |
| 872 | struct Scsi_Host *shost; | 877 | struct Scsi_Host *shost; |
| 873 | struct scsi_device *sdev; | 878 | struct scsi_device *sdev; |
| 874 | struct sbp2_login_response response; | 879 | struct sbp2_login_response response; |
| @@ -1116,7 +1121,7 @@ static struct scsi_host_template scsi_driver_template; | |||
| 1116 | static int sbp2_probe(struct device *dev) | 1121 | static int sbp2_probe(struct device *dev) |
| 1117 | { | 1122 | { |
| 1118 | struct fw_unit *unit = fw_unit(dev); | 1123 | struct fw_unit *unit = fw_unit(dev); |
| 1119 | struct fw_device *device = fw_device(unit->device.parent); | 1124 | struct fw_device *device = fw_parent_device(unit); |
| 1120 | struct sbp2_target *tgt; | 1125 | struct sbp2_target *tgt; |
| 1121 | struct sbp2_logical_unit *lu; | 1126 | struct sbp2_logical_unit *lu; |
| 1122 | struct Scsi_Host *shost; | 1127 | struct Scsi_Host *shost; |
| @@ -1197,7 +1202,7 @@ static void sbp2_reconnect(struct work_struct *work) | |||
| 1197 | struct sbp2_logical_unit *lu = | 1202 | struct sbp2_logical_unit *lu = |
| 1198 | container_of(work, struct sbp2_logical_unit, work.work); | 1203 | container_of(work, struct sbp2_logical_unit, work.work); |
| 1199 | struct sbp2_target *tgt = lu->tgt; | 1204 | struct sbp2_target *tgt = lu->tgt; |
| 1200 | struct fw_device *device = fw_device(tgt->unit->device.parent); | 1205 | struct fw_device *device = target_device(tgt); |
| 1201 | int generation, node_id, local_node_id; | 1206 | int generation, node_id, local_node_id; |
| 1202 | 1207 | ||
| 1203 | if (fw_device_is_shutdown(device)) | 1208 | if (fw_device_is_shutdown(device)) |
| @@ -1249,7 +1254,7 @@ static void sbp2_update(struct fw_unit *unit) | |||
| 1249 | struct sbp2_target *tgt = unit->device.driver_data; | 1254 | struct sbp2_target *tgt = unit->device.driver_data; |
| 1250 | struct sbp2_logical_unit *lu; | 1255 | struct sbp2_logical_unit *lu; |
| 1251 | 1256 | ||
| 1252 | fw_device_enable_phys_dma(fw_device(unit->device.parent)); | 1257 | fw_device_enable_phys_dma(fw_parent_device(unit)); |
| 1253 | 1258 | ||
| 1254 | /* | 1259 | /* |
| 1255 | * Fw-core serializes sbp2_update() against sbp2_remove(). | 1260 | * Fw-core serializes sbp2_update() against sbp2_remove(). |
| @@ -1342,7 +1347,7 @@ static void complete_command_orb(struct sbp2_orb *base_orb, | |||
| 1342 | { | 1347 | { |
| 1343 | struct sbp2_command_orb *orb = | 1348 | struct sbp2_command_orb *orb = |
| 1344 | container_of(base_orb, struct sbp2_command_orb, base); | 1349 | container_of(base_orb, struct sbp2_command_orb, base); |
| 1345 | struct fw_device *device = fw_device(orb->lu->tgt->unit->device.parent); | 1350 | struct fw_device *device = target_device(orb->lu->tgt); |
| 1346 | int result; | 1351 | int result; |
| 1347 | 1352 | ||
| 1348 | if (status != NULL) { | 1353 | if (status != NULL) { |
| @@ -1449,7 +1454,7 @@ static int sbp2_map_scatterlist(struct sbp2_command_orb *orb, | |||
| 1449 | static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) | 1454 | static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) |
| 1450 | { | 1455 | { |
| 1451 | struct sbp2_logical_unit *lu = cmd->device->hostdata; | 1456 | struct sbp2_logical_unit *lu = cmd->device->hostdata; |
| 1452 | struct fw_device *device = fw_device(lu->tgt->unit->device.parent); | 1457 | struct fw_device *device = target_device(lu->tgt); |
| 1453 | struct sbp2_command_orb *orb; | 1458 | struct sbp2_command_orb *orb; |
| 1454 | int generation, retval = SCSI_MLQUEUE_HOST_BUSY; | 1459 | int generation, retval = SCSI_MLQUEUE_HOST_BUSY; |
| 1455 | 1460 | ||
diff --git a/include/linux/firewire.h b/include/linux/firewire.h index e979f9b22cb6..a69aea0394e3 100644 --- a/include/linux/firewire.h +++ b/include/linux/firewire.h | |||
| @@ -248,6 +248,11 @@ static inline void fw_unit_put(struct fw_unit *unit) | |||
| 248 | put_device(&unit->device); | 248 | put_device(&unit->device); |
| 249 | } | 249 | } |
| 250 | 250 | ||
| 251 | static inline struct fw_device *fw_parent_device(struct fw_unit *unit) | ||
| 252 | { | ||
| 253 | return fw_device(unit->device.parent); | ||
| 254 | } | ||
| 255 | |||
| 251 | struct ieee1394_device_id; | 256 | struct ieee1394_device_id; |
| 252 | 257 | ||
| 253 | struct fw_driver { | 258 | struct fw_driver { |
