1e71d31daSStefan Richter /* 2e71d31daSStefan Richter * SBP2 driver (SCSI over IEEE1394) 3e71d31daSStefan Richter * 4e71d31daSStefan Richter * Copyright (C) 2005-2007 Kristian Hoegsberg <krh@bitplanet.net> 5e71d31daSStefan Richter * 6e71d31daSStefan Richter * This program is free software; you can redistribute it and/or modify 7e71d31daSStefan Richter * it under the terms of the GNU General Public License as published by 8e71d31daSStefan Richter * the Free Software Foundation; either version 2 of the License, or 9e71d31daSStefan Richter * (at your option) any later version. 10e71d31daSStefan Richter * 11e71d31daSStefan Richter * This program is distributed in the hope that it will be useful, 12e71d31daSStefan Richter * but WITHOUT ANY WARRANTY; without even the implied warranty of 13e71d31daSStefan Richter * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14e71d31daSStefan Richter * GNU General Public License for more details. 15e71d31daSStefan Richter * 16e71d31daSStefan Richter * You should have received a copy of the GNU General Public License 17e71d31daSStefan Richter * along with this program; if not, write to the Free Software Foundation, 18e71d31daSStefan Richter * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19e71d31daSStefan Richter */ 20e71d31daSStefan Richter 21e71d31daSStefan Richter /* 22e71d31daSStefan Richter * The basic structure of this driver is based on the old storage driver, 23e71d31daSStefan Richter * drivers/ieee1394/sbp2.c, originally written by 24e71d31daSStefan Richter * James Goodwin <jamesg@filanet.com> 25e71d31daSStefan Richter * with later contributions and ongoing maintenance from 26e71d31daSStefan Richter * Ben Collins <bcollins@debian.org>, 27e71d31daSStefan Richter * Stefan Richter <stefanr@s5r6.in-berlin.de> 28e71d31daSStefan Richter * and many others. 29e71d31daSStefan Richter */ 30e71d31daSStefan Richter 31e71d31daSStefan Richter #include <linux/blkdev.h> 32e71d31daSStefan Richter #include <linux/bug.h> 33e71d31daSStefan Richter #include <linux/completion.h> 34e71d31daSStefan Richter #include <linux/delay.h> 35e71d31daSStefan Richter #include <linux/device.h> 36e71d31daSStefan Richter #include <linux/dma-mapping.h> 37e71d31daSStefan Richter #include <linux/firewire.h> 38e71d31daSStefan Richter #include <linux/firewire-constants.h> 39e71d31daSStefan Richter #include <linux/init.h> 40e71d31daSStefan Richter #include <linux/jiffies.h> 41e71d31daSStefan Richter #include <linux/kernel.h> 42e71d31daSStefan Richter #include <linux/kref.h> 43e71d31daSStefan Richter #include <linux/list.h> 44e71d31daSStefan Richter #include <linux/mod_devicetable.h> 45e71d31daSStefan Richter #include <linux/module.h> 46e71d31daSStefan Richter #include <linux/moduleparam.h> 47e71d31daSStefan Richter #include <linux/scatterlist.h> 48e71d31daSStefan Richter #include <linux/slab.h> 49e71d31daSStefan Richter #include <linux/spinlock.h> 50e71d31daSStefan Richter #include <linux/string.h> 51e71d31daSStefan Richter #include <linux/stringify.h> 52e71d31daSStefan Richter #include <linux/workqueue.h> 53e71d31daSStefan Richter 54e71d31daSStefan Richter #include <asm/byteorder.h> 55e71d31daSStefan Richter #include <asm/system.h> 56e71d31daSStefan Richter 57e71d31daSStefan Richter #include <scsi/scsi.h> 58e71d31daSStefan Richter #include <scsi/scsi_cmnd.h> 59e71d31daSStefan Richter #include <scsi/scsi_device.h> 60e71d31daSStefan Richter #include <scsi/scsi_host.h> 61e71d31daSStefan Richter 62e71d31daSStefan Richter /* 63e71d31daSStefan Richter * So far only bridges from Oxford Semiconductor are known to support 64e71d31daSStefan Richter * concurrent logins. Depending on firmware, four or two concurrent logins 65e71d31daSStefan Richter * are possible on OXFW911 and newer Oxsemi bridges. 66e71d31daSStefan Richter * 67e71d31daSStefan Richter * Concurrent logins are useful together with cluster filesystems. 68e71d31daSStefan Richter */ 69e71d31daSStefan Richter static int sbp2_param_exclusive_login = 1; 70e71d31daSStefan Richter module_param_named(exclusive_login, sbp2_param_exclusive_login, bool, 0644); 71e71d31daSStefan Richter MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device " 72e71d31daSStefan Richter "(default = Y, use N for concurrent initiators)"); 73e71d31daSStefan Richter 74e71d31daSStefan Richter /* 75e71d31daSStefan Richter * Flags for firmware oddities 76e71d31daSStefan Richter * 77e71d31daSStefan Richter * - 128kB max transfer 78e71d31daSStefan Richter * Limit transfer size. Necessary for some old bridges. 79e71d31daSStefan Richter * 80e71d31daSStefan Richter * - 36 byte inquiry 81e71d31daSStefan Richter * When scsi_mod probes the device, let the inquiry command look like that 82e71d31daSStefan Richter * from MS Windows. 83e71d31daSStefan Richter * 84e71d31daSStefan Richter * - skip mode page 8 85e71d31daSStefan Richter * Suppress sending of mode_sense for mode page 8 if the device pretends to 86e71d31daSStefan Richter * support the SCSI Primary Block commands instead of Reduced Block Commands. 87e71d31daSStefan Richter * 88e71d31daSStefan Richter * - fix capacity 89e71d31daSStefan Richter * Tell sd_mod to correct the last sector number reported by read_capacity. 90e71d31daSStefan Richter * Avoids access beyond actual disk limits on devices with an off-by-one bug. 91e71d31daSStefan Richter * Don't use this with devices which don't have this bug. 92e71d31daSStefan Richter * 93e71d31daSStefan Richter * - delay inquiry 94e71d31daSStefan Richter * Wait extra SBP2_INQUIRY_DELAY seconds after login before SCSI inquiry. 95e71d31daSStefan Richter * 96e71d31daSStefan Richter * - power condition 97e71d31daSStefan Richter * Set the power condition field in the START STOP UNIT commands sent by 98e71d31daSStefan Richter * sd_mod on suspend, resume, and shutdown (if manage_start_stop is on). 99e71d31daSStefan Richter * Some disks need this to spin down or to resume properly. 100e71d31daSStefan Richter * 101e71d31daSStefan Richter * - override internal blacklist 102e71d31daSStefan Richter * Instead of adding to the built-in blacklist, use only the workarounds 103e71d31daSStefan Richter * specified in the module load parameter. 104e71d31daSStefan Richter * Useful if a blacklist entry interfered with a non-broken device. 105e71d31daSStefan Richter */ 106e71d31daSStefan Richter #define SBP2_WORKAROUND_128K_MAX_TRANS 0x1 107e71d31daSStefan Richter #define SBP2_WORKAROUND_INQUIRY_36 0x2 108e71d31daSStefan Richter #define SBP2_WORKAROUND_MODE_SENSE_8 0x4 109e71d31daSStefan Richter #define SBP2_WORKAROUND_FIX_CAPACITY 0x8 110e71d31daSStefan Richter #define SBP2_WORKAROUND_DELAY_INQUIRY 0x10 111e71d31daSStefan Richter #define SBP2_INQUIRY_DELAY 12 112e71d31daSStefan Richter #define SBP2_WORKAROUND_POWER_CONDITION 0x20 113e71d31daSStefan Richter #define SBP2_WORKAROUND_OVERRIDE 0x100 114e71d31daSStefan Richter 115e71d31daSStefan Richter static int sbp2_param_workarounds; 116e71d31daSStefan Richter module_param_named(workarounds, sbp2_param_workarounds, int, 0644); 117e71d31daSStefan Richter MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0" 118e71d31daSStefan Richter ", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS) 119e71d31daSStefan Richter ", 36 byte inquiry = " __stringify(SBP2_WORKAROUND_INQUIRY_36) 120e71d31daSStefan Richter ", skip mode page 8 = " __stringify(SBP2_WORKAROUND_MODE_SENSE_8) 121e71d31daSStefan Richter ", fix capacity = " __stringify(SBP2_WORKAROUND_FIX_CAPACITY) 122e71d31daSStefan Richter ", delay inquiry = " __stringify(SBP2_WORKAROUND_DELAY_INQUIRY) 123e71d31daSStefan Richter ", set power condition in start stop unit = " 124e71d31daSStefan Richter __stringify(SBP2_WORKAROUND_POWER_CONDITION) 125e71d31daSStefan Richter ", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE) 126e71d31daSStefan Richter ", or a combination)"); 127e71d31daSStefan Richter 128e71d31daSStefan Richter /* I don't know why the SCSI stack doesn't define something like this... */ 129e71d31daSStefan Richter typedef void (*scsi_done_fn_t)(struct scsi_cmnd *); 130e71d31daSStefan Richter 131e71d31daSStefan Richter static const char sbp2_driver_name[] = "sbp2"; 132e71d31daSStefan Richter 133e71d31daSStefan Richter /* 134e71d31daSStefan Richter * We create one struct sbp2_logical_unit per SBP-2 Logical Unit Number Entry 135e71d31daSStefan Richter * and one struct scsi_device per sbp2_logical_unit. 136e71d31daSStefan Richter */ 137e71d31daSStefan Richter struct sbp2_logical_unit { 138e71d31daSStefan Richter struct sbp2_target *tgt; 139e71d31daSStefan Richter struct list_head link; 140e71d31daSStefan Richter struct fw_address_handler address_handler; 141e71d31daSStefan Richter struct list_head orb_list; 142e71d31daSStefan Richter 143e71d31daSStefan Richter u64 command_block_agent_address; 144e71d31daSStefan Richter u16 lun; 145e71d31daSStefan Richter int login_id; 146e71d31daSStefan Richter 147e71d31daSStefan Richter /* 148e71d31daSStefan Richter * The generation is updated once we've logged in or reconnected 149e71d31daSStefan Richter * to the logical unit. Thus, I/O to the device will automatically 150e71d31daSStefan Richter * fail and get retried if it happens in a window where the device 151e71d31daSStefan Richter * is not ready, e.g. after a bus reset but before we reconnect. 152e71d31daSStefan Richter */ 153e71d31daSStefan Richter int generation; 154e71d31daSStefan Richter int retries; 155e71d31daSStefan Richter struct delayed_work work; 156e71d31daSStefan Richter bool has_sdev; 157e71d31daSStefan Richter bool blocked; 158e71d31daSStefan Richter }; 159e71d31daSStefan Richter 160e71d31daSStefan Richter /* 161e71d31daSStefan Richter * We create one struct sbp2_target per IEEE 1212 Unit Directory 162e71d31daSStefan Richter * and one struct Scsi_Host per sbp2_target. 163e71d31daSStefan Richter */ 164e71d31daSStefan Richter struct sbp2_target { 165e71d31daSStefan Richter struct kref kref; 166e71d31daSStefan Richter struct fw_unit *unit; 167e71d31daSStefan Richter const char *bus_id; 168e71d31daSStefan Richter struct list_head lu_list; 169e71d31daSStefan Richter 170e71d31daSStefan Richter u64 management_agent_address; 171e71d31daSStefan Richter u64 guid; 172e71d31daSStefan Richter int directory_id; 173e71d31daSStefan Richter int node_id; 174e71d31daSStefan Richter int address_high; 175e71d31daSStefan Richter unsigned int workarounds; 176e71d31daSStefan Richter unsigned int mgt_orb_timeout; 177e71d31daSStefan Richter unsigned int max_payload; 178e71d31daSStefan Richter 179e71d31daSStefan Richter int dont_block; /* counter for each logical unit */ 180e71d31daSStefan Richter int blocked; /* ditto */ 181e71d31daSStefan Richter }; 182e71d31daSStefan Richter 183e5110d01SStefan Richter static struct fw_device *target_device(struct sbp2_target *tgt) 184e5110d01SStefan Richter { 185e5110d01SStefan Richter return fw_parent_device(tgt->unit); 186e5110d01SStefan Richter } 187e5110d01SStefan Richter 188e71d31daSStefan Richter /* Impossible login_id, to detect logout attempt before successful login */ 189e71d31daSStefan Richter #define INVALID_LOGIN_ID 0x10000 190e71d31daSStefan Richter 191e71d31daSStefan Richter /* 192e71d31daSStefan Richter * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be 193e71d31daSStefan Richter * provided in the config rom. Most devices do provide a value, which 194e71d31daSStefan Richter * we'll use for login management orbs, but with some sane limits. 195e71d31daSStefan Richter */ 196e71d31daSStefan Richter #define SBP2_MIN_LOGIN_ORB_TIMEOUT 5000U /* Timeout in ms */ 197e71d31daSStefan Richter #define SBP2_MAX_LOGIN_ORB_TIMEOUT 40000U /* Timeout in ms */ 198e71d31daSStefan Richter #define SBP2_ORB_TIMEOUT 2000U /* Timeout in ms */ 199e71d31daSStefan Richter #define SBP2_ORB_NULL 0x80000000 200e71d31daSStefan Richter #define SBP2_RETRY_LIMIT 0xf /* 15 retries */ 201e71d31daSStefan Richter #define SBP2_CYCLE_LIMIT (0xc8 << 12) /* 200 125us cycles */ 202e71d31daSStefan Richter 203e71d31daSStefan Richter /* 204*af271941SStefan Richter * There is no transport protocol limit to the CDB length, but we implement 205*af271941SStefan Richter * a fixed length only. 16 bytes is enough for disks larger than 2 TB. 206*af271941SStefan Richter */ 207*af271941SStefan Richter #define SBP2_MAX_CDB_SIZE 16 208*af271941SStefan Richter 209*af271941SStefan Richter /* 210e71d31daSStefan Richter * The default maximum s/g segment size of a FireWire controller is 211e71d31daSStefan Richter * usually 0x10000, but SBP-2 only allows 0xffff. Since buffers have to 212e71d31daSStefan Richter * be quadlet-aligned, we set the length limit to 0xffff & ~3. 213e71d31daSStefan Richter */ 214e71d31daSStefan Richter #define SBP2_MAX_SEG_SIZE 0xfffc 215e71d31daSStefan Richter 216e71d31daSStefan Richter /* Unit directory keys */ 217e71d31daSStefan Richter #define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a 218e71d31daSStefan Richter #define SBP2_CSR_FIRMWARE_REVISION 0x3c 219e71d31daSStefan Richter #define SBP2_CSR_LOGICAL_UNIT_NUMBER 0x14 220e71d31daSStefan Richter #define SBP2_CSR_LOGICAL_UNIT_DIRECTORY 0xd4 221e71d31daSStefan Richter 222e71d31daSStefan Richter /* Management orb opcodes */ 223e71d31daSStefan Richter #define SBP2_LOGIN_REQUEST 0x0 224e71d31daSStefan Richter #define SBP2_QUERY_LOGINS_REQUEST 0x1 225e71d31daSStefan Richter #define SBP2_RECONNECT_REQUEST 0x3 226e71d31daSStefan Richter #define SBP2_SET_PASSWORD_REQUEST 0x4 227e71d31daSStefan Richter #define SBP2_LOGOUT_REQUEST 0x7 228e71d31daSStefan Richter #define SBP2_ABORT_TASK_REQUEST 0xb 229e71d31daSStefan Richter #define SBP2_ABORT_TASK_SET 0xc 230e71d31daSStefan Richter #define SBP2_LOGICAL_UNIT_RESET 0xe 231e71d31daSStefan Richter #define SBP2_TARGET_RESET_REQUEST 0xf 232e71d31daSStefan Richter 233e71d31daSStefan Richter /* Offsets for command block agent registers */ 234e71d31daSStefan Richter #define SBP2_AGENT_STATE 0x00 235e71d31daSStefan Richter #define SBP2_AGENT_RESET 0x04 236e71d31daSStefan Richter #define SBP2_ORB_POINTER 0x08 237e71d31daSStefan Richter #define SBP2_DOORBELL 0x10 238e71d31daSStefan Richter #define SBP2_UNSOLICITED_STATUS_ENABLE 0x14 239e71d31daSStefan Richter 240e71d31daSStefan Richter /* Status write response codes */ 241e71d31daSStefan Richter #define SBP2_STATUS_REQUEST_COMPLETE 0x0 242e71d31daSStefan Richter #define SBP2_STATUS_TRANSPORT_FAILURE 0x1 243e71d31daSStefan Richter #define SBP2_STATUS_ILLEGAL_REQUEST 0x2 244e71d31daSStefan Richter #define SBP2_STATUS_VENDOR_DEPENDENT 0x3 245e71d31daSStefan Richter 246e71d31daSStefan Richter #define STATUS_GET_ORB_HIGH(v) ((v).status & 0xffff) 247e71d31daSStefan Richter #define STATUS_GET_SBP_STATUS(v) (((v).status >> 16) & 0xff) 248e71d31daSStefan Richter #define STATUS_GET_LEN(v) (((v).status >> 24) & 0x07) 249e71d31daSStefan Richter #define STATUS_GET_DEAD(v) (((v).status >> 27) & 0x01) 250e71d31daSStefan Richter #define STATUS_GET_RESPONSE(v) (((v).status >> 28) & 0x03) 251e71d31daSStefan Richter #define STATUS_GET_SOURCE(v) (((v).status >> 30) & 0x03) 252e71d31daSStefan Richter #define STATUS_GET_ORB_LOW(v) ((v).orb_low) 253e71d31daSStefan Richter #define STATUS_GET_DATA(v) ((v).data) 254e71d31daSStefan Richter 255e71d31daSStefan Richter struct sbp2_status { 256e71d31daSStefan Richter u32 status; 257e71d31daSStefan Richter u32 orb_low; 258e71d31daSStefan Richter u8 data[24]; 259e71d31daSStefan Richter }; 260e71d31daSStefan Richter 261e71d31daSStefan Richter struct sbp2_pointer { 262e71d31daSStefan Richter __be32 high; 263e71d31daSStefan Richter __be32 low; 264e71d31daSStefan Richter }; 265e71d31daSStefan Richter 266e71d31daSStefan Richter struct sbp2_orb { 267e71d31daSStefan Richter struct fw_transaction t; 268e71d31daSStefan Richter struct kref kref; 269e71d31daSStefan Richter dma_addr_t request_bus; 270e71d31daSStefan Richter int rcode; 271e71d31daSStefan Richter struct sbp2_pointer pointer; 272e71d31daSStefan Richter void (*callback)(struct sbp2_orb * orb, struct sbp2_status * status); 273e71d31daSStefan Richter struct list_head link; 274e71d31daSStefan Richter }; 275e71d31daSStefan Richter 276e71d31daSStefan Richter #define MANAGEMENT_ORB_LUN(v) ((v)) 277e71d31daSStefan Richter #define MANAGEMENT_ORB_FUNCTION(v) ((v) << 16) 278e71d31daSStefan Richter #define MANAGEMENT_ORB_RECONNECT(v) ((v) << 20) 279e71d31daSStefan Richter #define MANAGEMENT_ORB_EXCLUSIVE(v) ((v) ? 1 << 28 : 0) 280e71d31daSStefan Richter #define MANAGEMENT_ORB_REQUEST_FORMAT(v) ((v) << 29) 281e71d31daSStefan Richter #define MANAGEMENT_ORB_NOTIFY ((1) << 31) 282e71d31daSStefan Richter 283e71d31daSStefan Richter #define MANAGEMENT_ORB_RESPONSE_LENGTH(v) ((v)) 284e71d31daSStefan Richter #define MANAGEMENT_ORB_PASSWORD_LENGTH(v) ((v) << 16) 285e71d31daSStefan Richter 286e71d31daSStefan Richter struct sbp2_management_orb { 287e71d31daSStefan Richter struct sbp2_orb base; 288e71d31daSStefan Richter struct { 289e71d31daSStefan Richter struct sbp2_pointer password; 290e71d31daSStefan Richter struct sbp2_pointer response; 291e71d31daSStefan Richter __be32 misc; 292e71d31daSStefan Richter __be32 length; 293e71d31daSStefan Richter struct sbp2_pointer status_fifo; 294e71d31daSStefan Richter } request; 295e71d31daSStefan Richter __be32 response[4]; 296e71d31daSStefan Richter dma_addr_t response_bus; 297e71d31daSStefan Richter struct completion done; 298e71d31daSStefan Richter struct sbp2_status status; 299e71d31daSStefan Richter }; 300e71d31daSStefan Richter 301e71d31daSStefan Richter struct sbp2_login_response { 302e71d31daSStefan Richter __be32 misc; 303e71d31daSStefan Richter struct sbp2_pointer command_block_agent; 304e71d31daSStefan Richter __be32 reconnect_hold; 305e71d31daSStefan Richter }; 306e71d31daSStefan Richter #define COMMAND_ORB_DATA_SIZE(v) ((v)) 307e71d31daSStefan Richter #define COMMAND_ORB_PAGE_SIZE(v) ((v) << 16) 308e71d31daSStefan Richter #define COMMAND_ORB_PAGE_TABLE_PRESENT ((1) << 19) 309e71d31daSStefan Richter #define COMMAND_ORB_MAX_PAYLOAD(v) ((v) << 20) 310e71d31daSStefan Richter #define COMMAND_ORB_SPEED(v) ((v) << 24) 311e71d31daSStefan Richter #define COMMAND_ORB_DIRECTION ((1) << 27) 312e71d31daSStefan Richter #define COMMAND_ORB_REQUEST_FORMAT(v) ((v) << 29) 313e71d31daSStefan Richter #define COMMAND_ORB_NOTIFY ((1) << 31) 314e71d31daSStefan Richter 315e71d31daSStefan Richter struct sbp2_command_orb { 316e71d31daSStefan Richter struct sbp2_orb base; 317e71d31daSStefan Richter struct { 318e71d31daSStefan Richter struct sbp2_pointer next; 319e71d31daSStefan Richter struct sbp2_pointer data_descriptor; 320e71d31daSStefan Richter __be32 misc; 321*af271941SStefan Richter u8 command_block[SBP2_MAX_CDB_SIZE]; 322e71d31daSStefan Richter } request; 323e71d31daSStefan Richter struct scsi_cmnd *cmd; 324e71d31daSStefan Richter scsi_done_fn_t done; 325e71d31daSStefan Richter struct sbp2_logical_unit *lu; 326e71d31daSStefan Richter 327e71d31daSStefan Richter struct sbp2_pointer page_table[SG_ALL] __attribute__((aligned(8))); 328e71d31daSStefan Richter dma_addr_t page_table_bus; 329e71d31daSStefan Richter }; 330e71d31daSStefan Richter 331e71d31daSStefan Richter #define SBP2_ROM_VALUE_WILDCARD ~0 /* match all */ 332e71d31daSStefan Richter #define SBP2_ROM_VALUE_MISSING 0xff000000 /* not present in the unit dir. */ 333e71d31daSStefan Richter 334e71d31daSStefan Richter /* 335e71d31daSStefan Richter * List of devices with known bugs. 336e71d31daSStefan Richter * 337e71d31daSStefan Richter * The firmware_revision field, masked with 0xffff00, is the best 338e71d31daSStefan Richter * indicator for the type of bridge chip of a device. It yields a few 339e71d31daSStefan Richter * false positives but this did not break correctly behaving devices 340e71d31daSStefan Richter * so far. 341e71d31daSStefan Richter */ 342e71d31daSStefan Richter static const struct { 343e71d31daSStefan Richter u32 firmware_revision; 344e71d31daSStefan Richter u32 model; 345e71d31daSStefan Richter unsigned int workarounds; 346e71d31daSStefan Richter } sbp2_workarounds_table[] = { 347e71d31daSStefan Richter /* DViCO Momobay CX-1 with TSB42AA9 bridge */ { 348e71d31daSStefan Richter .firmware_revision = 0x002800, 349e71d31daSStefan Richter .model = 0x001010, 350e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_INQUIRY_36 | 351e71d31daSStefan Richter SBP2_WORKAROUND_MODE_SENSE_8 | 352e71d31daSStefan Richter SBP2_WORKAROUND_POWER_CONDITION, 353e71d31daSStefan Richter }, 354e71d31daSStefan Richter /* DViCO Momobay FX-3A with TSB42AA9A bridge */ { 355e71d31daSStefan Richter .firmware_revision = 0x002800, 356e71d31daSStefan Richter .model = 0x000000, 357e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_DELAY_INQUIRY | 358e71d31daSStefan Richter SBP2_WORKAROUND_POWER_CONDITION, 359e71d31daSStefan Richter }, 360e71d31daSStefan Richter /* Initio bridges, actually only needed for some older ones */ { 361e71d31daSStefan Richter .firmware_revision = 0x000200, 362e71d31daSStefan Richter .model = SBP2_ROM_VALUE_WILDCARD, 363e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_INQUIRY_36, 364e71d31daSStefan Richter }, 365e71d31daSStefan Richter /* PL-3507 bridge with Prolific firmware */ { 366e71d31daSStefan Richter .firmware_revision = 0x012800, 367e71d31daSStefan Richter .model = SBP2_ROM_VALUE_WILDCARD, 368e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_POWER_CONDITION, 369e71d31daSStefan Richter }, 370e71d31daSStefan Richter /* Symbios bridge */ { 371e71d31daSStefan Richter .firmware_revision = 0xa0b800, 372e71d31daSStefan Richter .model = SBP2_ROM_VALUE_WILDCARD, 373e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, 374e71d31daSStefan Richter }, 375e71d31daSStefan Richter /* Datafab MD2-FW2 with Symbios/LSILogic SYM13FW500 bridge */ { 376e71d31daSStefan Richter .firmware_revision = 0x002600, 377e71d31daSStefan Richter .model = SBP2_ROM_VALUE_WILDCARD, 378e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS, 379e71d31daSStefan Richter }, 380e71d31daSStefan Richter /* 381e71d31daSStefan Richter * iPod 2nd generation: needs 128k max transfer size workaround 382e71d31daSStefan Richter * iPod 3rd generation: needs fix capacity workaround 383e71d31daSStefan Richter */ 384e71d31daSStefan Richter { 385e71d31daSStefan Richter .firmware_revision = 0x0a2700, 386e71d31daSStefan Richter .model = 0x000000, 387e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_128K_MAX_TRANS | 388e71d31daSStefan Richter SBP2_WORKAROUND_FIX_CAPACITY, 389e71d31daSStefan Richter }, 390e71d31daSStefan Richter /* iPod 4th generation */ { 391e71d31daSStefan Richter .firmware_revision = 0x0a2700, 392e71d31daSStefan Richter .model = 0x000021, 393e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, 394e71d31daSStefan Richter }, 395e71d31daSStefan Richter /* iPod mini */ { 396e71d31daSStefan Richter .firmware_revision = 0x0a2700, 397e71d31daSStefan Richter .model = 0x000022, 398e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, 399e71d31daSStefan Richter }, 400e71d31daSStefan Richter /* iPod mini */ { 401e71d31daSStefan Richter .firmware_revision = 0x0a2700, 402e71d31daSStefan Richter .model = 0x000023, 403e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, 404e71d31daSStefan Richter }, 405e71d31daSStefan Richter /* iPod Photo */ { 406e71d31daSStefan Richter .firmware_revision = 0x0a2700, 407e71d31daSStefan Richter .model = 0x00007e, 408e71d31daSStefan Richter .workarounds = SBP2_WORKAROUND_FIX_CAPACITY, 409e71d31daSStefan Richter } 410e71d31daSStefan Richter }; 411e71d31daSStefan Richter 412e71d31daSStefan Richter static void free_orb(struct kref *kref) 413e71d31daSStefan Richter { 414e71d31daSStefan Richter struct sbp2_orb *orb = container_of(kref, struct sbp2_orb, kref); 415e71d31daSStefan Richter 416e71d31daSStefan Richter kfree(orb); 417e71d31daSStefan Richter } 418e71d31daSStefan Richter 419e71d31daSStefan Richter static void sbp2_status_write(struct fw_card *card, struct fw_request *request, 420e71d31daSStefan Richter int tcode, int destination, int source, 421e71d31daSStefan Richter int generation, int speed, 422e71d31daSStefan Richter unsigned long long offset, 423e71d31daSStefan Richter void *payload, size_t length, void *callback_data) 424e71d31daSStefan Richter { 425e71d31daSStefan Richter struct sbp2_logical_unit *lu = callback_data; 426e71d31daSStefan Richter struct sbp2_orb *orb; 427e71d31daSStefan Richter struct sbp2_status status; 428e71d31daSStefan Richter size_t header_size; 429e71d31daSStefan Richter unsigned long flags; 430e71d31daSStefan Richter 431e71d31daSStefan Richter if (tcode != TCODE_WRITE_BLOCK_REQUEST || 432e71d31daSStefan Richter length == 0 || length > sizeof(status)) { 433e71d31daSStefan Richter fw_send_response(card, request, RCODE_TYPE_ERROR); 434e71d31daSStefan Richter return; 435e71d31daSStefan Richter } 436e71d31daSStefan Richter 437e71d31daSStefan Richter header_size = min(length, 2 * sizeof(u32)); 438e71d31daSStefan Richter fw_memcpy_from_be32(&status, payload, header_size); 439e71d31daSStefan Richter if (length > header_size) 440e71d31daSStefan Richter memcpy(status.data, payload + 8, length - header_size); 441e71d31daSStefan Richter if (STATUS_GET_SOURCE(status) == 2 || STATUS_GET_SOURCE(status) == 3) { 442e71d31daSStefan Richter fw_notify("non-orb related status write, not handled\n"); 443e71d31daSStefan Richter fw_send_response(card, request, RCODE_COMPLETE); 444e71d31daSStefan Richter return; 445e71d31daSStefan Richter } 446e71d31daSStefan Richter 447e71d31daSStefan Richter /* Lookup the orb corresponding to this status write. */ 448e71d31daSStefan Richter spin_lock_irqsave(&card->lock, flags); 449e71d31daSStefan Richter list_for_each_entry(orb, &lu->orb_list, link) { 450e71d31daSStefan Richter if (STATUS_GET_ORB_HIGH(status) == 0 && 451e71d31daSStefan Richter STATUS_GET_ORB_LOW(status) == orb->request_bus) { 452e71d31daSStefan Richter orb->rcode = RCODE_COMPLETE; 453e71d31daSStefan Richter list_del(&orb->link); 454e71d31daSStefan Richter break; 455e71d31daSStefan Richter } 456e71d31daSStefan Richter } 457e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 458e71d31daSStefan Richter 459e71d31daSStefan Richter if (&orb->link != &lu->orb_list) 460e71d31daSStefan Richter orb->callback(orb, &status); 461e71d31daSStefan Richter else 462e71d31daSStefan Richter fw_error("status write for unknown orb\n"); 463e71d31daSStefan Richter 464e71d31daSStefan Richter kref_put(&orb->kref, free_orb); 465e71d31daSStefan Richter 466e71d31daSStefan Richter fw_send_response(card, request, RCODE_COMPLETE); 467e71d31daSStefan Richter } 468e71d31daSStefan Richter 469e71d31daSStefan Richter static void complete_transaction(struct fw_card *card, int rcode, 470e71d31daSStefan Richter void *payload, size_t length, void *data) 471e71d31daSStefan Richter { 472e71d31daSStefan Richter struct sbp2_orb *orb = data; 473e71d31daSStefan Richter unsigned long flags; 474e71d31daSStefan Richter 475e71d31daSStefan Richter /* 476e71d31daSStefan Richter * This is a little tricky. We can get the status write for 477e71d31daSStefan Richter * the orb before we get this callback. The status write 478e71d31daSStefan Richter * handler above will assume the orb pointer transaction was 479e71d31daSStefan Richter * successful and set the rcode to RCODE_COMPLETE for the orb. 480e71d31daSStefan Richter * So this callback only sets the rcode if it hasn't already 481e71d31daSStefan Richter * been set and only does the cleanup if the transaction 482e71d31daSStefan Richter * failed and we didn't already get a status write. 483e71d31daSStefan Richter */ 484e71d31daSStefan Richter spin_lock_irqsave(&card->lock, flags); 485e71d31daSStefan Richter 486e71d31daSStefan Richter if (orb->rcode == -1) 487e71d31daSStefan Richter orb->rcode = rcode; 488e71d31daSStefan Richter if (orb->rcode != RCODE_COMPLETE) { 489e71d31daSStefan Richter list_del(&orb->link); 490e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 491e71d31daSStefan Richter orb->callback(orb, NULL); 492e71d31daSStefan Richter } else { 493e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 494e71d31daSStefan Richter } 495e71d31daSStefan Richter 496e71d31daSStefan Richter kref_put(&orb->kref, free_orb); 497e71d31daSStefan Richter } 498e71d31daSStefan Richter 499e71d31daSStefan Richter static void sbp2_send_orb(struct sbp2_orb *orb, struct sbp2_logical_unit *lu, 500e71d31daSStefan Richter int node_id, int generation, u64 offset) 501e71d31daSStefan Richter { 502e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 503e71d31daSStefan Richter unsigned long flags; 504e71d31daSStefan Richter 505e71d31daSStefan Richter orb->pointer.high = 0; 506e71d31daSStefan Richter orb->pointer.low = cpu_to_be32(orb->request_bus); 507e71d31daSStefan Richter 508e71d31daSStefan Richter spin_lock_irqsave(&device->card->lock, flags); 509e71d31daSStefan Richter list_add_tail(&orb->link, &lu->orb_list); 510e71d31daSStefan Richter spin_unlock_irqrestore(&device->card->lock, flags); 511e71d31daSStefan Richter 512e71d31daSStefan Richter /* Take a ref for the orb list and for the transaction callback. */ 513e71d31daSStefan Richter kref_get(&orb->kref); 514e71d31daSStefan Richter kref_get(&orb->kref); 515e71d31daSStefan Richter 516e71d31daSStefan Richter fw_send_request(device->card, &orb->t, TCODE_WRITE_BLOCK_REQUEST, 517e71d31daSStefan Richter node_id, generation, device->max_speed, offset, 518e71d31daSStefan Richter &orb->pointer, sizeof(orb->pointer), 519e71d31daSStefan Richter complete_transaction, orb); 520e71d31daSStefan Richter } 521e71d31daSStefan Richter 522e71d31daSStefan Richter static int sbp2_cancel_orbs(struct sbp2_logical_unit *lu) 523e71d31daSStefan Richter { 524e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 525e71d31daSStefan Richter struct sbp2_orb *orb, *next; 526e71d31daSStefan Richter struct list_head list; 527e71d31daSStefan Richter unsigned long flags; 528e71d31daSStefan Richter int retval = -ENOENT; 529e71d31daSStefan Richter 530e71d31daSStefan Richter INIT_LIST_HEAD(&list); 531e71d31daSStefan Richter spin_lock_irqsave(&device->card->lock, flags); 532e71d31daSStefan Richter list_splice_init(&lu->orb_list, &list); 533e71d31daSStefan Richter spin_unlock_irqrestore(&device->card->lock, flags); 534e71d31daSStefan Richter 535e71d31daSStefan Richter list_for_each_entry_safe(orb, next, &list, link) { 536e71d31daSStefan Richter retval = 0; 537e71d31daSStefan Richter if (fw_cancel_transaction(device->card, &orb->t) == 0) 538e71d31daSStefan Richter continue; 539e71d31daSStefan Richter 540e71d31daSStefan Richter orb->rcode = RCODE_CANCELLED; 541e71d31daSStefan Richter orb->callback(orb, NULL); 542e71d31daSStefan Richter } 543e71d31daSStefan Richter 544e71d31daSStefan Richter return retval; 545e71d31daSStefan Richter } 546e71d31daSStefan Richter 547e71d31daSStefan Richter static void complete_management_orb(struct sbp2_orb *base_orb, 548e71d31daSStefan Richter struct sbp2_status *status) 549e71d31daSStefan Richter { 550e71d31daSStefan Richter struct sbp2_management_orb *orb = 551e71d31daSStefan Richter container_of(base_orb, struct sbp2_management_orb, base); 552e71d31daSStefan Richter 553e71d31daSStefan Richter if (status) 554e71d31daSStefan Richter memcpy(&orb->status, status, sizeof(*status)); 555e71d31daSStefan Richter complete(&orb->done); 556e71d31daSStefan Richter } 557e71d31daSStefan Richter 558e71d31daSStefan Richter static int sbp2_send_management_orb(struct sbp2_logical_unit *lu, int node_id, 559e71d31daSStefan Richter int generation, int function, 560e71d31daSStefan Richter int lun_or_login_id, void *response) 561e71d31daSStefan Richter { 562e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 563e71d31daSStefan Richter struct sbp2_management_orb *orb; 564e71d31daSStefan Richter unsigned int timeout; 565e71d31daSStefan Richter int retval = -ENOMEM; 566e71d31daSStefan Richter 567e71d31daSStefan Richter if (function == SBP2_LOGOUT_REQUEST && fw_device_is_shutdown(device)) 568e71d31daSStefan Richter return 0; 569e71d31daSStefan Richter 570e71d31daSStefan Richter orb = kzalloc(sizeof(*orb), GFP_ATOMIC); 571e71d31daSStefan Richter if (orb == NULL) 572e71d31daSStefan Richter return -ENOMEM; 573e71d31daSStefan Richter 574e71d31daSStefan Richter kref_init(&orb->base.kref); 575e71d31daSStefan Richter orb->response_bus = 576e71d31daSStefan Richter dma_map_single(device->card->device, &orb->response, 577e71d31daSStefan Richter sizeof(orb->response), DMA_FROM_DEVICE); 578e71d31daSStefan Richter if (dma_mapping_error(device->card->device, orb->response_bus)) 579e71d31daSStefan Richter goto fail_mapping_response; 580e71d31daSStefan Richter 581e71d31daSStefan Richter orb->request.response.high = 0; 582e71d31daSStefan Richter orb->request.response.low = cpu_to_be32(orb->response_bus); 583e71d31daSStefan Richter 584e71d31daSStefan Richter orb->request.misc = cpu_to_be32( 585e71d31daSStefan Richter MANAGEMENT_ORB_NOTIFY | 586e71d31daSStefan Richter MANAGEMENT_ORB_FUNCTION(function) | 587e71d31daSStefan Richter MANAGEMENT_ORB_LUN(lun_or_login_id)); 588e71d31daSStefan Richter orb->request.length = cpu_to_be32( 589e71d31daSStefan Richter MANAGEMENT_ORB_RESPONSE_LENGTH(sizeof(orb->response))); 590e71d31daSStefan Richter 591e71d31daSStefan Richter orb->request.status_fifo.high = 592e71d31daSStefan Richter cpu_to_be32(lu->address_handler.offset >> 32); 593e71d31daSStefan Richter orb->request.status_fifo.low = 594e71d31daSStefan Richter cpu_to_be32(lu->address_handler.offset); 595e71d31daSStefan Richter 596e71d31daSStefan Richter if (function == SBP2_LOGIN_REQUEST) { 597e71d31daSStefan Richter /* Ask for 2^2 == 4 seconds reconnect grace period */ 598e71d31daSStefan Richter orb->request.misc |= cpu_to_be32( 599e71d31daSStefan Richter MANAGEMENT_ORB_RECONNECT(2) | 600e71d31daSStefan Richter MANAGEMENT_ORB_EXCLUSIVE(sbp2_param_exclusive_login)); 601e71d31daSStefan Richter timeout = lu->tgt->mgt_orb_timeout; 602e71d31daSStefan Richter } else { 603e71d31daSStefan Richter timeout = SBP2_ORB_TIMEOUT; 604e71d31daSStefan Richter } 605e71d31daSStefan Richter 606e71d31daSStefan Richter init_completion(&orb->done); 607e71d31daSStefan Richter orb->base.callback = complete_management_orb; 608e71d31daSStefan Richter 609e71d31daSStefan Richter orb->base.request_bus = 610e71d31daSStefan Richter dma_map_single(device->card->device, &orb->request, 611e71d31daSStefan Richter sizeof(orb->request), DMA_TO_DEVICE); 612e71d31daSStefan Richter if (dma_mapping_error(device->card->device, orb->base.request_bus)) 613e71d31daSStefan Richter goto fail_mapping_request; 614e71d31daSStefan Richter 615e71d31daSStefan Richter sbp2_send_orb(&orb->base, lu, node_id, generation, 616e71d31daSStefan Richter lu->tgt->management_agent_address); 617e71d31daSStefan Richter 618e71d31daSStefan Richter wait_for_completion_timeout(&orb->done, msecs_to_jiffies(timeout)); 619e71d31daSStefan Richter 620e71d31daSStefan Richter retval = -EIO; 621e71d31daSStefan Richter if (sbp2_cancel_orbs(lu) == 0) { 622e71d31daSStefan Richter fw_error("%s: orb reply timed out, rcode=0x%02x\n", 623e71d31daSStefan Richter lu->tgt->bus_id, orb->base.rcode); 624e71d31daSStefan Richter goto out; 625e71d31daSStefan Richter } 626e71d31daSStefan Richter 627e71d31daSStefan Richter if (orb->base.rcode != RCODE_COMPLETE) { 628e71d31daSStefan Richter fw_error("%s: management write failed, rcode 0x%02x\n", 629e71d31daSStefan Richter lu->tgt->bus_id, orb->base.rcode); 630e71d31daSStefan Richter goto out; 631e71d31daSStefan Richter } 632e71d31daSStefan Richter 633e71d31daSStefan Richter if (STATUS_GET_RESPONSE(orb->status) != 0 || 634e71d31daSStefan Richter STATUS_GET_SBP_STATUS(orb->status) != 0) { 635e71d31daSStefan Richter fw_error("%s: error status: %d:%d\n", lu->tgt->bus_id, 636e71d31daSStefan Richter STATUS_GET_RESPONSE(orb->status), 637e71d31daSStefan Richter STATUS_GET_SBP_STATUS(orb->status)); 638e71d31daSStefan Richter goto out; 639e71d31daSStefan Richter } 640e71d31daSStefan Richter 641e71d31daSStefan Richter retval = 0; 642e71d31daSStefan Richter out: 643e71d31daSStefan Richter dma_unmap_single(device->card->device, orb->base.request_bus, 644e71d31daSStefan Richter sizeof(orb->request), DMA_TO_DEVICE); 645e71d31daSStefan Richter fail_mapping_request: 646e71d31daSStefan Richter dma_unmap_single(device->card->device, orb->response_bus, 647e71d31daSStefan Richter sizeof(orb->response), DMA_FROM_DEVICE); 648e71d31daSStefan Richter fail_mapping_response: 649e71d31daSStefan Richter if (response) 650e71d31daSStefan Richter memcpy(response, orb->response, sizeof(orb->response)); 651e71d31daSStefan Richter kref_put(&orb->base.kref, free_orb); 652e71d31daSStefan Richter 653e71d31daSStefan Richter return retval; 654e71d31daSStefan Richter } 655e71d31daSStefan Richter 656e71d31daSStefan Richter static void sbp2_agent_reset(struct sbp2_logical_unit *lu) 657e71d31daSStefan Richter { 658e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 659e71d31daSStefan Richter __be32 d = 0; 660e71d31daSStefan Richter 661e71d31daSStefan Richter fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, 662e71d31daSStefan Richter lu->tgt->node_id, lu->generation, device->max_speed, 663e71d31daSStefan Richter lu->command_block_agent_address + SBP2_AGENT_RESET, 664e71d31daSStefan Richter &d, sizeof(d)); 665e71d31daSStefan Richter } 666e71d31daSStefan Richter 667e71d31daSStefan Richter static void complete_agent_reset_write_no_wait(struct fw_card *card, 668e71d31daSStefan Richter int rcode, void *payload, size_t length, void *data) 669e71d31daSStefan Richter { 670e71d31daSStefan Richter kfree(data); 671e71d31daSStefan Richter } 672e71d31daSStefan Richter 673e71d31daSStefan Richter static void sbp2_agent_reset_no_wait(struct sbp2_logical_unit *lu) 674e71d31daSStefan Richter { 675e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 676e71d31daSStefan Richter struct fw_transaction *t; 677e71d31daSStefan Richter static __be32 d; 678e71d31daSStefan Richter 679e71d31daSStefan Richter t = kmalloc(sizeof(*t), GFP_ATOMIC); 680e71d31daSStefan Richter if (t == NULL) 681e71d31daSStefan Richter return; 682e71d31daSStefan Richter 683e71d31daSStefan Richter fw_send_request(device->card, t, TCODE_WRITE_QUADLET_REQUEST, 684e71d31daSStefan Richter lu->tgt->node_id, lu->generation, device->max_speed, 685e71d31daSStefan Richter lu->command_block_agent_address + SBP2_AGENT_RESET, 686e71d31daSStefan Richter &d, sizeof(d), complete_agent_reset_write_no_wait, t); 687e71d31daSStefan Richter } 688e71d31daSStefan Richter 689e71d31daSStefan Richter static inline void sbp2_allow_block(struct sbp2_logical_unit *lu) 690e71d31daSStefan Richter { 691e71d31daSStefan Richter /* 692e71d31daSStefan Richter * We may access dont_block without taking card->lock here: 693e71d31daSStefan Richter * All callers of sbp2_allow_block() and all callers of sbp2_unblock() 694e71d31daSStefan Richter * are currently serialized against each other. 695e71d31daSStefan Richter * And a wrong result in sbp2_conditionally_block()'s access of 696e71d31daSStefan Richter * dont_block is rather harmless, it simply misses its first chance. 697e71d31daSStefan Richter */ 698e71d31daSStefan Richter --lu->tgt->dont_block; 699e71d31daSStefan Richter } 700e71d31daSStefan Richter 701e71d31daSStefan Richter /* 702e71d31daSStefan Richter * Blocks lu->tgt if all of the following conditions are met: 703e71d31daSStefan Richter * - Login, INQUIRY, and high-level SCSI setup of all of the target's 704e71d31daSStefan Richter * logical units have been finished (indicated by dont_block == 0). 705e71d31daSStefan Richter * - lu->generation is stale. 706e71d31daSStefan Richter * 707e71d31daSStefan Richter * Note, scsi_block_requests() must be called while holding card->lock, 708e71d31daSStefan Richter * otherwise it might foil sbp2_[conditionally_]unblock()'s attempt to 709e71d31daSStefan Richter * unblock the target. 710e71d31daSStefan Richter */ 711e71d31daSStefan Richter static void sbp2_conditionally_block(struct sbp2_logical_unit *lu) 712e71d31daSStefan Richter { 713e71d31daSStefan Richter struct sbp2_target *tgt = lu->tgt; 714e5110d01SStefan Richter struct fw_card *card = target_device(tgt)->card; 715e71d31daSStefan Richter struct Scsi_Host *shost = 716e71d31daSStefan Richter container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 717e71d31daSStefan Richter unsigned long flags; 718e71d31daSStefan Richter 719e71d31daSStefan Richter spin_lock_irqsave(&card->lock, flags); 720e71d31daSStefan Richter if (!tgt->dont_block && !lu->blocked && 721e71d31daSStefan Richter lu->generation != card->generation) { 722e71d31daSStefan Richter lu->blocked = true; 723e71d31daSStefan Richter if (++tgt->blocked == 1) 724e71d31daSStefan Richter scsi_block_requests(shost); 725e71d31daSStefan Richter } 726e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 727e71d31daSStefan Richter } 728e71d31daSStefan Richter 729e71d31daSStefan Richter /* 730e71d31daSStefan Richter * Unblocks lu->tgt as soon as all its logical units can be unblocked. 731e71d31daSStefan Richter * Note, it is harmless to run scsi_unblock_requests() outside the 732e71d31daSStefan Richter * card->lock protected section. On the other hand, running it inside 733e71d31daSStefan Richter * the section might clash with shost->host_lock. 734e71d31daSStefan Richter */ 735e71d31daSStefan Richter static void sbp2_conditionally_unblock(struct sbp2_logical_unit *lu) 736e71d31daSStefan Richter { 737e71d31daSStefan Richter struct sbp2_target *tgt = lu->tgt; 738e5110d01SStefan Richter struct fw_card *card = target_device(tgt)->card; 739e71d31daSStefan Richter struct Scsi_Host *shost = 740e71d31daSStefan Richter container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 741e71d31daSStefan Richter unsigned long flags; 742e71d31daSStefan Richter bool unblock = false; 743e71d31daSStefan Richter 744e71d31daSStefan Richter spin_lock_irqsave(&card->lock, flags); 745e71d31daSStefan Richter if (lu->blocked && lu->generation == card->generation) { 746e71d31daSStefan Richter lu->blocked = false; 747e71d31daSStefan Richter unblock = --tgt->blocked == 0; 748e71d31daSStefan Richter } 749e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 750e71d31daSStefan Richter 751e71d31daSStefan Richter if (unblock) 752e71d31daSStefan Richter scsi_unblock_requests(shost); 753e71d31daSStefan Richter } 754e71d31daSStefan Richter 755e71d31daSStefan Richter /* 756e71d31daSStefan Richter * Prevents future blocking of tgt and unblocks it. 757e71d31daSStefan Richter * Note, it is harmless to run scsi_unblock_requests() outside the 758e71d31daSStefan Richter * card->lock protected section. On the other hand, running it inside 759e71d31daSStefan Richter * the section might clash with shost->host_lock. 760e71d31daSStefan Richter */ 761e71d31daSStefan Richter static void sbp2_unblock(struct sbp2_target *tgt) 762e71d31daSStefan Richter { 763e5110d01SStefan Richter struct fw_card *card = target_device(tgt)->card; 764e71d31daSStefan Richter struct Scsi_Host *shost = 765e71d31daSStefan Richter container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 766e71d31daSStefan Richter unsigned long flags; 767e71d31daSStefan Richter 768e71d31daSStefan Richter spin_lock_irqsave(&card->lock, flags); 769e71d31daSStefan Richter ++tgt->dont_block; 770e71d31daSStefan Richter spin_unlock_irqrestore(&card->lock, flags); 771e71d31daSStefan Richter 772e71d31daSStefan Richter scsi_unblock_requests(shost); 773e71d31daSStefan Richter } 774e71d31daSStefan Richter 775e71d31daSStefan Richter static int sbp2_lun2int(u16 lun) 776e71d31daSStefan Richter { 777e71d31daSStefan Richter struct scsi_lun eight_bytes_lun; 778e71d31daSStefan Richter 779e71d31daSStefan Richter memset(&eight_bytes_lun, 0, sizeof(eight_bytes_lun)); 780e71d31daSStefan Richter eight_bytes_lun.scsi_lun[0] = (lun >> 8) & 0xff; 781e71d31daSStefan Richter eight_bytes_lun.scsi_lun[1] = lun & 0xff; 782e71d31daSStefan Richter 783e71d31daSStefan Richter return scsilun_to_int(&eight_bytes_lun); 784e71d31daSStefan Richter } 785e71d31daSStefan Richter 786e71d31daSStefan Richter static void sbp2_release_target(struct kref *kref) 787e71d31daSStefan Richter { 788e71d31daSStefan Richter struct sbp2_target *tgt = container_of(kref, struct sbp2_target, kref); 789e71d31daSStefan Richter struct sbp2_logical_unit *lu, *next; 790e71d31daSStefan Richter struct Scsi_Host *shost = 791e71d31daSStefan Richter container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 792e71d31daSStefan Richter struct scsi_device *sdev; 793e5110d01SStefan Richter struct fw_device *device = target_device(tgt); 794e71d31daSStefan Richter 795e71d31daSStefan Richter /* prevent deadlocks */ 796e71d31daSStefan Richter sbp2_unblock(tgt); 797e71d31daSStefan Richter 798e71d31daSStefan Richter list_for_each_entry_safe(lu, next, &tgt->lu_list, link) { 799e71d31daSStefan Richter sdev = scsi_device_lookup(shost, 0, 0, sbp2_lun2int(lu->lun)); 800e71d31daSStefan Richter if (sdev) { 801e71d31daSStefan Richter scsi_remove_device(sdev); 802e71d31daSStefan Richter scsi_device_put(sdev); 803e71d31daSStefan Richter } 804e71d31daSStefan Richter if (lu->login_id != INVALID_LOGIN_ID) { 805e71d31daSStefan Richter int generation, node_id; 806e71d31daSStefan Richter /* 807e71d31daSStefan Richter * tgt->node_id may be obsolete here if we failed 808e71d31daSStefan Richter * during initial login or after a bus reset where 809e71d31daSStefan Richter * the topology changed. 810e71d31daSStefan Richter */ 811e71d31daSStefan Richter generation = device->generation; 812e71d31daSStefan Richter smp_rmb(); /* node_id vs. generation */ 813e71d31daSStefan Richter node_id = device->node_id; 814e71d31daSStefan Richter sbp2_send_management_orb(lu, node_id, generation, 815e71d31daSStefan Richter SBP2_LOGOUT_REQUEST, 816e71d31daSStefan Richter lu->login_id, NULL); 817e71d31daSStefan Richter } 818e71d31daSStefan Richter fw_core_remove_address_handler(&lu->address_handler); 819e71d31daSStefan Richter list_del(&lu->link); 820e71d31daSStefan Richter kfree(lu); 821e71d31daSStefan Richter } 822e71d31daSStefan Richter scsi_remove_host(shost); 823e71d31daSStefan Richter fw_notify("released %s, target %d:0:0\n", tgt->bus_id, shost->host_no); 824e71d31daSStefan Richter 825e71d31daSStefan Richter fw_unit_put(tgt->unit); 826e71d31daSStefan Richter scsi_host_put(shost); 827e71d31daSStefan Richter fw_device_put(device); 828e71d31daSStefan Richter } 829e71d31daSStefan Richter 830e71d31daSStefan Richter static struct workqueue_struct *sbp2_wq; 831e71d31daSStefan Richter 832e71d31daSStefan Richter static void sbp2_target_put(struct sbp2_target *tgt) 833e71d31daSStefan Richter { 834e71d31daSStefan Richter kref_put(&tgt->kref, sbp2_release_target); 835e71d31daSStefan Richter } 836e71d31daSStefan Richter 837e71d31daSStefan Richter /* 838e71d31daSStefan Richter * Always get the target's kref when scheduling work on one its units. 839e71d31daSStefan Richter * Each workqueue job is responsible to call sbp2_target_put() upon return. 840e71d31daSStefan Richter */ 841e71d31daSStefan Richter static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay) 842e71d31daSStefan Richter { 843e71d31daSStefan Richter kref_get(&lu->tgt->kref); 844e71d31daSStefan Richter if (!queue_delayed_work(sbp2_wq, &lu->work, delay)) 845e71d31daSStefan Richter sbp2_target_put(lu->tgt); 846e71d31daSStefan Richter } 847e71d31daSStefan Richter 848e71d31daSStefan Richter /* 849e71d31daSStefan Richter * Write retransmit retry values into the BUSY_TIMEOUT register. 850e71d31daSStefan Richter * - The single-phase retry protocol is supported by all SBP-2 devices, but the 851e71d31daSStefan Richter * default retry_limit value is 0 (i.e. never retry transmission). We write a 852e71d31daSStefan Richter * saner value after logging into the device. 853e71d31daSStefan Richter * - The dual-phase retry protocol is optional to implement, and if not 854e71d31daSStefan Richter * supported, writes to the dual-phase portion of the register will be 855e71d31daSStefan Richter * ignored. We try to write the original 1394-1995 default here. 856e71d31daSStefan Richter * - In the case of devices that are also SBP-3-compliant, all writes are 857e71d31daSStefan Richter * ignored, as the register is read-only, but contains single-phase retry of 858e71d31daSStefan Richter * 15, which is what we're trying to set for all SBP-2 device anyway, so this 859e71d31daSStefan Richter * write attempt is safe and yields more consistent behavior for all devices. 860e71d31daSStefan Richter * 861e71d31daSStefan Richter * See section 8.3.2.3.5 of the 1394-1995 spec, section 6.2 of the SBP-2 spec, 862e71d31daSStefan Richter * and section 6.4 of the SBP-3 spec for further details. 863e71d31daSStefan Richter */ 864e71d31daSStefan Richter static void sbp2_set_busy_timeout(struct sbp2_logical_unit *lu) 865e71d31daSStefan Richter { 866e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 867e71d31daSStefan Richter __be32 d = cpu_to_be32(SBP2_CYCLE_LIMIT | SBP2_RETRY_LIMIT); 868e71d31daSStefan Richter 869e71d31daSStefan Richter fw_run_transaction(device->card, TCODE_WRITE_QUADLET_REQUEST, 870e71d31daSStefan Richter lu->tgt->node_id, lu->generation, device->max_speed, 871e71d31daSStefan Richter CSR_REGISTER_BASE + CSR_BUSY_TIMEOUT, 872e71d31daSStefan Richter &d, sizeof(d)); 873e71d31daSStefan Richter } 874e71d31daSStefan Richter 875e71d31daSStefan Richter static void sbp2_reconnect(struct work_struct *work); 876e71d31daSStefan Richter 877e71d31daSStefan Richter static void sbp2_login(struct work_struct *work) 878e71d31daSStefan Richter { 879e71d31daSStefan Richter struct sbp2_logical_unit *lu = 880e71d31daSStefan Richter container_of(work, struct sbp2_logical_unit, work.work); 881e71d31daSStefan Richter struct sbp2_target *tgt = lu->tgt; 882e5110d01SStefan Richter struct fw_device *device = target_device(tgt); 883e71d31daSStefan Richter struct Scsi_Host *shost; 884e71d31daSStefan Richter struct scsi_device *sdev; 885e71d31daSStefan Richter struct sbp2_login_response response; 886e71d31daSStefan Richter int generation, node_id, local_node_id; 887e71d31daSStefan Richter 888e71d31daSStefan Richter if (fw_device_is_shutdown(device)) 889e71d31daSStefan Richter goto out; 890e71d31daSStefan Richter 891e71d31daSStefan Richter generation = device->generation; 892e71d31daSStefan Richter smp_rmb(); /* node IDs must not be older than generation */ 893e71d31daSStefan Richter node_id = device->node_id; 894e71d31daSStefan Richter local_node_id = device->card->node_id; 895e71d31daSStefan Richter 896e71d31daSStefan Richter /* If this is a re-login attempt, log out, or we might be rejected. */ 897e71d31daSStefan Richter if (lu->has_sdev) 898e71d31daSStefan Richter sbp2_send_management_orb(lu, device->node_id, generation, 899e71d31daSStefan Richter SBP2_LOGOUT_REQUEST, lu->login_id, NULL); 900e71d31daSStefan Richter 901e71d31daSStefan Richter if (sbp2_send_management_orb(lu, node_id, generation, 902e71d31daSStefan Richter SBP2_LOGIN_REQUEST, lu->lun, &response) < 0) { 903e71d31daSStefan Richter if (lu->retries++ < 5) { 904e71d31daSStefan Richter sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); 905e71d31daSStefan Richter } else { 906e71d31daSStefan Richter fw_error("%s: failed to login to LUN %04x\n", 907e71d31daSStefan Richter tgt->bus_id, lu->lun); 908e71d31daSStefan Richter /* Let any waiting I/O fail from now on. */ 909e71d31daSStefan Richter sbp2_unblock(lu->tgt); 910e71d31daSStefan Richter } 911e71d31daSStefan Richter goto out; 912e71d31daSStefan Richter } 913e71d31daSStefan Richter 914e71d31daSStefan Richter tgt->node_id = node_id; 915e71d31daSStefan Richter tgt->address_high = local_node_id << 16; 916e71d31daSStefan Richter smp_wmb(); /* node IDs must not be older than generation */ 917e71d31daSStefan Richter lu->generation = generation; 918e71d31daSStefan Richter 919e71d31daSStefan Richter lu->command_block_agent_address = 920e71d31daSStefan Richter ((u64)(be32_to_cpu(response.command_block_agent.high) & 0xffff) 921e71d31daSStefan Richter << 32) | be32_to_cpu(response.command_block_agent.low); 922e71d31daSStefan Richter lu->login_id = be32_to_cpu(response.misc) & 0xffff; 923e71d31daSStefan Richter 924e71d31daSStefan Richter fw_notify("%s: logged in to LUN %04x (%d retries)\n", 925e71d31daSStefan Richter tgt->bus_id, lu->lun, lu->retries); 926e71d31daSStefan Richter 927e71d31daSStefan Richter /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ 928e71d31daSStefan Richter sbp2_set_busy_timeout(lu); 929e71d31daSStefan Richter 930e71d31daSStefan Richter PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); 931e71d31daSStefan Richter sbp2_agent_reset(lu); 932e71d31daSStefan Richter 933e71d31daSStefan Richter /* This was a re-login. */ 934e71d31daSStefan Richter if (lu->has_sdev) { 935e71d31daSStefan Richter sbp2_cancel_orbs(lu); 936e71d31daSStefan Richter sbp2_conditionally_unblock(lu); 937e71d31daSStefan Richter goto out; 938e71d31daSStefan Richter } 939e71d31daSStefan Richter 940e71d31daSStefan Richter if (lu->tgt->workarounds & SBP2_WORKAROUND_DELAY_INQUIRY) 941e71d31daSStefan Richter ssleep(SBP2_INQUIRY_DELAY); 942e71d31daSStefan Richter 943e71d31daSStefan Richter shost = container_of((void *)tgt, struct Scsi_Host, hostdata[0]); 944e71d31daSStefan Richter sdev = __scsi_add_device(shost, 0, 0, sbp2_lun2int(lu->lun), lu); 945e71d31daSStefan Richter /* 946e71d31daSStefan Richter * FIXME: We are unable to perform reconnects while in sbp2_login(). 947e71d31daSStefan Richter * Therefore __scsi_add_device() will get into trouble if a bus reset 948e71d31daSStefan Richter * happens in parallel. It will either fail or leave us with an 949e71d31daSStefan Richter * unusable sdev. As a workaround we check for this and retry the 950e71d31daSStefan Richter * whole login and SCSI probing. 951e71d31daSStefan Richter */ 952e71d31daSStefan Richter 953e71d31daSStefan Richter /* Reported error during __scsi_add_device() */ 954e71d31daSStefan Richter if (IS_ERR(sdev)) 955e71d31daSStefan Richter goto out_logout_login; 956e71d31daSStefan Richter 957e71d31daSStefan Richter /* Unreported error during __scsi_add_device() */ 958e71d31daSStefan Richter smp_rmb(); /* get current card generation */ 959e71d31daSStefan Richter if (generation != device->card->generation) { 960e71d31daSStefan Richter scsi_remove_device(sdev); 961e71d31daSStefan Richter scsi_device_put(sdev); 962e71d31daSStefan Richter goto out_logout_login; 963e71d31daSStefan Richter } 964e71d31daSStefan Richter 965e71d31daSStefan Richter /* No error during __scsi_add_device() */ 966e71d31daSStefan Richter lu->has_sdev = true; 967e71d31daSStefan Richter scsi_device_put(sdev); 968e71d31daSStefan Richter sbp2_allow_block(lu); 969e71d31daSStefan Richter goto out; 970e71d31daSStefan Richter 971e71d31daSStefan Richter out_logout_login: 972e71d31daSStefan Richter smp_rmb(); /* generation may have changed */ 973e71d31daSStefan Richter generation = device->generation; 974e71d31daSStefan Richter smp_rmb(); /* node_id must not be older than generation */ 975e71d31daSStefan Richter 976e71d31daSStefan Richter sbp2_send_management_orb(lu, device->node_id, generation, 977e71d31daSStefan Richter SBP2_LOGOUT_REQUEST, lu->login_id, NULL); 978e71d31daSStefan Richter /* 979e71d31daSStefan Richter * If a bus reset happened, sbp2_update will have requeued 980e71d31daSStefan Richter * lu->work already. Reset the work from reconnect to login. 981e71d31daSStefan Richter */ 982e71d31daSStefan Richter PREPARE_DELAYED_WORK(&lu->work, sbp2_login); 983e71d31daSStefan Richter out: 984e71d31daSStefan Richter sbp2_target_put(tgt); 985e71d31daSStefan Richter } 986e71d31daSStefan Richter 987e71d31daSStefan Richter static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) 988e71d31daSStefan Richter { 989e71d31daSStefan Richter struct sbp2_logical_unit *lu; 990e71d31daSStefan Richter 991e71d31daSStefan Richter lu = kmalloc(sizeof(*lu), GFP_KERNEL); 992e71d31daSStefan Richter if (!lu) 993e71d31daSStefan Richter return -ENOMEM; 994e71d31daSStefan Richter 995e71d31daSStefan Richter lu->address_handler.length = 0x100; 996e71d31daSStefan Richter lu->address_handler.address_callback = sbp2_status_write; 997e71d31daSStefan Richter lu->address_handler.callback_data = lu; 998e71d31daSStefan Richter 999e71d31daSStefan Richter if (fw_core_add_address_handler(&lu->address_handler, 1000e71d31daSStefan Richter &fw_high_memory_region) < 0) { 1001e71d31daSStefan Richter kfree(lu); 1002e71d31daSStefan Richter return -ENOMEM; 1003e71d31daSStefan Richter } 1004e71d31daSStefan Richter 1005e71d31daSStefan Richter lu->tgt = tgt; 1006e71d31daSStefan Richter lu->lun = lun_entry & 0xffff; 1007e71d31daSStefan Richter lu->login_id = INVALID_LOGIN_ID; 1008e71d31daSStefan Richter lu->retries = 0; 1009e71d31daSStefan Richter lu->has_sdev = false; 1010e71d31daSStefan Richter lu->blocked = false; 1011e71d31daSStefan Richter ++tgt->dont_block; 1012e71d31daSStefan Richter INIT_LIST_HEAD(&lu->orb_list); 1013e71d31daSStefan Richter INIT_DELAYED_WORK(&lu->work, sbp2_login); 1014e71d31daSStefan Richter 1015e71d31daSStefan Richter list_add_tail(&lu->link, &tgt->lu_list); 1016e71d31daSStefan Richter return 0; 1017e71d31daSStefan Richter } 1018e71d31daSStefan Richter 1019e71d31daSStefan Richter static int sbp2_scan_logical_unit_dir(struct sbp2_target *tgt, u32 *directory) 1020e71d31daSStefan Richter { 1021e71d31daSStefan Richter struct fw_csr_iterator ci; 1022e71d31daSStefan Richter int key, value; 1023e71d31daSStefan Richter 1024e71d31daSStefan Richter fw_csr_iterator_init(&ci, directory); 1025e71d31daSStefan Richter while (fw_csr_iterator_next(&ci, &key, &value)) 1026e71d31daSStefan Richter if (key == SBP2_CSR_LOGICAL_UNIT_NUMBER && 1027e71d31daSStefan Richter sbp2_add_logical_unit(tgt, value) < 0) 1028e71d31daSStefan Richter return -ENOMEM; 1029e71d31daSStefan Richter return 0; 1030e71d31daSStefan Richter } 1031e71d31daSStefan Richter 1032e71d31daSStefan Richter static int sbp2_scan_unit_dir(struct sbp2_target *tgt, u32 *directory, 1033e71d31daSStefan Richter u32 *model, u32 *firmware_revision) 1034e71d31daSStefan Richter { 1035e71d31daSStefan Richter struct fw_csr_iterator ci; 1036e71d31daSStefan Richter int key, value; 1037e71d31daSStefan Richter unsigned int timeout; 1038e71d31daSStefan Richter 1039e71d31daSStefan Richter fw_csr_iterator_init(&ci, directory); 1040e71d31daSStefan Richter while (fw_csr_iterator_next(&ci, &key, &value)) { 1041e71d31daSStefan Richter switch (key) { 1042e71d31daSStefan Richter 1043e71d31daSStefan Richter case CSR_DEPENDENT_INFO | CSR_OFFSET: 1044e71d31daSStefan Richter tgt->management_agent_address = 1045e71d31daSStefan Richter CSR_REGISTER_BASE + 4 * value; 1046e71d31daSStefan Richter break; 1047e71d31daSStefan Richter 1048e71d31daSStefan Richter case CSR_DIRECTORY_ID: 1049e71d31daSStefan Richter tgt->directory_id = value; 1050e71d31daSStefan Richter break; 1051e71d31daSStefan Richter 1052e71d31daSStefan Richter case CSR_MODEL: 1053e71d31daSStefan Richter *model = value; 1054e71d31daSStefan Richter break; 1055e71d31daSStefan Richter 1056e71d31daSStefan Richter case SBP2_CSR_FIRMWARE_REVISION: 1057e71d31daSStefan Richter *firmware_revision = value; 1058e71d31daSStefan Richter break; 1059e71d31daSStefan Richter 1060e71d31daSStefan Richter case SBP2_CSR_UNIT_CHARACTERISTICS: 1061e71d31daSStefan Richter /* the timeout value is stored in 500ms units */ 1062e71d31daSStefan Richter timeout = ((unsigned int) value >> 8 & 0xff) * 500; 1063e71d31daSStefan Richter timeout = max(timeout, SBP2_MIN_LOGIN_ORB_TIMEOUT); 1064e71d31daSStefan Richter tgt->mgt_orb_timeout = 1065e71d31daSStefan Richter min(timeout, SBP2_MAX_LOGIN_ORB_TIMEOUT); 1066e71d31daSStefan Richter 1067e71d31daSStefan Richter if (timeout > tgt->mgt_orb_timeout) 1068e71d31daSStefan Richter fw_notify("%s: config rom contains %ds " 1069e71d31daSStefan Richter "management ORB timeout, limiting " 1070e71d31daSStefan Richter "to %ds\n", tgt->bus_id, 1071e71d31daSStefan Richter timeout / 1000, 1072e71d31daSStefan Richter tgt->mgt_orb_timeout / 1000); 1073e71d31daSStefan Richter break; 1074e71d31daSStefan Richter 1075e71d31daSStefan Richter case SBP2_CSR_LOGICAL_UNIT_NUMBER: 1076e71d31daSStefan Richter if (sbp2_add_logical_unit(tgt, value) < 0) 1077e71d31daSStefan Richter return -ENOMEM; 1078e71d31daSStefan Richter break; 1079e71d31daSStefan Richter 1080e71d31daSStefan Richter case SBP2_CSR_LOGICAL_UNIT_DIRECTORY: 1081e71d31daSStefan Richter /* Adjust for the increment in the iterator */ 1082e71d31daSStefan Richter if (sbp2_scan_logical_unit_dir(tgt, ci.p - 1 + value) < 0) 1083e71d31daSStefan Richter return -ENOMEM; 1084e71d31daSStefan Richter break; 1085e71d31daSStefan Richter } 1086e71d31daSStefan Richter } 1087e71d31daSStefan Richter return 0; 1088e71d31daSStefan Richter } 1089e71d31daSStefan Richter 1090e71d31daSStefan Richter static void sbp2_init_workarounds(struct sbp2_target *tgt, u32 model, 1091e71d31daSStefan Richter u32 firmware_revision) 1092e71d31daSStefan Richter { 1093e71d31daSStefan Richter int i; 1094e71d31daSStefan Richter unsigned int w = sbp2_param_workarounds; 1095e71d31daSStefan Richter 1096e71d31daSStefan Richter if (w) 1097e71d31daSStefan Richter fw_notify("Please notify linux1394-devel@lists.sourceforge.net " 1098e71d31daSStefan Richter "if you need the workarounds parameter for %s\n", 1099e71d31daSStefan Richter tgt->bus_id); 1100e71d31daSStefan Richter 1101e71d31daSStefan Richter if (w & SBP2_WORKAROUND_OVERRIDE) 1102e71d31daSStefan Richter goto out; 1103e71d31daSStefan Richter 1104e71d31daSStefan Richter for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) { 1105e71d31daSStefan Richter 1106e71d31daSStefan Richter if (sbp2_workarounds_table[i].firmware_revision != 1107e71d31daSStefan Richter (firmware_revision & 0xffffff00)) 1108e71d31daSStefan Richter continue; 1109e71d31daSStefan Richter 1110e71d31daSStefan Richter if (sbp2_workarounds_table[i].model != model && 1111e71d31daSStefan Richter sbp2_workarounds_table[i].model != SBP2_ROM_VALUE_WILDCARD) 1112e71d31daSStefan Richter continue; 1113e71d31daSStefan Richter 1114e71d31daSStefan Richter w |= sbp2_workarounds_table[i].workarounds; 1115e71d31daSStefan Richter break; 1116e71d31daSStefan Richter } 1117e71d31daSStefan Richter out: 1118e71d31daSStefan Richter if (w) 1119e71d31daSStefan Richter fw_notify("Workarounds for %s: 0x%x " 1120e71d31daSStefan Richter "(firmware_revision 0x%06x, model_id 0x%06x)\n", 1121e71d31daSStefan Richter tgt->bus_id, w, firmware_revision, model); 1122e71d31daSStefan Richter tgt->workarounds = w; 1123e71d31daSStefan Richter } 1124e71d31daSStefan Richter 1125e71d31daSStefan Richter static struct scsi_host_template scsi_driver_template; 1126e71d31daSStefan Richter 1127e71d31daSStefan Richter static int sbp2_probe(struct device *dev) 1128e71d31daSStefan Richter { 1129e71d31daSStefan Richter struct fw_unit *unit = fw_unit(dev); 1130e5110d01SStefan Richter struct fw_device *device = fw_parent_device(unit); 1131e71d31daSStefan Richter struct sbp2_target *tgt; 1132e71d31daSStefan Richter struct sbp2_logical_unit *lu; 1133e71d31daSStefan Richter struct Scsi_Host *shost; 1134e71d31daSStefan Richter u32 model, firmware_revision; 1135e71d31daSStefan Richter 1136e71d31daSStefan Richter if (dma_get_max_seg_size(device->card->device) > SBP2_MAX_SEG_SIZE) 1137e71d31daSStefan Richter BUG_ON(dma_set_max_seg_size(device->card->device, 1138e71d31daSStefan Richter SBP2_MAX_SEG_SIZE)); 1139e71d31daSStefan Richter 1140e71d31daSStefan Richter shost = scsi_host_alloc(&scsi_driver_template, sizeof(*tgt)); 1141e71d31daSStefan Richter if (shost == NULL) 1142e71d31daSStefan Richter return -ENOMEM; 1143e71d31daSStefan Richter 1144e71d31daSStefan Richter tgt = (struct sbp2_target *)shost->hostdata; 1145e71d31daSStefan Richter unit->device.driver_data = tgt; 1146e71d31daSStefan Richter tgt->unit = unit; 1147e71d31daSStefan Richter kref_init(&tgt->kref); 1148e71d31daSStefan Richter INIT_LIST_HEAD(&tgt->lu_list); 1149e71d31daSStefan Richter tgt->bus_id = dev_name(&unit->device); 1150e71d31daSStefan Richter tgt->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4]; 1151e71d31daSStefan Richter 1152e71d31daSStefan Richter if (fw_device_enable_phys_dma(device) < 0) 1153e71d31daSStefan Richter goto fail_shost_put; 1154e71d31daSStefan Richter 1155*af271941SStefan Richter shost->max_cmd_len = SBP2_MAX_CDB_SIZE; 1156*af271941SStefan Richter 1157e71d31daSStefan Richter if (scsi_add_host(shost, &unit->device) < 0) 1158e71d31daSStefan Richter goto fail_shost_put; 1159e71d31daSStefan Richter 1160e71d31daSStefan Richter fw_device_get(device); 1161e71d31daSStefan Richter fw_unit_get(unit); 1162e71d31daSStefan Richter 1163e71d31daSStefan Richter /* implicit directory ID */ 1164e71d31daSStefan Richter tgt->directory_id = ((unit->directory - device->config_rom) * 4 1165e71d31daSStefan Richter + CSR_CONFIG_ROM) & 0xffffff; 1166e71d31daSStefan Richter 1167e71d31daSStefan Richter firmware_revision = SBP2_ROM_VALUE_MISSING; 1168e71d31daSStefan Richter model = SBP2_ROM_VALUE_MISSING; 1169e71d31daSStefan Richter 1170e71d31daSStefan Richter if (sbp2_scan_unit_dir(tgt, unit->directory, &model, 1171e71d31daSStefan Richter &firmware_revision) < 0) 1172e71d31daSStefan Richter goto fail_tgt_put; 1173e71d31daSStefan Richter 1174e71d31daSStefan Richter sbp2_init_workarounds(tgt, model, firmware_revision); 1175e71d31daSStefan Richter 1176e71d31daSStefan Richter /* 1177e71d31daSStefan Richter * At S100 we can do 512 bytes per packet, at S200 1024 bytes, 1178e71d31daSStefan Richter * and so on up to 4096 bytes. The SBP-2 max_payload field 1179e71d31daSStefan Richter * specifies the max payload size as 2 ^ (max_payload + 2), so 1180e71d31daSStefan Richter * if we set this to max_speed + 7, we get the right value. 1181e71d31daSStefan Richter */ 1182e71d31daSStefan Richter tgt->max_payload = min(device->max_speed + 7, 10U); 1183e71d31daSStefan Richter tgt->max_payload = min(tgt->max_payload, device->card->max_receive - 1); 1184e71d31daSStefan Richter 1185e71d31daSStefan Richter /* Do the login in a workqueue so we can easily reschedule retries. */ 1186e71d31daSStefan Richter list_for_each_entry(lu, &tgt->lu_list, link) 1187e71d31daSStefan Richter sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); 1188e71d31daSStefan Richter return 0; 1189e71d31daSStefan Richter 1190e71d31daSStefan Richter fail_tgt_put: 1191e71d31daSStefan Richter sbp2_target_put(tgt); 1192e71d31daSStefan Richter return -ENOMEM; 1193e71d31daSStefan Richter 1194e71d31daSStefan Richter fail_shost_put: 1195e71d31daSStefan Richter scsi_host_put(shost); 1196e71d31daSStefan Richter return -ENOMEM; 1197e71d31daSStefan Richter } 1198e71d31daSStefan Richter 1199e71d31daSStefan Richter static int sbp2_remove(struct device *dev) 1200e71d31daSStefan Richter { 1201e71d31daSStefan Richter struct fw_unit *unit = fw_unit(dev); 1202e71d31daSStefan Richter struct sbp2_target *tgt = unit->device.driver_data; 1203e71d31daSStefan Richter 1204e71d31daSStefan Richter sbp2_target_put(tgt); 1205e71d31daSStefan Richter return 0; 1206e71d31daSStefan Richter } 1207e71d31daSStefan Richter 1208e71d31daSStefan Richter static void sbp2_reconnect(struct work_struct *work) 1209e71d31daSStefan Richter { 1210e71d31daSStefan Richter struct sbp2_logical_unit *lu = 1211e71d31daSStefan Richter container_of(work, struct sbp2_logical_unit, work.work); 1212e71d31daSStefan Richter struct sbp2_target *tgt = lu->tgt; 1213e5110d01SStefan Richter struct fw_device *device = target_device(tgt); 1214e71d31daSStefan Richter int generation, node_id, local_node_id; 1215e71d31daSStefan Richter 1216e71d31daSStefan Richter if (fw_device_is_shutdown(device)) 1217e71d31daSStefan Richter goto out; 1218e71d31daSStefan Richter 1219e71d31daSStefan Richter generation = device->generation; 1220e71d31daSStefan Richter smp_rmb(); /* node IDs must not be older than generation */ 1221e71d31daSStefan Richter node_id = device->node_id; 1222e71d31daSStefan Richter local_node_id = device->card->node_id; 1223e71d31daSStefan Richter 1224e71d31daSStefan Richter if (sbp2_send_management_orb(lu, node_id, generation, 1225e71d31daSStefan Richter SBP2_RECONNECT_REQUEST, 1226e71d31daSStefan Richter lu->login_id, NULL) < 0) { 1227e71d31daSStefan Richter /* 1228e71d31daSStefan Richter * If reconnect was impossible even though we are in the 1229e71d31daSStefan Richter * current generation, fall back and try to log in again. 1230e71d31daSStefan Richter * 1231e71d31daSStefan Richter * We could check for "Function rejected" status, but 1232e71d31daSStefan Richter * looking at the bus generation as simpler and more general. 1233e71d31daSStefan Richter */ 1234e71d31daSStefan Richter smp_rmb(); /* get current card generation */ 1235e71d31daSStefan Richter if (generation == device->card->generation || 1236e71d31daSStefan Richter lu->retries++ >= 5) { 1237e71d31daSStefan Richter fw_error("%s: failed to reconnect\n", tgt->bus_id); 1238e71d31daSStefan Richter lu->retries = 0; 1239e71d31daSStefan Richter PREPARE_DELAYED_WORK(&lu->work, sbp2_login); 1240e71d31daSStefan Richter } 1241e71d31daSStefan Richter sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); 1242e71d31daSStefan Richter goto out; 1243e71d31daSStefan Richter } 1244e71d31daSStefan Richter 1245e71d31daSStefan Richter tgt->node_id = node_id; 1246e71d31daSStefan Richter tgt->address_high = local_node_id << 16; 1247e71d31daSStefan Richter smp_wmb(); /* node IDs must not be older than generation */ 1248e71d31daSStefan Richter lu->generation = generation; 1249e71d31daSStefan Richter 1250e71d31daSStefan Richter fw_notify("%s: reconnected to LUN %04x (%d retries)\n", 1251e71d31daSStefan Richter tgt->bus_id, lu->lun, lu->retries); 1252e71d31daSStefan Richter 1253e71d31daSStefan Richter sbp2_agent_reset(lu); 1254e71d31daSStefan Richter sbp2_cancel_orbs(lu); 1255e71d31daSStefan Richter sbp2_conditionally_unblock(lu); 1256e71d31daSStefan Richter out: 1257e71d31daSStefan Richter sbp2_target_put(tgt); 1258e71d31daSStefan Richter } 1259e71d31daSStefan Richter 1260e71d31daSStefan Richter static void sbp2_update(struct fw_unit *unit) 1261e71d31daSStefan Richter { 1262e71d31daSStefan Richter struct sbp2_target *tgt = unit->device.driver_data; 1263e71d31daSStefan Richter struct sbp2_logical_unit *lu; 1264e71d31daSStefan Richter 1265e5110d01SStefan Richter fw_device_enable_phys_dma(fw_parent_device(unit)); 1266e71d31daSStefan Richter 1267e71d31daSStefan Richter /* 1268e71d31daSStefan Richter * Fw-core serializes sbp2_update() against sbp2_remove(). 1269e71d31daSStefan Richter * Iteration over tgt->lu_list is therefore safe here. 1270e71d31daSStefan Richter */ 1271e71d31daSStefan Richter list_for_each_entry(lu, &tgt->lu_list, link) { 1272e71d31daSStefan Richter sbp2_conditionally_block(lu); 1273e71d31daSStefan Richter lu->retries = 0; 1274e71d31daSStefan Richter sbp2_queue_work(lu, 0); 1275e71d31daSStefan Richter } 1276e71d31daSStefan Richter } 1277e71d31daSStefan Richter 1278e71d31daSStefan Richter #define SBP2_UNIT_SPEC_ID_ENTRY 0x0000609e 1279e71d31daSStefan Richter #define SBP2_SW_VERSION_ENTRY 0x00010483 1280e71d31daSStefan Richter 1281e71d31daSStefan Richter static const struct ieee1394_device_id sbp2_id_table[] = { 1282e71d31daSStefan Richter { 1283e71d31daSStefan Richter .match_flags = IEEE1394_MATCH_SPECIFIER_ID | 1284e71d31daSStefan Richter IEEE1394_MATCH_VERSION, 1285e71d31daSStefan Richter .specifier_id = SBP2_UNIT_SPEC_ID_ENTRY, 1286e71d31daSStefan Richter .version = SBP2_SW_VERSION_ENTRY, 1287e71d31daSStefan Richter }, 1288e71d31daSStefan Richter { } 1289e71d31daSStefan Richter }; 1290e71d31daSStefan Richter 1291e71d31daSStefan Richter static struct fw_driver sbp2_driver = { 1292e71d31daSStefan Richter .driver = { 1293e71d31daSStefan Richter .owner = THIS_MODULE, 1294e71d31daSStefan Richter .name = sbp2_driver_name, 1295e71d31daSStefan Richter .bus = &fw_bus_type, 1296e71d31daSStefan Richter .probe = sbp2_probe, 1297e71d31daSStefan Richter .remove = sbp2_remove, 1298e71d31daSStefan Richter }, 1299e71d31daSStefan Richter .update = sbp2_update, 1300e71d31daSStefan Richter .id_table = sbp2_id_table, 1301e71d31daSStefan Richter }; 1302e71d31daSStefan Richter 1303e71d31daSStefan Richter static void sbp2_unmap_scatterlist(struct device *card_device, 1304e71d31daSStefan Richter struct sbp2_command_orb *orb) 1305e71d31daSStefan Richter { 1306e71d31daSStefan Richter if (scsi_sg_count(orb->cmd)) 1307e71d31daSStefan Richter dma_unmap_sg(card_device, scsi_sglist(orb->cmd), 1308e71d31daSStefan Richter scsi_sg_count(orb->cmd), 1309e71d31daSStefan Richter orb->cmd->sc_data_direction); 1310e71d31daSStefan Richter 1311e71d31daSStefan Richter if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT)) 1312e71d31daSStefan Richter dma_unmap_single(card_device, orb->page_table_bus, 1313e71d31daSStefan Richter sizeof(orb->page_table), DMA_TO_DEVICE); 1314e71d31daSStefan Richter } 1315e71d31daSStefan Richter 1316e71d31daSStefan Richter static unsigned int sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data) 1317e71d31daSStefan Richter { 1318e71d31daSStefan Richter int sam_status; 1319e71d31daSStefan Richter 1320e71d31daSStefan Richter sense_data[0] = 0x70; 1321e71d31daSStefan Richter sense_data[1] = 0x0; 1322e71d31daSStefan Richter sense_data[2] = sbp2_status[1]; 1323e71d31daSStefan Richter sense_data[3] = sbp2_status[4]; 1324e71d31daSStefan Richter sense_data[4] = sbp2_status[5]; 1325e71d31daSStefan Richter sense_data[5] = sbp2_status[6]; 1326e71d31daSStefan Richter sense_data[6] = sbp2_status[7]; 1327e71d31daSStefan Richter sense_data[7] = 10; 1328e71d31daSStefan Richter sense_data[8] = sbp2_status[8]; 1329e71d31daSStefan Richter sense_data[9] = sbp2_status[9]; 1330e71d31daSStefan Richter sense_data[10] = sbp2_status[10]; 1331e71d31daSStefan Richter sense_data[11] = sbp2_status[11]; 1332e71d31daSStefan Richter sense_data[12] = sbp2_status[2]; 1333e71d31daSStefan Richter sense_data[13] = sbp2_status[3]; 1334e71d31daSStefan Richter sense_data[14] = sbp2_status[12]; 1335e71d31daSStefan Richter sense_data[15] = sbp2_status[13]; 1336e71d31daSStefan Richter 1337e71d31daSStefan Richter sam_status = sbp2_status[0] & 0x3f; 1338e71d31daSStefan Richter 1339e71d31daSStefan Richter switch (sam_status) { 1340e71d31daSStefan Richter case SAM_STAT_GOOD: 1341e71d31daSStefan Richter case SAM_STAT_CHECK_CONDITION: 1342e71d31daSStefan Richter case SAM_STAT_CONDITION_MET: 1343e71d31daSStefan Richter case SAM_STAT_BUSY: 1344e71d31daSStefan Richter case SAM_STAT_RESERVATION_CONFLICT: 1345e71d31daSStefan Richter case SAM_STAT_COMMAND_TERMINATED: 1346e71d31daSStefan Richter return DID_OK << 16 | sam_status; 1347e71d31daSStefan Richter 1348e71d31daSStefan Richter default: 1349e71d31daSStefan Richter return DID_ERROR << 16; 1350e71d31daSStefan Richter } 1351e71d31daSStefan Richter } 1352e71d31daSStefan Richter 1353e71d31daSStefan Richter static void complete_command_orb(struct sbp2_orb *base_orb, 1354e71d31daSStefan Richter struct sbp2_status *status) 1355e71d31daSStefan Richter { 1356e71d31daSStefan Richter struct sbp2_command_orb *orb = 1357e71d31daSStefan Richter container_of(base_orb, struct sbp2_command_orb, base); 1358e5110d01SStefan Richter struct fw_device *device = target_device(orb->lu->tgt); 1359e71d31daSStefan Richter int result; 1360e71d31daSStefan Richter 1361e71d31daSStefan Richter if (status != NULL) { 1362e71d31daSStefan Richter if (STATUS_GET_DEAD(*status)) 1363e71d31daSStefan Richter sbp2_agent_reset_no_wait(orb->lu); 1364e71d31daSStefan Richter 1365e71d31daSStefan Richter switch (STATUS_GET_RESPONSE(*status)) { 1366e71d31daSStefan Richter case SBP2_STATUS_REQUEST_COMPLETE: 1367e71d31daSStefan Richter result = DID_OK << 16; 1368e71d31daSStefan Richter break; 1369e71d31daSStefan Richter case SBP2_STATUS_TRANSPORT_FAILURE: 1370e71d31daSStefan Richter result = DID_BUS_BUSY << 16; 1371e71d31daSStefan Richter break; 1372e71d31daSStefan Richter case SBP2_STATUS_ILLEGAL_REQUEST: 1373e71d31daSStefan Richter case SBP2_STATUS_VENDOR_DEPENDENT: 1374e71d31daSStefan Richter default: 1375e71d31daSStefan Richter result = DID_ERROR << 16; 1376e71d31daSStefan Richter break; 1377e71d31daSStefan Richter } 1378e71d31daSStefan Richter 1379e71d31daSStefan Richter if (result == DID_OK << 16 && STATUS_GET_LEN(*status) > 1) 1380e71d31daSStefan Richter result = sbp2_status_to_sense_data(STATUS_GET_DATA(*status), 1381e71d31daSStefan Richter orb->cmd->sense_buffer); 1382e71d31daSStefan Richter } else { 1383e71d31daSStefan Richter /* 1384e71d31daSStefan Richter * If the orb completes with status == NULL, something 1385e71d31daSStefan Richter * went wrong, typically a bus reset happened mid-orb 1386e71d31daSStefan Richter * or when sending the write (less likely). 1387e71d31daSStefan Richter */ 1388e71d31daSStefan Richter result = DID_BUS_BUSY << 16; 1389e71d31daSStefan Richter sbp2_conditionally_block(orb->lu); 1390e71d31daSStefan Richter } 1391e71d31daSStefan Richter 1392e71d31daSStefan Richter dma_unmap_single(device->card->device, orb->base.request_bus, 1393e71d31daSStefan Richter sizeof(orb->request), DMA_TO_DEVICE); 1394e71d31daSStefan Richter sbp2_unmap_scatterlist(device->card->device, orb); 1395e71d31daSStefan Richter 1396e71d31daSStefan Richter orb->cmd->result = result; 1397e71d31daSStefan Richter orb->done(orb->cmd); 1398e71d31daSStefan Richter } 1399e71d31daSStefan Richter 1400e71d31daSStefan Richter static int sbp2_map_scatterlist(struct sbp2_command_orb *orb, 1401e71d31daSStefan Richter struct fw_device *device, struct sbp2_logical_unit *lu) 1402e71d31daSStefan Richter { 1403e71d31daSStefan Richter struct scatterlist *sg = scsi_sglist(orb->cmd); 1404e71d31daSStefan Richter int i, n; 1405e71d31daSStefan Richter 1406e71d31daSStefan Richter n = dma_map_sg(device->card->device, sg, scsi_sg_count(orb->cmd), 1407e71d31daSStefan Richter orb->cmd->sc_data_direction); 1408e71d31daSStefan Richter if (n == 0) 1409e71d31daSStefan Richter goto fail; 1410e71d31daSStefan Richter 1411e71d31daSStefan Richter /* 1412e71d31daSStefan Richter * Handle the special case where there is only one element in 1413e71d31daSStefan Richter * the scatter list by converting it to an immediate block 1414e71d31daSStefan Richter * request. This is also a workaround for broken devices such 1415e71d31daSStefan Richter * as the second generation iPod which doesn't support page 1416e71d31daSStefan Richter * tables. 1417e71d31daSStefan Richter */ 1418e71d31daSStefan Richter if (n == 1) { 1419e71d31daSStefan Richter orb->request.data_descriptor.high = 1420e71d31daSStefan Richter cpu_to_be32(lu->tgt->address_high); 1421e71d31daSStefan Richter orb->request.data_descriptor.low = 1422e71d31daSStefan Richter cpu_to_be32(sg_dma_address(sg)); 1423e71d31daSStefan Richter orb->request.misc |= 1424e71d31daSStefan Richter cpu_to_be32(COMMAND_ORB_DATA_SIZE(sg_dma_len(sg))); 1425e71d31daSStefan Richter return 0; 1426e71d31daSStefan Richter } 1427e71d31daSStefan Richter 1428e71d31daSStefan Richter for_each_sg(sg, sg, n, i) { 1429e71d31daSStefan Richter orb->page_table[i].high = cpu_to_be32(sg_dma_len(sg) << 16); 1430e71d31daSStefan Richter orb->page_table[i].low = cpu_to_be32(sg_dma_address(sg)); 1431e71d31daSStefan Richter } 1432e71d31daSStefan Richter 1433e71d31daSStefan Richter orb->page_table_bus = 1434e71d31daSStefan Richter dma_map_single(device->card->device, orb->page_table, 1435e71d31daSStefan Richter sizeof(orb->page_table), DMA_TO_DEVICE); 1436e71d31daSStefan Richter if (dma_mapping_error(device->card->device, orb->page_table_bus)) 1437e71d31daSStefan Richter goto fail_page_table; 1438e71d31daSStefan Richter 1439e71d31daSStefan Richter /* 1440e71d31daSStefan Richter * The data_descriptor pointer is the one case where we need 1441e71d31daSStefan Richter * to fill in the node ID part of the address. All other 1442e71d31daSStefan Richter * pointers assume that the data referenced reside on the 1443e71d31daSStefan Richter * initiator (i.e. us), but data_descriptor can refer to data 1444e71d31daSStefan Richter * on other nodes so we need to put our ID in descriptor.high. 1445e71d31daSStefan Richter */ 1446e71d31daSStefan Richter orb->request.data_descriptor.high = cpu_to_be32(lu->tgt->address_high); 1447e71d31daSStefan Richter orb->request.data_descriptor.low = cpu_to_be32(orb->page_table_bus); 1448e71d31daSStefan Richter orb->request.misc |= cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT | 1449e71d31daSStefan Richter COMMAND_ORB_DATA_SIZE(n)); 1450e71d31daSStefan Richter 1451e71d31daSStefan Richter return 0; 1452e71d31daSStefan Richter 1453e71d31daSStefan Richter fail_page_table: 1454e71d31daSStefan Richter dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd), 1455e71d31daSStefan Richter scsi_sg_count(orb->cmd), orb->cmd->sc_data_direction); 1456e71d31daSStefan Richter fail: 1457e71d31daSStefan Richter return -ENOMEM; 1458e71d31daSStefan Richter } 1459e71d31daSStefan Richter 1460e71d31daSStefan Richter /* SCSI stack integration */ 1461e71d31daSStefan Richter 1462e71d31daSStefan Richter static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done) 1463e71d31daSStefan Richter { 1464e71d31daSStefan Richter struct sbp2_logical_unit *lu = cmd->device->hostdata; 1465e5110d01SStefan Richter struct fw_device *device = target_device(lu->tgt); 1466e71d31daSStefan Richter struct sbp2_command_orb *orb; 1467e71d31daSStefan Richter int generation, retval = SCSI_MLQUEUE_HOST_BUSY; 1468e71d31daSStefan Richter 1469e71d31daSStefan Richter /* 1470e71d31daSStefan Richter * Bidirectional commands are not yet implemented, and unknown 1471e71d31daSStefan Richter * transfer direction not handled. 1472e71d31daSStefan Richter */ 1473e71d31daSStefan Richter if (cmd->sc_data_direction == DMA_BIDIRECTIONAL) { 1474e71d31daSStefan Richter fw_error("Can't handle DMA_BIDIRECTIONAL, rejecting command\n"); 1475e71d31daSStefan Richter cmd->result = DID_ERROR << 16; 1476e71d31daSStefan Richter done(cmd); 1477e71d31daSStefan Richter return 0; 1478e71d31daSStefan Richter } 1479e71d31daSStefan Richter 1480e71d31daSStefan Richter orb = kzalloc(sizeof(*orb), GFP_ATOMIC); 1481e71d31daSStefan Richter if (orb == NULL) { 1482e71d31daSStefan Richter fw_notify("failed to alloc orb\n"); 1483e71d31daSStefan Richter return SCSI_MLQUEUE_HOST_BUSY; 1484e71d31daSStefan Richter } 1485e71d31daSStefan Richter 1486e71d31daSStefan Richter /* Initialize rcode to something not RCODE_COMPLETE. */ 1487e71d31daSStefan Richter orb->base.rcode = -1; 1488e71d31daSStefan Richter kref_init(&orb->base.kref); 1489e71d31daSStefan Richter 1490e71d31daSStefan Richter orb->lu = lu; 1491e71d31daSStefan Richter orb->done = done; 1492e71d31daSStefan Richter orb->cmd = cmd; 1493e71d31daSStefan Richter 1494e71d31daSStefan Richter orb->request.next.high = cpu_to_be32(SBP2_ORB_NULL); 1495e71d31daSStefan Richter orb->request.misc = cpu_to_be32( 1496e71d31daSStefan Richter COMMAND_ORB_MAX_PAYLOAD(lu->tgt->max_payload) | 1497e71d31daSStefan Richter COMMAND_ORB_SPEED(device->max_speed) | 1498e71d31daSStefan Richter COMMAND_ORB_NOTIFY); 1499e71d31daSStefan Richter 1500e71d31daSStefan Richter if (cmd->sc_data_direction == DMA_FROM_DEVICE) 1501e71d31daSStefan Richter orb->request.misc |= cpu_to_be32(COMMAND_ORB_DIRECTION); 1502e71d31daSStefan Richter 1503e71d31daSStefan Richter generation = device->generation; 1504e71d31daSStefan Richter smp_rmb(); /* sbp2_map_scatterlist looks at tgt->address_high */ 1505e71d31daSStefan Richter 1506e71d31daSStefan Richter if (scsi_sg_count(cmd) && sbp2_map_scatterlist(orb, device, lu) < 0) 1507e71d31daSStefan Richter goto out; 1508e71d31daSStefan Richter 1509e71d31daSStefan Richter memcpy(orb->request.command_block, cmd->cmnd, cmd->cmd_len); 1510e71d31daSStefan Richter 1511e71d31daSStefan Richter orb->base.callback = complete_command_orb; 1512e71d31daSStefan Richter orb->base.request_bus = 1513e71d31daSStefan Richter dma_map_single(device->card->device, &orb->request, 1514e71d31daSStefan Richter sizeof(orb->request), DMA_TO_DEVICE); 1515e71d31daSStefan Richter if (dma_mapping_error(device->card->device, orb->base.request_bus)) { 1516e71d31daSStefan Richter sbp2_unmap_scatterlist(device->card->device, orb); 1517e71d31daSStefan Richter goto out; 1518e71d31daSStefan Richter } 1519e71d31daSStefan Richter 1520e71d31daSStefan Richter sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, generation, 1521e71d31daSStefan Richter lu->command_block_agent_address + SBP2_ORB_POINTER); 1522e71d31daSStefan Richter retval = 0; 1523e71d31daSStefan Richter out: 1524e71d31daSStefan Richter kref_put(&orb->base.kref, free_orb); 1525e71d31daSStefan Richter return retval; 1526e71d31daSStefan Richter } 1527e71d31daSStefan Richter 1528e71d31daSStefan Richter static int sbp2_scsi_slave_alloc(struct scsi_device *sdev) 1529e71d31daSStefan Richter { 1530e71d31daSStefan Richter struct sbp2_logical_unit *lu = sdev->hostdata; 1531e71d31daSStefan Richter 1532e71d31daSStefan Richter /* (Re-)Adding logical units via the SCSI stack is not supported. */ 1533e71d31daSStefan Richter if (!lu) 1534e71d31daSStefan Richter return -ENOSYS; 1535e71d31daSStefan Richter 1536e71d31daSStefan Richter sdev->allow_restart = 1; 1537e71d31daSStefan Richter 1538e71d31daSStefan Richter /* SBP-2 requires quadlet alignment of the data buffers. */ 1539e71d31daSStefan Richter blk_queue_update_dma_alignment(sdev->request_queue, 4 - 1); 1540e71d31daSStefan Richter 1541e71d31daSStefan Richter if (lu->tgt->workarounds & SBP2_WORKAROUND_INQUIRY_36) 1542e71d31daSStefan Richter sdev->inquiry_len = 36; 1543e71d31daSStefan Richter 1544e71d31daSStefan Richter return 0; 1545e71d31daSStefan Richter } 1546e71d31daSStefan Richter 1547e71d31daSStefan Richter static int sbp2_scsi_slave_configure(struct scsi_device *sdev) 1548e71d31daSStefan Richter { 1549e71d31daSStefan Richter struct sbp2_logical_unit *lu = sdev->hostdata; 1550e71d31daSStefan Richter 1551e71d31daSStefan Richter sdev->use_10_for_rw = 1; 1552e71d31daSStefan Richter 1553e71d31daSStefan Richter if (sbp2_param_exclusive_login) 1554e71d31daSStefan Richter sdev->manage_start_stop = 1; 1555e71d31daSStefan Richter 1556e71d31daSStefan Richter if (sdev->type == TYPE_ROM) 1557e71d31daSStefan Richter sdev->use_10_for_ms = 1; 1558e71d31daSStefan Richter 1559e71d31daSStefan Richter if (sdev->type == TYPE_DISK && 1560e71d31daSStefan Richter lu->tgt->workarounds & SBP2_WORKAROUND_MODE_SENSE_8) 1561e71d31daSStefan Richter sdev->skip_ms_page_8 = 1; 1562e71d31daSStefan Richter 1563e71d31daSStefan Richter if (lu->tgt->workarounds & SBP2_WORKAROUND_FIX_CAPACITY) 1564e71d31daSStefan Richter sdev->fix_capacity = 1; 1565e71d31daSStefan Richter 1566e71d31daSStefan Richter if (lu->tgt->workarounds & SBP2_WORKAROUND_POWER_CONDITION) 1567e71d31daSStefan Richter sdev->start_stop_pwr_cond = 1; 1568e71d31daSStefan Richter 1569e71d31daSStefan Richter if (lu->tgt->workarounds & SBP2_WORKAROUND_128K_MAX_TRANS) 1570e71d31daSStefan Richter blk_queue_max_sectors(sdev->request_queue, 128 * 1024 / 512); 1571e71d31daSStefan Richter 1572e71d31daSStefan Richter blk_queue_max_segment_size(sdev->request_queue, SBP2_MAX_SEG_SIZE); 1573e71d31daSStefan Richter 1574e71d31daSStefan Richter return 0; 1575e71d31daSStefan Richter } 1576e71d31daSStefan Richter 1577e71d31daSStefan Richter /* 1578e71d31daSStefan Richter * Called by scsi stack when something has really gone wrong. Usually 1579e71d31daSStefan Richter * called when a command has timed-out for some reason. 1580e71d31daSStefan Richter */ 1581e71d31daSStefan Richter static int sbp2_scsi_abort(struct scsi_cmnd *cmd) 1582e71d31daSStefan Richter { 1583e71d31daSStefan Richter struct sbp2_logical_unit *lu = cmd->device->hostdata; 1584e71d31daSStefan Richter 1585e71d31daSStefan Richter fw_notify("%s: sbp2_scsi_abort\n", lu->tgt->bus_id); 1586e71d31daSStefan Richter sbp2_agent_reset(lu); 1587e71d31daSStefan Richter sbp2_cancel_orbs(lu); 1588e71d31daSStefan Richter 1589e71d31daSStefan Richter return SUCCESS; 1590e71d31daSStefan Richter } 1591e71d31daSStefan Richter 1592e71d31daSStefan Richter /* 1593e71d31daSStefan Richter * Format of /sys/bus/scsi/devices/.../ieee1394_id: 1594e71d31daSStefan Richter * u64 EUI-64 : u24 directory_ID : u16 LUN (all printed in hexadecimal) 1595e71d31daSStefan Richter * 1596e71d31daSStefan Richter * This is the concatenation of target port identifier and logical unit 1597e71d31daSStefan Richter * identifier as per SAM-2...SAM-4 annex A. 1598e71d31daSStefan Richter */ 1599e71d31daSStefan Richter static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, 1600e71d31daSStefan Richter struct device_attribute *attr, char *buf) 1601e71d31daSStefan Richter { 1602e71d31daSStefan Richter struct scsi_device *sdev = to_scsi_device(dev); 1603e71d31daSStefan Richter struct sbp2_logical_unit *lu; 1604e71d31daSStefan Richter 1605e71d31daSStefan Richter if (!sdev) 1606e71d31daSStefan Richter return 0; 1607e71d31daSStefan Richter 1608e71d31daSStefan Richter lu = sdev->hostdata; 1609e71d31daSStefan Richter 1610e71d31daSStefan Richter return sprintf(buf, "%016llx:%06x:%04x\n", 1611e71d31daSStefan Richter (unsigned long long)lu->tgt->guid, 1612e71d31daSStefan Richter lu->tgt->directory_id, lu->lun); 1613e71d31daSStefan Richter } 1614e71d31daSStefan Richter 1615e71d31daSStefan Richter static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); 1616e71d31daSStefan Richter 1617e71d31daSStefan Richter static struct device_attribute *sbp2_scsi_sysfs_attrs[] = { 1618e71d31daSStefan Richter &dev_attr_ieee1394_id, 1619e71d31daSStefan Richter NULL 1620e71d31daSStefan Richter }; 1621e71d31daSStefan Richter 1622e71d31daSStefan Richter static struct scsi_host_template scsi_driver_template = { 1623e71d31daSStefan Richter .module = THIS_MODULE, 1624e71d31daSStefan Richter .name = "SBP-2 IEEE-1394", 1625e71d31daSStefan Richter .proc_name = sbp2_driver_name, 1626e71d31daSStefan Richter .queuecommand = sbp2_scsi_queuecommand, 1627e71d31daSStefan Richter .slave_alloc = sbp2_scsi_slave_alloc, 1628e71d31daSStefan Richter .slave_configure = sbp2_scsi_slave_configure, 1629e71d31daSStefan Richter .eh_abort_handler = sbp2_scsi_abort, 1630e71d31daSStefan Richter .this_id = -1, 1631e71d31daSStefan Richter .sg_tablesize = SG_ALL, 1632e71d31daSStefan Richter .use_clustering = ENABLE_CLUSTERING, 1633e71d31daSStefan Richter .cmd_per_lun = 1, 1634e71d31daSStefan Richter .can_queue = 1, 1635e71d31daSStefan Richter .sdev_attrs = sbp2_scsi_sysfs_attrs, 1636e71d31daSStefan Richter }; 1637e71d31daSStefan Richter 1638e71d31daSStefan Richter MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>"); 1639e71d31daSStefan Richter MODULE_DESCRIPTION("SCSI over IEEE1394"); 1640e71d31daSStefan Richter MODULE_LICENSE("GPL"); 1641e71d31daSStefan Richter MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table); 1642e71d31daSStefan Richter 1643e71d31daSStefan Richter /* Provide a module alias so root-on-sbp2 initrds don't break. */ 1644e71d31daSStefan Richter #ifndef CONFIG_IEEE1394_SBP2_MODULE 1645e71d31daSStefan Richter MODULE_ALIAS("sbp2"); 1646e71d31daSStefan Richter #endif 1647e71d31daSStefan Richter 1648e71d31daSStefan Richter static int __init sbp2_init(void) 1649e71d31daSStefan Richter { 1650e71d31daSStefan Richter sbp2_wq = create_singlethread_workqueue(KBUILD_MODNAME); 1651e71d31daSStefan Richter if (!sbp2_wq) 1652e71d31daSStefan Richter return -ENOMEM; 1653e71d31daSStefan Richter 1654e71d31daSStefan Richter return driver_register(&sbp2_driver.driver); 1655e71d31daSStefan Richter } 1656e71d31daSStefan Richter 1657e71d31daSStefan Richter static void __exit sbp2_cleanup(void) 1658e71d31daSStefan Richter { 1659e71d31daSStefan Richter driver_unregister(&sbp2_driver.driver); 1660e71d31daSStefan Richter destroy_workqueue(sbp2_wq); 1661e71d31daSStefan Richter } 1662e71d31daSStefan Richter 1663e71d31daSStefan Richter module_init(sbp2_init); 1664e71d31daSStefan Richter module_exit(sbp2_cleanup); 1665