sbp2.c 67.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
/*
 * sbp2.c - SBP-2 protocol driver for IEEE-1394
 *
 * Copyright (C) 2000 James Goodwin, Filanet Corporation (www.filanet.com)
 * jamesg@filanet.com (JSG)
 *
 * Copyright (C) 2003 Ben Collins <bcollins@debian.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

/*
 * Brief Description:
 *
 * This driver implements the Serial Bus Protocol 2 (SBP-2) over IEEE-1394
 * under Linux. The SBP-2 driver is implemented as an IEEE-1394 high-level
 * driver. It also registers as a SCSI lower-level driver in order to accept
 * SCSI commands for transport using SBP-2.
 *
 * You may access any attached SBP-2 storage devices as if they were SCSI
 * devices (e.g. mount /dev/sda1,  fdisk, mkfs, etc.).
 *
 * Current Issues:
 *
 *	- Error Handling: SCSI aborts and bus reset requests are handled somewhat
 *	  but the code needs additional debugging.
 */

S
Stefan Richter 已提交
41 42 43 44 45 46 47
#include <linux/blkdev.h>
#include <linux/compiler.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <linux/gfp.h>
#include <linux/init.h>
L
Linus Torvalds 已提交
48 49 50 51 52
#include <linux/kernel.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/pci.h>
S
Stefan Richter 已提交
53 54 55 56 57 58
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/stringify.h>
#include <linux/types.h>
59
#include <linux/wait.h>
L
Linus Torvalds 已提交
60 61

#include <asm/byteorder.h>
S
Stefan Richter 已提交
62 63
#include <asm/errno.h>
#include <asm/param.h>
L
Linus Torvalds 已提交
64
#include <asm/scatterlist.h>
S
Stefan Richter 已提交
65 66 67 68 69 70
#include <asm/system.h>
#include <asm/types.h>

#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
#include <asm/io.h> /* for bus_to_virt */
#endif
L
Linus Torvalds 已提交
71 72 73 74 75 76 77 78

#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_dbg.h>
#include <scsi/scsi_device.h>
#include <scsi/scsi_host.h>

#include "csr1212.h"
S
Stefan Richter 已提交
79 80
#include "highlevel.h"
#include "hosts.h"
L
Linus Torvalds 已提交
81 82
#include "ieee1394.h"
#include "ieee1394_core.h"
S
Stefan Richter 已提交
83
#include "ieee1394_hotplug.h"
L
Linus Torvalds 已提交
84
#include "ieee1394_transactions.h"
S
Stefan Richter 已提交
85 86
#include "ieee1394_types.h"
#include "nodemgr.h"
L
Linus Torvalds 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100
#include "sbp2.h"

/*
 * Module load parameter definitions
 */

/*
 * Change max_speed on module load if you have a bad IEEE-1394
 * controller that has trouble running 2KB packets at 400mb.
 *
 * NOTE: On certain OHCI parts I have seen short packets on async transmit
 * (probably due to PCI latency/throughput issues with the part). You can
 * bump down the speed if you are running into problems.
 */
101 102
static int sbp2_max_speed = IEEE1394_SPEED_MAX;
module_param_named(max_speed, sbp2_max_speed, int, 0644);
103 104
MODULE_PARM_DESC(max_speed, "Force max speed "
		 "(3 = 800Mb/s, 2 = 400Mb/s, 1 = 200Mb/s, 0 = 100Mb/s)");
L
Linus Torvalds 已提交
105 106 107 108 109

/*
 * Set serialize_io to 1 if you'd like only one scsi command sent
 * down to us at a time (debugging). This might be necessary for very
 * badly behaved sbp2 devices.
110 111
 *
 * TODO: Make this configurable per device.
L
Linus Torvalds 已提交
112
 */
113 114 115 116
static int sbp2_serialize_io = 1;
module_param_named(serialize_io, sbp2_serialize_io, int, 0444);
MODULE_PARM_DESC(serialize_io, "Serialize I/O coming from scsi drivers "
		 "(default = 1, faster = 0)");
L
Linus Torvalds 已提交
117 118 119 120 121 122 123 124 125

/*
 * Bump up max_sectors if you'd like to support very large sized
 * transfers. Please note that some older sbp2 bridge chips are broken for
 * transfers greater or equal to 128KB.  Default is a value of 255
 * sectors, or just under 128KB (at 512 byte sector size). I can note that
 * the Oxsemi sbp2 chipsets have no problems supporting very large
 * transfer sizes.
 */
126 127 128 129
static int sbp2_max_sectors = SBP2_MAX_SECTORS;
module_param_named(max_sectors, sbp2_max_sectors, int, 0444);
MODULE_PARM_DESC(max_sectors, "Change max sectors per I/O supported "
		 "(default = " __stringify(SBP2_MAX_SECTORS) ")");
L
Linus Torvalds 已提交
130 131 132 133 134 135 136

/*
 * Exclusive login to sbp2 device? In most cases, the sbp2 driver should
 * do an exclusive login, as it's generally unsafe to have two hosts
 * talking to a single sbp2 device at the same time (filesystem coherency,
 * etc.). If you're running an sbp2 device that supports multiple logins,
 * and you're either running read-only filesystems or some sort of special
137 138 139 140 141 142
 * filesystem supporting multiple hosts, e.g. OpenGFS, Oracle Cluster
 * File System, or Lustre, then set exclusive_login to zero.
 *
 * So far only bridges from Oxford Semiconductor are known to support
 * concurrent logins. Depending on firmware, four or two concurrent logins
 * are possible on OXFW911 and newer Oxsemi bridges.
L
Linus Torvalds 已提交
143
 */
144 145 146 147
static int sbp2_exclusive_login = 1;
module_param_named(exclusive_login, sbp2_exclusive_login, int, 0644);
MODULE_PARM_DESC(exclusive_login, "Exclusive login to sbp2 device "
		 "(default = 1)");
L
Linus Torvalds 已提交
148 149

/*
150 151 152
 * If any of the following workarounds is required for your device to work,
 * please submit the kernel messages logged by sbp2 to the linux1394-devel
 * mailing list.
L
Linus Torvalds 已提交
153
 *
154 155 156 157 158 159 160 161 162 163
 * - 128kB max transfer
 *   Limit transfer size. Necessary for some old bridges.
 *
 * - 36 byte inquiry
 *   When scsi_mod probes the device, let the inquiry command look like that
 *   from MS Windows.
 *
 * - skip mode page 8
 *   Suppress sending of mode_sense for mode page 8 if the device pretends to
 *   support the SCSI Primary Block commands instead of Reduced Block Commands.
164 165 166 167 168
 *
 * - fix capacity
 *   Tell sd_mod to correct the last sector number reported by read_capacity.
 *   Avoids access beyond actual disk limits on devices with an off-by-one bug.
 *   Don't use this with devices which don't have this bug.
169 170 171 172 173
 *
 * - override internal blacklist
 *   Instead of adding to the built-in blacklist, use only the workarounds
 *   specified in the module load parameter.
 *   Useful if a blacklist entry interfered with a non-broken device.
L
Linus Torvalds 已提交
174
 */
175 176 177 178 179 180
static int sbp2_default_workarounds;
module_param_named(workarounds, sbp2_default_workarounds, int, 0644);
MODULE_PARM_DESC(workarounds, "Work around device bugs (default = 0"
	", 128kB max transfer = " __stringify(SBP2_WORKAROUND_128K_MAX_TRANS)
	", 36 byte inquiry = "    __stringify(SBP2_WORKAROUND_INQUIRY_36)
	", skip mode page 8 = "   __stringify(SBP2_WORKAROUND_MODE_SENSE_8)
181
	", fix capacity = "       __stringify(SBP2_WORKAROUND_FIX_CAPACITY)
182
	", override internal blacklist = " __stringify(SBP2_WORKAROUND_OVERRIDE)
183 184
	", or a combination)");

L
Linus Torvalds 已提交
185

186 187
#define SBP2_INFO(fmt, args...)	HPSB_INFO("sbp2: "fmt, ## args)
#define SBP2_ERR(fmt, args...)	HPSB_ERR("sbp2: "fmt, ## args)
L
Linus Torvalds 已提交
188 189 190 191

/*
 * Globals
 */
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *, u32);
static void sbp2scsi_complete_command(struct scsi_id_instance_data *, u32,
				      struct scsi_cmnd *,
				      void (*)(struct scsi_cmnd *));
static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *);
static int sbp2_start_device(struct scsi_id_instance_data *);
static void sbp2_remove_device(struct scsi_id_instance_data *);
static int sbp2_login_device(struct scsi_id_instance_data *);
static int sbp2_reconnect_device(struct scsi_id_instance_data *);
static int sbp2_logout_device(struct scsi_id_instance_data *);
static void sbp2_host_reset(struct hpsb_host *);
static int sbp2_handle_status_write(struct hpsb_host *, int, int, quadlet_t *,
				    u64, size_t, u16);
static int sbp2_agent_reset(struct scsi_id_instance_data *, int);
static void sbp2_parse_unit_directory(struct scsi_id_instance_data *,
				      struct unit_directory *);
static int sbp2_set_busy_timeout(struct scsi_id_instance_data *);
static int sbp2_max_speed_and_size(struct scsi_id_instance_data *);
L
Linus Torvalds 已提交
210 211 212 213 214


static const u8 sbp2_speedto_max_payload[] = { 0x7, 0x8, 0x9, 0xA, 0xB, 0xC };

static struct hpsb_highlevel sbp2_highlevel = {
215 216
	.name		= SBP2_DEVICE_NAME,
	.host_reset	= sbp2_host_reset,
L
Linus Torvalds 已提交
217 218 219
};

static struct hpsb_address_ops sbp2_ops = {
220
	.write		= sbp2_handle_status_write
L
Linus Torvalds 已提交
221 222 223
};

#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
224 225 226 227 228
static int sbp2_handle_physdma_write(struct hpsb_host *, int, int, quadlet_t *,
				     u64, size_t, u16);
static int sbp2_handle_physdma_read(struct hpsb_host *, int, quadlet_t *, u64,
				    size_t, u16);

L
Linus Torvalds 已提交
229
static struct hpsb_address_ops sbp2_physdma_ops = {
230 231
	.read		= sbp2_handle_physdma_read,
	.write		= sbp2_handle_physdma_write,
L
Linus Torvalds 已提交
232 233 234
};
#endif

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251

/*
 * Interface to driver core and IEEE 1394 core
 */
static struct ieee1394_device_id sbp2_id_table[] = {
	{
	 .match_flags	= IEEE1394_MATCH_SPECIFIER_ID | IEEE1394_MATCH_VERSION,
	 .specifier_id	= SBP2_UNIT_SPEC_ID_ENTRY & 0xffffff,
	 .version	= SBP2_SW_VERSION_ENTRY & 0xffffff},
	{}
};
MODULE_DEVICE_TABLE(ieee1394, sbp2_id_table);

static int sbp2_probe(struct device *);
static int sbp2_remove(struct device *);
static int sbp2_update(struct unit_directory *);

L
Linus Torvalds 已提交
252 253 254 255 256 257 258 259 260 261 262 263
static struct hpsb_protocol_driver sbp2_driver = {
	.name		= "SBP2 Driver",
	.id_table	= sbp2_id_table,
	.update		= sbp2_update,
	.driver		= {
		.name		= SBP2_DEVICE_NAME,
		.bus		= &ieee1394_bus_type,
		.probe		= sbp2_probe,
		.remove		= sbp2_remove,
	},
};

264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284

/*
 * Interface to SCSI core
 */
static int sbp2scsi_queuecommand(struct scsi_cmnd *,
				 void (*)(struct scsi_cmnd *));
static int sbp2scsi_abort(struct scsi_cmnd *);
static int sbp2scsi_reset(struct scsi_cmnd *);
static int sbp2scsi_slave_alloc(struct scsi_device *);
static int sbp2scsi_slave_configure(struct scsi_device *);
static void sbp2scsi_slave_destroy(struct scsi_device *);
static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *,
					   struct device_attribute *, char *);

static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL);

static struct device_attribute *sbp2_sysfs_sdev_attrs[] = {
	&dev_attr_ieee1394_id,
	NULL
};

285
static struct scsi_host_template sbp2_shost_template = {
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304
	.module			 = THIS_MODULE,
	.name			 = "SBP-2 IEEE-1394",
	.proc_name		 = SBP2_DEVICE_NAME,
	.queuecommand		 = sbp2scsi_queuecommand,
	.eh_abort_handler	 = sbp2scsi_abort,
	.eh_device_reset_handler = sbp2scsi_reset,
	.slave_alloc		 = sbp2scsi_slave_alloc,
	.slave_configure	 = sbp2scsi_slave_configure,
	.slave_destroy		 = sbp2scsi_slave_destroy,
	.this_id		 = -1,
	.sg_tablesize		 = SG_ALL,
	.use_clustering		 = ENABLE_CLUSTERING,
	.cmd_per_lun		 = SBP2_MAX_CMDS,
	.can_queue		 = SBP2_MAX_CMDS,
	.emulated		 = 1,
	.sdev_attrs		 = sbp2_sysfs_sdev_attrs,
};


305
/*
306 307 308 309 310
 * List of devices with known bugs.
 *
 * The firmware_revision field, masked with 0xffff00, is the best indicator
 * for the type of bridge chip of a device.  It yields a few false positives
 * but this did not break correctly behaving devices so far.
311
 */
312 313
static const struct {
	u32 firmware_revision;
314
	u32 model_id;
315 316
	unsigned workarounds;
} sbp2_workarounds_table[] = {
317
	/* DViCO Momobay CX-1 with TSB42AA9 bridge */ {
318
		.firmware_revision	= 0x002800,
319
		.model_id		= 0x001010,
320 321 322 323 324 325 326 327 328 329
		.workarounds		= SBP2_WORKAROUND_INQUIRY_36 |
					  SBP2_WORKAROUND_MODE_SENSE_8,
	},
	/* Initio bridges, actually only needed for some older ones */ {
		.firmware_revision	= 0x000200,
		.workarounds		= SBP2_WORKAROUND_INQUIRY_36,
	},
	/* Symbios bridge */ {
		.firmware_revision	= 0xa0b800,
		.workarounds		= SBP2_WORKAROUND_128K_MAX_TRANS,
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
	},
	/*
	 * Note about the following Apple iPod blacklist entries:
	 *
	 * There are iPods (2nd gen, 3rd gen) with model_id==0.  Since our
	 * matching logic treats 0 as a wildcard, we cannot match this ID
	 * without rewriting the matching routine.  Fortunately these iPods
	 * do not feature the read_capacity bug according to one report.
	 * Read_capacity behaviour as well as model_id could change due to
	 * Apple-supplied firmware updates though.
	 */
	/* iPod 4th generation */ {
		.firmware_revision	= 0x0a2700,
		.model_id		= 0x000021,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod mini */ {
		.firmware_revision	= 0x0a2700,
		.model_id		= 0x000023,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
	},
	/* iPod Photo */ {
		.firmware_revision	= 0x0a2700,
		.model_id		= 0x00007e,
		.workarounds		= SBP2_WORKAROUND_FIX_CAPACITY,
355
	}
L
Linus Torvalds 已提交
356 357 358 359 360 361 362 363 364 365
};

/**************************************
 * General utility functions
 **************************************/

#ifndef __BIG_ENDIAN
/*
 * Converts a buffer from be32 to cpu byte ordering. Length is in bytes.
 */
366
static inline void sbp2util_be32_to_cpu_buffer(void *buffer, int length)
L
Linus Torvalds 已提交
367 368 369 370 371 372 373 374 375 376 377 378
{
	u32 *temp = buffer;

	for (length = (length >> 2); length--; )
		temp[length] = be32_to_cpu(temp[length]);

	return;
}

/*
 * Converts a buffer from cpu to be32 byte ordering. Length is in bytes.
 */
379
static inline void sbp2util_cpu_to_be32_buffer(void *buffer, int length)
L
Linus Torvalds 已提交
380 381 382 383 384 385 386 387 388 389
{
	u32 *temp = buffer;

	for (length = (length >> 2); length--; )
		temp[length] = cpu_to_be32(temp[length]);

	return;
}
#else /* BIG_ENDIAN */
/* Why waste the cpu cycles? */
390 391
#define sbp2util_be32_to_cpu_buffer(x,y) do {} while (0)
#define sbp2util_cpu_to_be32_buffer(x,y) do {} while (0)
L
Linus Torvalds 已提交
392 393
#endif

394
static DECLARE_WAIT_QUEUE_HEAD(sbp2_access_wq);
395

L
Linus Torvalds 已提交
396
/*
397 398
 * Waits for completion of an SBP-2 access request.
 * Returns nonzero if timed out or prematurely interrupted.
L
Linus Torvalds 已提交
399
 */
400 401
static int sbp2util_access_timeout(struct scsi_id_instance_data *scsi_id,
				   int timeout)
L
Linus Torvalds 已提交
402
{
403
	long leftover;
L
Linus Torvalds 已提交
404

405 406
	leftover = wait_event_interruptible_timeout(
			sbp2_access_wq, scsi_id->access_complete, timeout);
407 408
	scsi_id->access_complete = 0;
	return leftover <= 0;
L
Linus Torvalds 已提交
409 410 411 412 413 414 415 416
}

static void sbp2_free_packet(struct hpsb_packet *packet)
{
	hpsb_free_tlabel(packet);
	hpsb_free_packet(packet);
}

417 418 419
/*
 * This is much like hpsb_node_write(), except it ignores the response
 * subaction and returns immediately. Can be used from atomic context.
L
Linus Torvalds 已提交
420 421
 */
static int sbp2util_node_write_no_wait(struct node_entry *ne, u64 addr,
S
Stefan Richter 已提交
422
				       quadlet_t *buffer, size_t length)
L
Linus Torvalds 已提交
423 424 425 426 427
{
	struct hpsb_packet *packet;

	packet = hpsb_make_writepacket(ne->host, ne->nodeid,
				       addr, buffer, length);
S
Stefan Richter 已提交
428 429
	if (!packet)
		return -ENOMEM;
L
Linus Torvalds 已提交
430

S
Stefan Richter 已提交
431 432
	hpsb_set_packet_complete_task(packet,
				      (void (*)(void *))sbp2_free_packet,
L
Linus Torvalds 已提交
433 434 435 436
				      packet);

	hpsb_node_fill_packet(ne, packet);

S
Stefan Richter 已提交
437
	if (hpsb_send_packet(packet) < 0) {
L
Linus Torvalds 已提交
438 439 440 441 442 443 444
		sbp2_free_packet(packet);
		return -EIO;
	}

	return 0;
}

445 446 447 448 449 450 451
static void sbp2util_notify_fetch_agent(struct scsi_id_instance_data *scsi_id,
					u64 offset, quadlet_t *data, size_t len)
{
	/*
	 * There is a small window after a bus reset within which the node
	 * entry's generation is current but the reconnect wasn't completed.
	 */
452
	if (unlikely(atomic_read(&scsi_id->state) == SBP2LU_STATE_IN_RESET))
453 454 455
		return;

	if (hpsb_node_write(scsi_id->ne,
456
			    scsi_id->command_block_agent_addr + offset,
457 458 459 460 461 462
			    data, len))
		SBP2_ERR("sbp2util_notify_fetch_agent failed.");
	/*
	 * Now accept new SCSI commands, unless a bus reset happended during
	 * hpsb_node_write.
	 */
463
	if (likely(atomic_read(&scsi_id->state) != SBP2LU_STATE_IN_RESET))
464 465 466
		scsi_unblock_requests(scsi_id->scsi_host);
}

D
David Howells 已提交
467
static void sbp2util_write_orb_pointer(struct work_struct *work)
468 469 470
{
	quadlet_t data[2];

471 472 473
	data[0] = ORB_SET_NODE_ID(
			(container_of(work, struct scsi_id_instance_data, protocol_work))->hi->host->node_id);
	data[1] = (container_of(work, struct scsi_id_instance_data, protocol_work))->last_orb_dma;
474
	sbp2util_cpu_to_be32_buffer(data, 8);
475
	sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_ORB_POINTER_OFFSET, data, 8);
476 477
}

D
David Howells 已提交
478
static void sbp2util_write_doorbell(struct work_struct *work)
479
{
480
	sbp2util_notify_fetch_agent(container_of(work, struct scsi_id_instance_data, protocol_work), SBP2_DOORBELL_OFFSET, NULL, 4);
481 482
}

L
Linus Torvalds 已提交
483 484
static int sbp2util_create_command_orb_pool(struct scsi_id_instance_data *scsi_id)
{
485
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
486 487 488 489
	int i;
	unsigned long flags, orbs;
	struct sbp2_command_info *command;

490
	orbs = sbp2_serialize_io ? 2 : SBP2_MAX_CMDS;
L
Linus Torvalds 已提交
491

492
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
493
	for (i = 0; i < orbs; i++) {
S
Stefan Richter 已提交
494
		command = kzalloc(sizeof(*command), GFP_ATOMIC);
L
Linus Torvalds 已提交
495
		if (!command) {
496
			spin_unlock_irqrestore(&scsi_id->cmd_orb_lock,
S
Stefan Richter 已提交
497 498
					       flags);
			return -ENOMEM;
L
Linus Torvalds 已提交
499 500
		}
		command->command_orb_dma =
S
Stefan Richter 已提交
501 502
		    pci_map_single(hi->host->pdev, &command->command_orb,
				   sizeof(struct sbp2_command_orb),
503
				   PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
504
		command->sge_dma =
S
Stefan Richter 已提交
505 506 507 508
		    pci_map_single(hi->host->pdev,
				   &command->scatter_gather_element,
				   sizeof(command->scatter_gather_element),
				   PCI_DMA_BIDIRECTIONAL);
L
Linus Torvalds 已提交
509
		INIT_LIST_HEAD(&command->list);
510
		list_add_tail(&command->list, &scsi_id->cmd_orb_completed);
L
Linus Torvalds 已提交
511
	}
512
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
513 514 515 516 517 518 519 520 521 522
	return 0;
}

static void sbp2util_remove_command_orb_pool(struct scsi_id_instance_data *scsi_id)
{
	struct hpsb_host *host = scsi_id->hi->host;
	struct list_head *lh, *next;
	struct sbp2_command_info *command;
	unsigned long flags;

523 524 525
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
	if (!list_empty(&scsi_id->cmd_orb_completed)) {
		list_for_each_safe(lh, next, &scsi_id->cmd_orb_completed) {
L
Linus Torvalds 已提交
526 527 528
			command = list_entry(lh, struct sbp2_command_info, list);
			pci_unmap_single(host->pdev, command->command_orb_dma,
					 sizeof(struct sbp2_command_orb),
529
					 PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
530 531 532 533 534 535
			pci_unmap_single(host->pdev, command->sge_dma,
					 sizeof(command->scatter_gather_element),
					 PCI_DMA_BIDIRECTIONAL);
			kfree(command);
		}
	}
536
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
537 538 539 540
	return;
}

/*
541 542
 * Finds the sbp2_command for a given outstanding command ORB.
 * Only looks at the in-use list.
L
Linus Torvalds 已提交
543 544 545 546 547 548 549
 */
static struct sbp2_command_info *sbp2util_find_command_for_orb(
		struct scsi_id_instance_data *scsi_id, dma_addr_t orb)
{
	struct sbp2_command_info *command;
	unsigned long flags;

550 551 552
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
	if (!list_empty(&scsi_id->cmd_orb_inuse)) {
		list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list) {
L
Linus Torvalds 已提交
553
			if (command->command_orb_dma == orb) {
554
				spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
S
Stefan Richter 已提交
555
				return command;
L
Linus Torvalds 已提交
556 557 558
			}
		}
	}
559
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
S
Stefan Richter 已提交
560
	return NULL;
L
Linus Torvalds 已提交
561 562 563
}

/*
564 565
 * Finds the sbp2_command for a given outstanding SCpnt.
 * Only looks at the in-use list.
566
 * Must be called with scsi_id->cmd_orb_lock held.
L
Linus Torvalds 已提交
567
 */
568 569
static struct sbp2_command_info *sbp2util_find_command_for_SCpnt(
		struct scsi_id_instance_data *scsi_id, void *SCpnt)
L
Linus Torvalds 已提交
570 571 572
{
	struct sbp2_command_info *command;

573 574
	if (!list_empty(&scsi_id->cmd_orb_inuse))
		list_for_each_entry(command, &scsi_id->cmd_orb_inuse, list)
575
			if (command->Current_SCpnt == SCpnt)
S
Stefan Richter 已提交
576 577
				return command;
	return NULL;
L
Linus Torvalds 已提交
578 579 580 581 582 583 584 585 586 587 588
}

static struct sbp2_command_info *sbp2util_allocate_command_orb(
		struct scsi_id_instance_data *scsi_id,
		struct scsi_cmnd *Current_SCpnt,
		void (*Current_done)(struct scsi_cmnd *))
{
	struct list_head *lh;
	struct sbp2_command_info *command = NULL;
	unsigned long flags;

589 590 591
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
	if (!list_empty(&scsi_id->cmd_orb_completed)) {
		lh = scsi_id->cmd_orb_completed.next;
L
Linus Torvalds 已提交
592 593 594 595
		list_del(lh);
		command = list_entry(lh, struct sbp2_command_info, list);
		command->Current_done = Current_done;
		command->Current_SCpnt = Current_SCpnt;
596
		list_add_tail(&command->list, &scsi_id->cmd_orb_inuse);
L
Linus Torvalds 已提交
597
	} else {
598
		SBP2_ERR("%s: no orbs available", __FUNCTION__);
L
Linus Torvalds 已提交
599
	}
600
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
S
Stefan Richter 已提交
601
	return command;
L
Linus Torvalds 已提交
602 603 604 605 606 607 608 609 610
}

static void sbp2util_free_command_dma(struct sbp2_command_info *command)
{
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)command->Current_SCpnt->device->host->hostdata[0];
	struct hpsb_host *host;

	if (!scsi_id) {
611
		SBP2_ERR("%s: scsi_id == NULL", __FUNCTION__);
L
Linus Torvalds 已提交
612 613 614 615 616 617
		return;
	}

	host = scsi_id->ud->ne->host;

	if (command->cmd_dma) {
618
		if (command->dma_type == CMD_DMA_SINGLE)
L
Linus Torvalds 已提交
619 620
			pci_unmap_single(host->pdev, command->cmd_dma,
					 command->dma_size, command->dma_dir);
621
		else if (command->dma_type == CMD_DMA_PAGE)
L
Linus Torvalds 已提交
622 623
			pci_unmap_page(host->pdev, command->cmd_dma,
				       command->dma_size, command->dma_dir);
624
		/* XXX: Check for CMD_DMA_NONE bug */
L
Linus Torvalds 已提交
625 626 627 628 629 630 631 632 633 634 635 636 637
		command->dma_type = CMD_DMA_NONE;
		command->cmd_dma = 0;
	}

	if (command->sge_buffer) {
		pci_unmap_sg(host->pdev, command->sge_buffer,
			     command->dma_size, command->dma_dir);
		command->sge_buffer = NULL;
	}
}

/*
 * This function moves a command to the completed orb list.
638
 * Must be called with scsi_id->cmd_orb_lock held.
L
Linus Torvalds 已提交
639
 */
640 641 642
static void sbp2util_mark_command_completed(
		struct scsi_id_instance_data *scsi_id,
		struct sbp2_command_info *command)
L
Linus Torvalds 已提交
643 644 645
{
	list_del(&command->list);
	sbp2util_free_command_dma(command);
646
	list_add_tail(&command->list, &scsi_id->cmd_orb_completed);
L
Linus Torvalds 已提交
647 648
}

649 650 651 652 653 654 655 656
/*
 * Is scsi_id valid? Is the 1394 node still present?
 */
static inline int sbp2util_node_is_available(struct scsi_id_instance_data *scsi_id)
{
	return scsi_id && scsi_id->ne && !scsi_id->ne->in_limbo;
}

L
Linus Torvalds 已提交
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672
/*********************************************
 * IEEE-1394 core driver stack related section
 *********************************************/

static int sbp2_probe(struct device *dev)
{
	struct unit_directory *ud;
	struct scsi_id_instance_data *scsi_id;

	ud = container_of(dev, struct unit_directory, device);

	/* Don't probe UD's that have the LUN flag. We'll probe the LUN(s)
	 * instead. */
	if (ud->flags & UNIT_DIRECTORY_HAS_LUN_DIRECTORY)
		return -ENODEV;

S
Stefan Richter 已提交
673
	scsi_id = sbp2_alloc_device(ud);
L
Linus Torvalds 已提交
674

S
Stefan Richter 已提交
675 676
	if (!scsi_id)
		return -ENOMEM;
L
Linus Torvalds 已提交
677

S
Stefan Richter 已提交
678
	sbp2_parse_unit_directory(scsi_id, ud);
L
Linus Torvalds 已提交
679

S
Stefan Richter 已提交
680
	return sbp2_start_device(scsi_id);
L
Linus Torvalds 已提交
681 682 683 684 685 686
}

static int sbp2_remove(struct device *dev)
{
	struct unit_directory *ud;
	struct scsi_id_instance_data *scsi_id;
687
	struct scsi_device *sdev;
L
Linus Torvalds 已提交
688 689 690

	ud = container_of(dev, struct unit_directory, device);
	scsi_id = ud->device.driver_data;
691 692 693
	if (!scsi_id)
		return 0;

694 695 696 697 698
	if (scsi_id->scsi_host) {
		/* Get rid of enqueued commands if there is no chance to
		 * send them. */
		if (!sbp2util_node_is_available(scsi_id))
			sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT);
699
		/* scsi_remove_device() may trigger shutdown functions of SCSI
700
		 * highlevel drivers which would deadlock if blocked. */
701
		atomic_set(&scsi_id->state, SBP2LU_STATE_IN_SHUTDOWN);
702
		scsi_unblock_requests(scsi_id->scsi_host);
703
	}
704 705 706 707 708
	sdev = scsi_id->sdev;
	if (sdev) {
		scsi_id->sdev = NULL;
		scsi_remove_device(sdev);
	}
L
Linus Torvalds 已提交
709 710 711 712 713 714 715 716 717 718 719 720

	sbp2_logout_device(scsi_id);
	sbp2_remove_device(scsi_id);

	return 0;
}

static int sbp2_update(struct unit_directory *ud)
{
	struct scsi_id_instance_data *scsi_id = ud->device.driver_data;

	if (sbp2_reconnect_device(scsi_id)) {
721 722 723
		/* Reconnect has failed. Perhaps we didn't reconnect fast
		 * enough. Try a regular login, but first log out just in
		 * case of any weirdness. */
L
Linus Torvalds 已提交
724 725 726 727 728 729 730 731 732 733 734 735 736 737
		sbp2_logout_device(scsi_id);

		if (sbp2_login_device(scsi_id)) {
			/* Login failed too, just fail, and the backend
			 * will call our sbp2_remove for us */
			SBP2_ERR("Failed to reconnect to sbp2 device!");
			return -EBUSY;
		}
	}

	sbp2_set_busy_timeout(scsi_id);
	sbp2_agent_reset(scsi_id, 1);
	sbp2_max_speed_and_size(scsi_id);

738 739
	/* Complete any pending commands with busy (so they get retried)
	 * and remove them from our queue. */
L
Linus Torvalds 已提交
740 741
	sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);

742 743 744
	/* Accept new commands unless there was another bus reset in the
	 * meantime. */
	if (hpsb_node_entry_valid(scsi_id->ne)) {
745
		atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING);
746 747
		scsi_unblock_requests(scsi_id->scsi_host);
	}
L
Linus Torvalds 已提交
748 749 750 751 752
	return 0;
}

static struct scsi_id_instance_data *sbp2_alloc_device(struct unit_directory *ud)
{
753
	struct sbp2_fwhost_info *hi;
L
Linus Torvalds 已提交
754 755 756
	struct Scsi_Host *scsi_host = NULL;
	struct scsi_id_instance_data *scsi_id = NULL;

S
Stefan Richter 已提交
757
	scsi_id = kzalloc(sizeof(*scsi_id), GFP_KERNEL);
L
Linus Torvalds 已提交
758 759 760 761 762 763 764 765 766
	if (!scsi_id) {
		SBP2_ERR("failed to create scsi_id");
		goto failed_alloc;
	}

	scsi_id->ne = ud->ne;
	scsi_id->ud = ud;
	scsi_id->speed_code = IEEE1394_SPEED_100;
	scsi_id->max_payload_size = sbp2_speedto_max_payload[IEEE1394_SPEED_100];
767
	scsi_id->status_fifo_addr = CSR1212_INVALID_ADDR_SPACE;
768 769
	INIT_LIST_HEAD(&scsi_id->cmd_orb_inuse);
	INIT_LIST_HEAD(&scsi_id->cmd_orb_completed);
L
Linus Torvalds 已提交
770
	INIT_LIST_HEAD(&scsi_id->scsi_list);
771
	spin_lock_init(&scsi_id->cmd_orb_lock);
772
	atomic_set(&scsi_id->state, SBP2LU_STATE_RUNNING);
773
	INIT_WORK(&scsi_id->protocol_work, NULL);
L
Linus Torvalds 已提交
774 775 776 777 778 779 780 781 782 783 784 785 786 787 788

	ud->device.driver_data = scsi_id;

	hi = hpsb_get_hostinfo(&sbp2_highlevel, ud->ne->host);
	if (!hi) {
		hi = hpsb_create_hostinfo(&sbp2_highlevel, ud->ne->host, sizeof(*hi));
		if (!hi) {
			SBP2_ERR("failed to allocate hostinfo");
			goto failed_alloc;
		}
		hi->host = ud->ne->host;
		INIT_LIST_HEAD(&hi->scsi_ids);

#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
		/* Handle data movement if physical dma is not
S
Stefan Richter 已提交
789 790 791 792 793 794 795
		 * enabled or not supported on host controller */
		if (!hpsb_register_addrspace(&sbp2_highlevel, ud->ne->host,
					     &sbp2_physdma_ops,
					     0x0ULL, 0xfffffffcULL)) {
			SBP2_ERR("failed to register lower 4GB address range");
			goto failed_alloc;
		}
L
Linus Torvalds 已提交
796 797 798
#endif
	}

799 800 801 802 803 804
	/* Prevent unloading of the 1394 host */
	if (!try_module_get(hi->host->driver->owner)) {
		SBP2_ERR("failed to get a reference on 1394 host driver");
		goto failed_alloc;
	}

L
Linus Torvalds 已提交
805 806 807 808
	scsi_id->hi = hi;

	list_add_tail(&scsi_id->scsi_list, &hi->scsi_ids);

809 810
	/* Register the status FIFO address range. We could use the same FIFO
	 * for targets at different nodes. However we need different FIFOs per
811 812 813 814 815 816
	 * target in order to support multi-unit devices.
	 * The FIFO is located out of the local host controller's physical range
	 * but, if possible, within the posted write area. Status writes will
	 * then be performed as unified transactions. This slightly reduces
	 * bandwidth usage, and some Prolific based devices seem to require it.
	 */
817 818 819
	scsi_id->status_fifo_addr = hpsb_allocate_and_register_addrspace(
			&sbp2_highlevel, ud->ne->host, &sbp2_ops,
			sizeof(struct sbp2_status_block), sizeof(quadlet_t),
820
			ud->ne->host->low_addr_space, CSR1212_ALL_SPACE_END);
821
	if (scsi_id->status_fifo_addr == CSR1212_INVALID_ADDR_SPACE) {
822 823 824 825
		SBP2_ERR("failed to allocate status FIFO address range");
		goto failed_alloc;
	}

826
	scsi_host = scsi_host_alloc(&sbp2_shost_template,
S
Stefan Richter 已提交
827
				    sizeof(unsigned long));
L
Linus Torvalds 已提交
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849
	if (!scsi_host) {
		SBP2_ERR("failed to register scsi host");
		goto failed_alloc;
	}

	scsi_host->hostdata[0] = (unsigned long)scsi_id;

	if (!scsi_add_host(scsi_host, &ud->device)) {
		scsi_id->scsi_host = scsi_host;
		return scsi_id;
	}

	SBP2_ERR("failed to add scsi host");
	scsi_host_put(scsi_host);

failed_alloc:
	sbp2_remove_device(scsi_id);
	return NULL;
}

static void sbp2_host_reset(struct hpsb_host *host)
{
850
	struct sbp2_fwhost_info *hi;
L
Linus Torvalds 已提交
851 852 853
	struct scsi_id_instance_data *scsi_id;

	hi = hpsb_get_hostinfo(&sbp2_highlevel, host);
854 855 856 857 858 859
	if (!hi)
		return;
	list_for_each_entry(scsi_id, &hi->scsi_ids, scsi_list)
		if (likely(atomic_read(&scsi_id->state) !=
			   SBP2LU_STATE_IN_SHUTDOWN)) {
			atomic_set(&scsi_id->state, SBP2LU_STATE_IN_RESET);
L
Linus Torvalds 已提交
860
			scsi_block_requests(scsi_id->scsi_host);
861
		}
L
Linus Torvalds 已提交
862 863 864 865
}

static int sbp2_start_device(struct scsi_id_instance_data *scsi_id)
{
866
	struct sbp2_fwhost_info *hi = scsi_id->hi;
867
	int error;
L
Linus Torvalds 已提交
868 869

	scsi_id->login_response =
S
Stefan Richter 已提交
870 871
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_login_response),
L
Linus Torvalds 已提交
872 873 874 875 876
				     &scsi_id->login_response_dma);
	if (!scsi_id->login_response)
		goto alloc_fail;

	scsi_id->query_logins_orb =
S
Stefan Richter 已提交
877 878
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_query_logins_orb),
L
Linus Torvalds 已提交
879 880 881 882 883
				     &scsi_id->query_logins_orb_dma);
	if (!scsi_id->query_logins_orb)
		goto alloc_fail;

	scsi_id->query_logins_response =
S
Stefan Richter 已提交
884 885
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_query_logins_response),
L
Linus Torvalds 已提交
886 887 888 889 890
				     &scsi_id->query_logins_response_dma);
	if (!scsi_id->query_logins_response)
		goto alloc_fail;

	scsi_id->reconnect_orb =
S
Stefan Richter 已提交
891 892
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_reconnect_orb),
L
Linus Torvalds 已提交
893 894 895 896 897
				     &scsi_id->reconnect_orb_dma);
	if (!scsi_id->reconnect_orb)
		goto alloc_fail;

	scsi_id->logout_orb =
S
Stefan Richter 已提交
898 899
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_logout_orb),
L
Linus Torvalds 已提交
900 901 902 903 904
				     &scsi_id->logout_orb_dma);
	if (!scsi_id->logout_orb)
		goto alloc_fail;

	scsi_id->login_orb =
S
Stefan Richter 已提交
905 906
		pci_alloc_consistent(hi->host->pdev,
				     sizeof(struct sbp2_login_orb),
L
Linus Torvalds 已提交
907
				     &scsi_id->login_orb_dma);
908 909
	if (!scsi_id->login_orb)
		goto alloc_fail;
L
Linus Torvalds 已提交
910 911 912 913 914 915 916

	if (sbp2util_create_command_orb_pool(scsi_id)) {
		SBP2_ERR("sbp2util_create_command_orb_pool failed!");
		sbp2_remove_device(scsi_id);
		return -ENOMEM;
	}

917 918
	/* Wait a second before trying to log in. Previously logged in
	 * initiators need a chance to reconnect. */
S
Stefan Richter 已提交
919
	if (msleep_interruptible(1000)) {
L
Linus Torvalds 已提交
920 921 922
		sbp2_remove_device(scsi_id);
		return -EINTR;
	}
S
Stefan Richter 已提交
923

L
Linus Torvalds 已提交
924 925 926 927 928 929 930 931 932
	if (sbp2_login_device(scsi_id)) {
		sbp2_remove_device(scsi_id);
		return -EBUSY;
	}

	sbp2_set_busy_timeout(scsi_id);
	sbp2_agent_reset(scsi_id, 1);
	sbp2_max_speed_and_size(scsi_id);

933 934
	error = scsi_add_device(scsi_id->scsi_host, 0, scsi_id->ud->id, 0);
	if (error) {
L
Linus Torvalds 已提交
935
		SBP2_ERR("scsi_add_device failed");
936 937
		sbp2_logout_device(scsi_id);
		sbp2_remove_device(scsi_id);
938
		return error;
L
Linus Torvalds 已提交
939 940 941
	}

	return 0;
942 943 944 945 946

alloc_fail:
	SBP2_ERR("Could not allocate memory for scsi_id");
	sbp2_remove_device(scsi_id);
	return -ENOMEM;
L
Linus Torvalds 已提交
947 948 949 950
}

static void sbp2_remove_device(struct scsi_id_instance_data *scsi_id)
{
951
	struct sbp2_fwhost_info *hi;
L
Linus Torvalds 已提交
952 953 954 955 956 957 958 959 960 961

	if (!scsi_id)
		return;

	hi = scsi_id->hi;

	if (scsi_id->scsi_host) {
		scsi_remove_host(scsi_id->scsi_host);
		scsi_host_put(scsi_id->scsi_host);
	}
962
	flush_scheduled_work();
L
Linus Torvalds 已提交
963 964 965 966
	sbp2util_remove_command_orb_pool(scsi_id);

	list_del(&scsi_id->scsi_list);

967
	if (scsi_id->login_response)
L
Linus Torvalds 已提交
968 969 970 971
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_login_response),
				    scsi_id->login_response,
				    scsi_id->login_response_dma);
972
	if (scsi_id->login_orb)
L
Linus Torvalds 已提交
973 974 975 976
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_login_orb),
				    scsi_id->login_orb,
				    scsi_id->login_orb_dma);
977
	if (scsi_id->reconnect_orb)
L
Linus Torvalds 已提交
978 979 980 981
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_reconnect_orb),
				    scsi_id->reconnect_orb,
				    scsi_id->reconnect_orb_dma);
982
	if (scsi_id->logout_orb)
L
Linus Torvalds 已提交
983 984 985 986
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_logout_orb),
				    scsi_id->logout_orb,
				    scsi_id->logout_orb_dma);
987
	if (scsi_id->query_logins_orb)
L
Linus Torvalds 已提交
988 989 990 991
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_query_logins_orb),
				    scsi_id->query_logins_orb,
				    scsi_id->query_logins_orb_dma);
992
	if (scsi_id->query_logins_response)
L
Linus Torvalds 已提交
993 994 995 996 997
		pci_free_consistent(hi->host->pdev,
				    sizeof(struct sbp2_query_logins_response),
				    scsi_id->query_logins_response,
				    scsi_id->query_logins_response_dma);

998
	if (scsi_id->status_fifo_addr != CSR1212_INVALID_ADDR_SPACE)
999
		hpsb_unregister_addrspace(&sbp2_highlevel, hi->host,
1000
					  scsi_id->status_fifo_addr);
1001

L
Linus Torvalds 已提交
1002 1003
	scsi_id->ud->device.driver_data = NULL;

1004 1005 1006
	if (hi)
		module_put(hi->host->driver->owner);

L
Linus Torvalds 已提交
1007 1008 1009 1010 1011
	kfree(scsi_id);
}

#ifdef CONFIG_IEEE1394_SBP2_PHYS_DMA
/*
1012 1013
 * Deal with write requests on adapters which do not support physical DMA or
 * have it switched off.
L
Linus Torvalds 已提交
1014
 */
S
Stefan Richter 已提交
1015 1016 1017
static int sbp2_handle_physdma_write(struct hpsb_host *host, int nodeid,
				     int destid, quadlet_t *data, u64 addr,
				     size_t length, u16 flags)
L
Linus Torvalds 已提交
1018
{
S
Stefan Richter 已提交
1019 1020
	memcpy(bus_to_virt((u32) addr), data, length);
	return RCODE_COMPLETE;
L
Linus Torvalds 已提交
1021 1022 1023
}

/*
1024 1025
 * Deal with read requests on adapters which do not support physical DMA or
 * have it switched off.
L
Linus Torvalds 已提交
1026
 */
S
Stefan Richter 已提交
1027 1028 1029
static int sbp2_handle_physdma_read(struct hpsb_host *host, int nodeid,
				    quadlet_t *data, u64 addr, size_t length,
				    u16 flags)
L
Linus Torvalds 已提交
1030
{
S
Stefan Richter 已提交
1031 1032
	memcpy(data, bus_to_virt((u32) addr), length);
	return RCODE_COMPLETE;
L
Linus Torvalds 已提交
1033 1034 1035 1036 1037 1038 1039 1040 1041
}
#endif

/**************************************
 * SBP-2 protocol related section
 **************************************/

static int sbp2_query_logins(struct scsi_id_instance_data *scsi_id)
{
1042
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054
	quadlet_t data[2];
	int max_logins;
	int active_logins;

	scsi_id->query_logins_orb->reserved1 = 0x0;
	scsi_id->query_logins_orb->reserved2 = 0x0;

	scsi_id->query_logins_orb->query_response_lo = scsi_id->query_logins_response_dma;
	scsi_id->query_logins_orb->query_response_hi = ORB_SET_NODE_ID(hi->host->node_id);

	scsi_id->query_logins_orb->lun_misc = ORB_SET_FUNCTION(SBP2_QUERY_LOGINS_REQUEST);
	scsi_id->query_logins_orb->lun_misc |= ORB_SET_NOTIFY(1);
1055
	scsi_id->query_logins_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun);
L
Linus Torvalds 已提交
1056 1057 1058 1059

	scsi_id->query_logins_orb->reserved_resp_length =
		ORB_SET_QUERY_LOGINS_RESP_LENGTH(sizeof(struct sbp2_query_logins_response));

1060 1061 1062 1063
	scsi_id->query_logins_orb->status_fifo_hi =
		ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id);
	scsi_id->query_logins_orb->status_fifo_lo =
		ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr);
L
Linus Torvalds 已提交
1064 1065 1066 1067 1068 1069 1070 1071 1072

	sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_orb, sizeof(struct sbp2_query_logins_orb));

	memset(scsi_id->query_logins_response, 0, sizeof(struct sbp2_query_logins_response));

	data[0] = ORB_SET_NODE_ID(hi->host->node_id);
	data[1] = scsi_id->query_logins_orb_dma;
	sbp2util_cpu_to_be32_buffer(data, 8);

1073
	hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8);
L
Linus Torvalds 已提交
1074

1075
	if (sbp2util_access_timeout(scsi_id, 2*HZ)) {
L
Linus Torvalds 已提交
1076
		SBP2_INFO("Error querying logins to SBP-2 device - timed out");
S
Stefan Richter 已提交
1077
		return -EIO;
L
Linus Torvalds 已提交
1078 1079 1080 1081
	}

	if (scsi_id->status_block.ORB_offset_lo != scsi_id->query_logins_orb_dma) {
		SBP2_INFO("Error querying logins to SBP-2 device - timed out");
S
Stefan Richter 已提交
1082
		return -EIO;
L
Linus Torvalds 已提交
1083 1084
	}

1085 1086
	if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) {
		SBP2_INFO("Error querying logins to SBP-2 device - failed");
S
Stefan Richter 已提交
1087
		return -EIO;
L
Linus Torvalds 已提交
1088 1089 1090 1091 1092
	}

	sbp2util_cpu_to_be32_buffer(scsi_id->query_logins_response, sizeof(struct sbp2_query_logins_response));

	max_logins = RESPONSE_GET_MAX_LOGINS(scsi_id->query_logins_response->length_max_logins);
1093
	SBP2_INFO("Maximum concurrent logins supported: %d", max_logins);
L
Linus Torvalds 已提交
1094 1095

	active_logins = RESPONSE_GET_ACTIVE_LOGINS(scsi_id->query_logins_response->length_max_logins);
1096
	SBP2_INFO("Number of active logins: %d", active_logins);
L
Linus Torvalds 已提交
1097 1098

	if (active_logins >= max_logins) {
S
Stefan Richter 已提交
1099
		return -EIO;
L
Linus Torvalds 已提交
1100 1101 1102 1103 1104 1105 1106
	}

	return 0;
}

static int sbp2_login_device(struct scsi_id_instance_data *scsi_id)
{
1107
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1108 1109
	quadlet_t data[2];

1110
	if (!scsi_id->login_orb)
S
Stefan Richter 已提交
1111
		return -EIO;
L
Linus Torvalds 已提交
1112

1113 1114 1115
	if (!sbp2_exclusive_login && sbp2_query_logins(scsi_id)) {
		SBP2_INFO("Device does not support any more concurrent logins");
		return -EIO;
L
Linus Torvalds 已提交
1116 1117
	}

1118
	/* assume no password */
L
Linus Torvalds 已提交
1119 1120 1121 1122 1123 1124
	scsi_id->login_orb->password_hi = 0;
	scsi_id->login_orb->password_lo = 0;

	scsi_id->login_orb->login_response_lo = scsi_id->login_response_dma;
	scsi_id->login_orb->login_response_hi = ORB_SET_NODE_ID(hi->host->node_id);
	scsi_id->login_orb->lun_misc = ORB_SET_FUNCTION(SBP2_LOGIN_REQUEST);
1125 1126 1127

	/* one second reconnect time */
	scsi_id->login_orb->lun_misc |= ORB_SET_RECONNECT(0);
1128
	scsi_id->login_orb->lun_misc |= ORB_SET_EXCLUSIVE(sbp2_exclusive_login);
1129
	scsi_id->login_orb->lun_misc |= ORB_SET_NOTIFY(1);
1130
	scsi_id->login_orb->lun_misc |= ORB_SET_LUN(scsi_id->lun);
L
Linus Torvalds 已提交
1131 1132 1133 1134

	scsi_id->login_orb->passwd_resp_lengths =
		ORB_SET_LOGIN_RESP_LENGTH(sizeof(struct sbp2_login_response));

1135 1136 1137 1138
	scsi_id->login_orb->status_fifo_hi =
		ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id);
	scsi_id->login_orb->status_fifo_lo =
		ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr);
L
Linus Torvalds 已提交
1139 1140 1141 1142 1143 1144 1145 1146 1147

	sbp2util_cpu_to_be32_buffer(scsi_id->login_orb, sizeof(struct sbp2_login_orb));

	memset(scsi_id->login_response, 0, sizeof(struct sbp2_login_response));

	data[0] = ORB_SET_NODE_ID(hi->host->node_id);
	data[1] = scsi_id->login_orb_dma;
	sbp2util_cpu_to_be32_buffer(data, 8);

1148
	hpsb_node_write(scsi_id->ne, scsi_id->management_agent_addr, data, 8);
L
Linus Torvalds 已提交
1149

1150
	/* wait up to 20 seconds for login status */
1151 1152
	if (sbp2util_access_timeout(scsi_id, 20*HZ)) {
		SBP2_ERR("Error logging into SBP-2 device - timed out");
S
Stefan Richter 已提交
1153
		return -EIO;
L
Linus Torvalds 已提交
1154 1155
	}

1156
	/* make sure that the returned status matches the login ORB */
L
Linus Torvalds 已提交
1157
	if (scsi_id->status_block.ORB_offset_lo != scsi_id->login_orb_dma) {
1158
		SBP2_ERR("Error logging into SBP-2 device - timed out");
S
Stefan Richter 已提交
1159
		return -EIO;
L
Linus Torvalds 已提交
1160 1161
	}

1162 1163
	if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) {
		SBP2_ERR("Error logging into SBP-2 device - failed");
S
Stefan Richter 已提交
1164
		return -EIO;
L
Linus Torvalds 已提交
1165 1166 1167
	}

	sbp2util_cpu_to_be32_buffer(scsi_id->login_response, sizeof(struct sbp2_login_response));
1168
	scsi_id->command_block_agent_addr =
L
Linus Torvalds 已提交
1169
		((u64)scsi_id->login_response->command_block_agent_hi) << 32;
1170 1171
	scsi_id->command_block_agent_addr |= ((u64)scsi_id->login_response->command_block_agent_lo);
	scsi_id->command_block_agent_addr &= 0x0000ffffffffffffULL;
L
Linus Torvalds 已提交
1172 1173

	SBP2_INFO("Logged into SBP-2 device");
S
Stefan Richter 已提交
1174
	return 0;
L
Linus Torvalds 已提交
1175 1176 1177 1178
}

static int sbp2_logout_device(struct scsi_id_instance_data *scsi_id)
{
1179
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192
	quadlet_t data[2];
	int error;

	scsi_id->logout_orb->reserved1 = 0x0;
	scsi_id->logout_orb->reserved2 = 0x0;
	scsi_id->logout_orb->reserved3 = 0x0;
	scsi_id->logout_orb->reserved4 = 0x0;

	scsi_id->logout_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_LOGOUT_REQUEST);
	scsi_id->logout_orb->login_ID_misc |= ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID);
	scsi_id->logout_orb->login_ID_misc |= ORB_SET_NOTIFY(1);

	scsi_id->logout_orb->reserved5 = 0x0;
1193 1194 1195 1196
	scsi_id->logout_orb->status_fifo_hi =
		ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id);
	scsi_id->logout_orb->status_fifo_lo =
		ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr);
L
Linus Torvalds 已提交
1197 1198 1199 1200 1201 1202 1203 1204

	sbp2util_cpu_to_be32_buffer(scsi_id->logout_orb, sizeof(struct sbp2_logout_orb));

	data[0] = ORB_SET_NODE_ID(hi->host->node_id);
	data[1] = scsi_id->logout_orb_dma;
	sbp2util_cpu_to_be32_buffer(data, 8);

	error = hpsb_node_write(scsi_id->ne,
1205
				scsi_id->management_agent_addr, data, 8);
L
Linus Torvalds 已提交
1206 1207 1208
	if (error)
		return error;

1209
	/* wait up to 1 second for the device to complete logout */
1210
	if (sbp2util_access_timeout(scsi_id, HZ))
L
Linus Torvalds 已提交
1211 1212 1213
		return -EIO;

	SBP2_INFO("Logged out of SBP-2 device");
S
Stefan Richter 已提交
1214
	return 0;
L
Linus Torvalds 已提交
1215 1216 1217 1218
}

static int sbp2_reconnect_device(struct scsi_id_instance_data *scsi_id)
{
1219
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233
	quadlet_t data[2];
	int error;

	scsi_id->reconnect_orb->reserved1 = 0x0;
	scsi_id->reconnect_orb->reserved2 = 0x0;
	scsi_id->reconnect_orb->reserved3 = 0x0;
	scsi_id->reconnect_orb->reserved4 = 0x0;

	scsi_id->reconnect_orb->login_ID_misc = ORB_SET_FUNCTION(SBP2_RECONNECT_REQUEST);
	scsi_id->reconnect_orb->login_ID_misc |=
		ORB_SET_LOGIN_ID(scsi_id->login_response->length_login_ID);
	scsi_id->reconnect_orb->login_ID_misc |= ORB_SET_NOTIFY(1);

	scsi_id->reconnect_orb->reserved5 = 0x0;
1234 1235 1236 1237
	scsi_id->reconnect_orb->status_fifo_hi =
		ORB_SET_STATUS_FIFO_HI(scsi_id->status_fifo_addr, hi->host->node_id);
	scsi_id->reconnect_orb->status_fifo_lo =
		ORB_SET_STATUS_FIFO_LO(scsi_id->status_fifo_addr);
L
Linus Torvalds 已提交
1238 1239 1240 1241 1242 1243 1244 1245

	sbp2util_cpu_to_be32_buffer(scsi_id->reconnect_orb, sizeof(struct sbp2_reconnect_orb));

	data[0] = ORB_SET_NODE_ID(hi->host->node_id);
	data[1] = scsi_id->reconnect_orb_dma;
	sbp2util_cpu_to_be32_buffer(data, 8);

	error = hpsb_node_write(scsi_id->ne,
1246
				scsi_id->management_agent_addr, data, 8);
L
Linus Torvalds 已提交
1247 1248 1249
	if (error)
		return error;

1250
	/* wait up to 1 second for reconnect status */
1251 1252
	if (sbp2util_access_timeout(scsi_id, HZ)) {
		SBP2_ERR("Error reconnecting to SBP-2 device - timed out");
S
Stefan Richter 已提交
1253
		return -EIO;
L
Linus Torvalds 已提交
1254 1255
	}

1256
	/* make sure that the returned status matches the reconnect ORB */
L
Linus Torvalds 已提交
1257
	if (scsi_id->status_block.ORB_offset_lo != scsi_id->reconnect_orb_dma) {
1258
		SBP2_ERR("Error reconnecting to SBP-2 device - timed out");
S
Stefan Richter 已提交
1259
		return -EIO;
L
Linus Torvalds 已提交
1260 1261
	}

1262 1263
	if (STATUS_TEST_RDS(scsi_id->status_block.ORB_offset_hi_misc)) {
		SBP2_ERR("Error reconnecting to SBP-2 device - failed");
S
Stefan Richter 已提交
1264
		return -EIO;
L
Linus Torvalds 已提交
1265 1266
	}

1267
	SBP2_INFO("Reconnected to SBP-2 device");
S
Stefan Richter 已提交
1268
	return 0;
L
Linus Torvalds 已提交
1269 1270 1271
}

/*
1272 1273
 * Set the target node's Single Phase Retry limit. Affects the target's retry
 * behaviour if our node is too busy to accept requests.
L
Linus Torvalds 已提交
1274 1275 1276 1277 1278 1279
 */
static int sbp2_set_busy_timeout(struct scsi_id_instance_data *scsi_id)
{
	quadlet_t data;

	data = cpu_to_be32(SBP2_BUSY_TIMEOUT_VALUE);
1280 1281
	if (hpsb_node_write(scsi_id->ne, SBP2_BUSY_TIMEOUT_ADDRESS, &data, 4))
		SBP2_ERR("%s error", __FUNCTION__);
S
Stefan Richter 已提交
1282
	return 0;
L
Linus Torvalds 已提交
1283 1284 1285 1286 1287 1288 1289 1290 1291
}

static void sbp2_parse_unit_directory(struct scsi_id_instance_data *scsi_id,
				      struct unit_directory *ud)
{
	struct csr1212_keyval *kv;
	struct csr1212_dentry *dentry;
	u64 management_agent_addr;
	u32 command_set_spec_id, command_set, unit_characteristics,
1292 1293
	    firmware_revision;
	unsigned workarounds;
L
Linus Torvalds 已提交
1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304
	int i;

	management_agent_addr = 0x0;
	command_set_spec_id = 0x0;
	command_set = 0x0;
	unit_characteristics = 0x0;
	firmware_revision = 0x0;

	csr1212_for_each_dir_entry(ud->ne->csr, kv, ud->ud_kv, dentry) {
		switch (kv->key.id) {
		case CSR1212_KV_ID_DEPENDENT_INFO:
1305
			if (kv->key.type == CSR1212_KV_TYPE_CSR_OFFSET)
L
Linus Torvalds 已提交
1306
				management_agent_addr =
S
Stefan Richter 已提交
1307 1308
				    CSR1212_REGISTER_SPACE_BASE +
				    (kv->value.csr_offset << 2);
L
Linus Torvalds 已提交
1309

1310
			else if (kv->key.type == CSR1212_KV_TYPE_IMMEDIATE)
1311
				scsi_id->lun =
S
Stefan Richter 已提交
1312
				    ORB_SET_LUN(kv->value.immediate);
L
Linus Torvalds 已提交
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
			break;

		case SBP2_COMMAND_SET_SPEC_ID_KEY:
			command_set_spec_id = kv->value.immediate;
			break;

		case SBP2_COMMAND_SET_KEY:
			command_set = kv->value.immediate;
			break;

		case SBP2_UNIT_CHARACTERISTICS_KEY:
1324 1325
			/* FIXME: This is ignored so far.
			 * See SBP-2 clause 7.4.8. */
L
Linus Torvalds 已提交
1326 1327 1328 1329 1330 1331 1332 1333
			unit_characteristics = kv->value.immediate;
			break;

		case SBP2_FIRMWARE_REVISION_KEY:
			firmware_revision = kv->value.immediate;
			break;

		default:
1334 1335 1336
			/* FIXME: Check for SBP2_DEVICE_TYPE_AND_LUN_KEY.
			 * Its "ordered" bit has consequences for command ORB
			 * list handling. See SBP-2 clauses 4.6, 7.4.11, 10.2 */
L
Linus Torvalds 已提交
1337 1338 1339 1340
			break;
		}
	}

1341
	workarounds = sbp2_default_workarounds;
L
Linus Torvalds 已提交
1342

1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354
	if (!(workarounds & SBP2_WORKAROUND_OVERRIDE))
		for (i = 0; i < ARRAY_SIZE(sbp2_workarounds_table); i++) {
			if (sbp2_workarounds_table[i].firmware_revision &&
			    sbp2_workarounds_table[i].firmware_revision !=
			    (firmware_revision & 0xffff00))
				continue;
			if (sbp2_workarounds_table[i].model_id &&
			    sbp2_workarounds_table[i].model_id != ud->model_id)
				continue;
			workarounds |= sbp2_workarounds_table[i].workarounds;
			break;
		}
L
Linus Torvalds 已提交
1355

1356
	if (workarounds)
1357 1358 1359
		SBP2_INFO("Workarounds for node " NODE_BUS_FMT ": 0x%x "
			  "(firmware_revision 0x%06x, vendor_id 0x%06x,"
			  " model_id 0x%06x)",
1360
			  NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
1361 1362 1363
			  workarounds, firmware_revision,
			  ud->vendor_id ? ud->vendor_id : ud->ne->vendor_id,
			  ud->model_id);
1364 1365 1366 1367

	/* We would need one SCSI host template for each target to adjust
	 * max_sectors on the fly, therefore warn only. */
	if (workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
1368
	    (sbp2_max_sectors * 512) > (128 * 1024))
1369
		SBP2_INFO("Node " NODE_BUS_FMT ": Bridge only supports 128KB "
1370 1371 1372
			  "max transfer size. WARNING: Current max_sectors "
			  "setting is larger than 128KB (%d sectors)",
			  NODE_BUS_ARGS(ud->ne->host, ud->ne->nodeid),
1373
			  sbp2_max_sectors);
1374

L
Linus Torvalds 已提交
1375 1376 1377 1378 1379 1380 1381
	/* If this is a logical unit directory entry, process the parent
	 * to get the values. */
	if (ud->flags & UNIT_DIRECTORY_LUN_DIRECTORY) {
		struct unit_directory *parent_ud =
			container_of(ud->device.parent, struct unit_directory, device);
		sbp2_parse_unit_directory(scsi_id, parent_ud);
	} else {
1382 1383 1384 1385 1386
		scsi_id->management_agent_addr = management_agent_addr;
		scsi_id->command_set_spec_id = command_set_spec_id;
		scsi_id->command_set = command_set;
		scsi_id->unit_characteristics = unit_characteristics;
		scsi_id->firmware_revision = firmware_revision;
L
Linus Torvalds 已提交
1387 1388
		scsi_id->workarounds = workarounds;
		if (ud->flags & UNIT_DIRECTORY_HAS_LUN)
1389
			scsi_id->lun = ORB_SET_LUN(ud->lun);
L
Linus Torvalds 已提交
1390 1391 1392
	}
}

1393 1394
#define SBP2_PAYLOAD_TO_BYTES(p) (1 << ((p) + 2))

L
Linus Torvalds 已提交
1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405
/*
 * This function is called in order to determine the max speed and packet
 * size we can use in our ORBs. Note, that we (the driver and host) only
 * initiate the transaction. The SBP-2 device actually transfers the data
 * (by reading from the DMA area we tell it). This means that the SBP-2
 * device decides the actual maximum data it can transfer. We just tell it
 * the speed that it needs to use, and the max_rec the host supports, and
 * it takes care of the rest.
 */
static int sbp2_max_speed_and_size(struct scsi_id_instance_data *scsi_id)
{
1406
	struct sbp2_fwhost_info *hi = scsi_id->hi;
1407
	u8 payload;
L
Linus Torvalds 已提交
1408

S
Stefan Richter 已提交
1409
	scsi_id->speed_code =
1410
	    hi->host->speed[NODEID_TO_NODE(scsi_id->ne->nodeid)];
L
Linus Torvalds 已提交
1411

1412 1413 1414 1415
	if (scsi_id->speed_code > sbp2_max_speed) {
		scsi_id->speed_code = sbp2_max_speed;
		SBP2_INFO("Reducing speed to %s",
			  hpsb_speedto_str[sbp2_max_speed]);
L
Linus Torvalds 已提交
1416 1417 1418 1419
	}

	/* Payload size is the lesser of what our speed supports and what
	 * our host supports.  */
1420 1421 1422 1423 1424 1425 1426 1427 1428
	payload = min(sbp2_speedto_max_payload[scsi_id->speed_code],
		      (u8) (hi->host->csr.max_rec - 1));

	/* If physical DMA is off, work around limitation in ohci1394:
	 * packet size must not exceed PAGE_SIZE */
	if (scsi_id->ne->host->low_addr_space < (1ULL << 32))
		while (SBP2_PAYLOAD_TO_BYTES(payload) + 24 > PAGE_SIZE &&
		       payload)
			payload--;
L
Linus Torvalds 已提交
1429

1430 1431 1432 1433
	SBP2_INFO("Node " NODE_BUS_FMT ": Max speed [%s] - Max payload [%u]",
		  NODE_BUS_ARGS(hi->host, scsi_id->ne->nodeid),
		  hpsb_speedto_str[scsi_id->speed_code],
		  SBP2_PAYLOAD_TO_BYTES(payload));
L
Linus Torvalds 已提交
1434

1435
	scsi_id->max_payload_size = payload;
S
Stefan Richter 已提交
1436
	return 0;
L
Linus Torvalds 已提交
1437 1438 1439 1440 1441 1442 1443
}

static int sbp2_agent_reset(struct scsi_id_instance_data *scsi_id, int wait)
{
	quadlet_t data;
	u64 addr;
	int retval;
1444
	unsigned long flags;
L
Linus Torvalds 已提交
1445

1446
	/* cancel_delayed_work(&scsi_id->protocol_work); */
1447 1448 1449
	if (wait)
		flush_scheduled_work();

L
Linus Torvalds 已提交
1450
	data = ntohl(SBP2_AGENT_RESET_DATA);
1451
	addr = scsi_id->command_block_agent_addr + SBP2_AGENT_RESET_OFFSET;
L
Linus Torvalds 已提交
1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462

	if (wait)
		retval = hpsb_node_write(scsi_id->ne, addr, &data, 4);
	else
		retval = sbp2util_node_write_no_wait(scsi_id->ne, addr, &data, 4);

	if (retval < 0) {
		SBP2_ERR("hpsb_node_write failed.\n");
		return -EIO;
	}

1463
	/* make sure that the ORB_POINTER is written on next command */
1464
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1465
	scsi_id->last_orb = NULL;
1466
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1467

S
Stefan Richter 已提交
1468
	return 0;
L
Linus Torvalds 已提交
1469 1470
}

1471
static void sbp2_prep_command_orb_sg(struct sbp2_command_orb *orb,
1472
				     struct sbp2_fwhost_info *hi,
1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
				     struct sbp2_command_info *command,
				     unsigned int scsi_use_sg,
				     struct scatterlist *sgpnt,
				     u32 orb_direction,
				     enum dma_data_direction dma_dir)
{
	command->dma_dir = dma_dir;
	orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
	orb->misc |= ORB_SET_DIRECTION(orb_direction);

1483
	/* special case if only one element (and less than 64KB in size) */
1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512
	if ((scsi_use_sg == 1) &&
	    (sgpnt[0].length <= SBP2_MAX_SG_ELEMENT_LENGTH)) {

		command->dma_size = sgpnt[0].length;
		command->dma_type = CMD_DMA_PAGE;
		command->cmd_dma = pci_map_page(hi->host->pdev,
						sgpnt[0].page,
						sgpnt[0].offset,
						command->dma_size,
						command->dma_dir);

		orb->data_descriptor_lo = command->cmd_dma;
		orb->misc |= ORB_SET_DATA_SIZE(command->dma_size);

	} else {
		struct sbp2_unrestricted_page_table *sg_element =
					&command->scatter_gather_element[0];
		u32 sg_count, sg_len;
		dma_addr_t sg_addr;
		int i, count = pci_map_sg(hi->host->pdev, sgpnt, scsi_use_sg,
					  dma_dir);

		command->dma_size = scsi_use_sg;
		command->sge_buffer = sgpnt;

		/* use page tables (s/g) */
		orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1);
		orb->data_descriptor_lo = command->sge_dma;

1513 1514
		/* loop through and fill out our SBP-2 page tables
		 * (and split up anything too large) */
1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542
		for (i = 0, sg_count = 0 ; i < count; i++, sgpnt++) {
			sg_len = sg_dma_len(sgpnt);
			sg_addr = sg_dma_address(sgpnt);
			while (sg_len) {
				sg_element[sg_count].segment_base_lo = sg_addr;
				if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
					sg_element[sg_count].length_segment_base_hi =
						PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
					sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
					sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
				} else {
					sg_element[sg_count].length_segment_base_hi =
						PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
					sg_len = 0;
				}
				sg_count++;
			}
		}

		orb->misc |= ORB_SET_DATA_SIZE(sg_count);

		sbp2util_cpu_to_be32_buffer(sg_element,
					    (sizeof(struct sbp2_unrestricted_page_table)) *
					    sg_count);
	}
}

static void sbp2_prep_command_orb_no_sg(struct sbp2_command_orb *orb,
1543
					struct sbp2_fwhost_info *hi,
1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558
					struct sbp2_command_info *command,
					struct scatterlist *sgpnt,
					u32 orb_direction,
					unsigned int scsi_request_bufflen,
					void *scsi_request_buffer,
					enum dma_data_direction dma_dir)
{
	command->dma_dir = dma_dir;
	command->dma_size = scsi_request_bufflen;
	command->dma_type = CMD_DMA_SINGLE;
	command->cmd_dma = pci_map_single(hi->host->pdev, scsi_request_buffer,
					  command->dma_size, command->dma_dir);
	orb->data_descriptor_hi = ORB_SET_NODE_ID(hi->host->node_id);
	orb->misc |= ORB_SET_DIRECTION(orb_direction);

1559 1560
	/* handle case where we get a command w/o s/g enabled
	 * (but check for transfers larger than 64K) */
1561 1562 1563 1564 1565 1566
	if (scsi_request_bufflen <= SBP2_MAX_SG_ELEMENT_LENGTH) {

		orb->data_descriptor_lo = command->cmd_dma;
		orb->misc |= ORB_SET_DATA_SIZE(scsi_request_bufflen);

	} else {
1567 1568
		/* The buffer is too large. Turn this into page tables. */

1569 1570 1571 1572 1573 1574 1575 1576
		struct sbp2_unrestricted_page_table *sg_element =
			&command->scatter_gather_element[0];
		u32 sg_count, sg_len;
		dma_addr_t sg_addr;

		orb->data_descriptor_lo = command->sge_dma;
		orb->misc |= ORB_SET_PAGE_TABLE_PRESENT(0x1);

1577
		/* fill out our SBP-2 page tables; split up the large buffer */
1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
		sg_count = 0;
		sg_len = scsi_request_bufflen;
		sg_addr = command->cmd_dma;
		while (sg_len) {
			sg_element[sg_count].segment_base_lo = sg_addr;
			if (sg_len > SBP2_MAX_SG_ELEMENT_LENGTH) {
				sg_element[sg_count].length_segment_base_hi =
					PAGE_TABLE_SET_SEGMENT_LENGTH(SBP2_MAX_SG_ELEMENT_LENGTH);
				sg_addr += SBP2_MAX_SG_ELEMENT_LENGTH;
				sg_len -= SBP2_MAX_SG_ELEMENT_LENGTH;
			} else {
				sg_element[sg_count].length_segment_base_hi =
					PAGE_TABLE_SET_SEGMENT_LENGTH(sg_len);
				sg_len = 0;
			}
			sg_count++;
		}

		orb->misc |= ORB_SET_DATA_SIZE(sg_count);

		sbp2util_cpu_to_be32_buffer(sg_element,
					    (sizeof(struct sbp2_unrestricted_page_table)) *
					     sg_count);
	}
}

static void sbp2_create_command_orb(struct scsi_id_instance_data *scsi_id,
				    struct sbp2_command_info *command,
				    unchar *scsi_cmd,
				    unsigned int scsi_use_sg,
				    unsigned int scsi_request_bufflen,
				    void *scsi_request_buffer,
				    enum dma_data_direction dma_dir)
L
Linus Torvalds 已提交
1611
{
1612
	struct sbp2_fwhost_info *hi = scsi_id->hi;
S
Stefan Richter 已提交
1613
	struct scatterlist *sgpnt = (struct scatterlist *)scsi_request_buffer;
L
Linus Torvalds 已提交
1614
	struct sbp2_command_orb *command_orb = &command->command_orb;
1615
	u32 orb_direction;
L
Linus Torvalds 已提交
1616 1617

	/*
1618
	 * Set-up our command ORB.
L
Linus Torvalds 已提交
1619 1620 1621 1622 1623 1624 1625 1626 1627 1628
	 *
	 * NOTE: We're doing unrestricted page tables (s/g), as this is
	 * best performance (at least with the devices I have). This means
	 * that data_size becomes the number of s/g elements, and
	 * page_size should be zero (for unrestricted).
	 */
	command_orb->next_ORB_hi = ORB_SET_NULL_PTR(1);
	command_orb->next_ORB_lo = 0x0;
	command_orb->misc = ORB_SET_MAX_PAYLOAD(scsi_id->max_payload_size);
	command_orb->misc |= ORB_SET_SPEED(scsi_id->speed_code);
1629
	command_orb->misc |= ORB_SET_NOTIFY(1);
L
Linus Torvalds 已提交
1630

1631
	if (dma_dir == DMA_NONE)
S
Stefan Richter 已提交
1632
		orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER;
1633
	else if (dma_dir == DMA_TO_DEVICE && scsi_request_bufflen)
S
Stefan Richter 已提交
1634
		orb_direction = ORB_DIRECTION_WRITE_TO_MEDIA;
1635
	else if (dma_dir == DMA_FROM_DEVICE && scsi_request_bufflen)
S
Stefan Richter 已提交
1636
		orb_direction = ORB_DIRECTION_READ_FROM_MEDIA;
1637
	else {
1638
		SBP2_INFO("Falling back to DMA_NONE");
1639
		orb_direction = ORB_DIRECTION_NO_DATA_TRANSFER;
L
Linus Torvalds 已提交
1640 1641
	}

1642
	/* set up our page table stuff */
L
Linus Torvalds 已提交
1643 1644 1645 1646
	if (orb_direction == ORB_DIRECTION_NO_DATA_TRANSFER) {
		command_orb->data_descriptor_hi = 0x0;
		command_orb->data_descriptor_lo = 0x0;
		command_orb->misc |= ORB_SET_DIRECTION(1);
1647
	} else if (scsi_use_sg)
1648 1649
		sbp2_prep_command_orb_sg(command_orb, hi, command, scsi_use_sg,
					 sgpnt, orb_direction, dma_dir);
1650
	else
1651 1652 1653
		sbp2_prep_command_orb_no_sg(command_orb, hi, command, sgpnt,
					    orb_direction, scsi_request_bufflen,
					    scsi_request_buffer, dma_dir);
L
Linus Torvalds 已提交
1654 1655 1656 1657 1658 1659 1660

	sbp2util_cpu_to_be32_buffer(command_orb, sizeof(struct sbp2_command_orb));

	memset(command_orb->cdb, 0, 12);
	memcpy(command_orb->cdb, scsi_cmd, COMMAND_SIZE(*scsi_cmd));
}

1661
static void sbp2_link_orb_command(struct scsi_id_instance_data *scsi_id,
L
Linus Torvalds 已提交
1662 1663
				 struct sbp2_command_info *command)
{
1664
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1665
	struct sbp2_command_orb *command_orb = &command->command_orb;
1666 1667
	struct sbp2_command_orb *last_orb;
	dma_addr_t last_orb_dma;
1668
	u64 addr = scsi_id->command_block_agent_addr;
1669 1670 1671
	quadlet_t data[2];
	size_t length;
	unsigned long flags;
L
Linus Torvalds 已提交
1672 1673 1674

	pci_dma_sync_single_for_device(hi->host->pdev, command->command_orb_dma,
				       sizeof(struct sbp2_command_orb),
1675
				       PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
1676 1677 1678
	pci_dma_sync_single_for_device(hi->host->pdev, command->sge_dma,
				       sizeof(command->scatter_gather_element),
				       PCI_DMA_BIDIRECTIONAL);
1679 1680

	/* check to see if there are any previous orbs to use */
1681
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
1682 1683 1684
	last_orb = scsi_id->last_orb;
	last_orb_dma = scsi_id->last_orb_dma;
	if (!last_orb) {
L
Linus Torvalds 已提交
1685
		/*
1686 1687
		 * last_orb == NULL means: We know that the target's fetch agent
		 * is not active right now.
L
Linus Torvalds 已提交
1688
		 */
1689
		addr += SBP2_ORB_POINTER_OFFSET;
L
Linus Torvalds 已提交
1690 1691 1692
		data[0] = ORB_SET_NODE_ID(hi->host->node_id);
		data[1] = command->command_orb_dma;
		sbp2util_cpu_to_be32_buffer(data, 8);
1693
		length = 8;
L
Linus Torvalds 已提交
1694 1695
	} else {
		/*
1696 1697 1698 1699 1700
		 * last_orb != NULL means: We know that the target's fetch agent
		 * is (very probably) not dead or in reset state right now.
		 * We have an ORB already sent that we can append a new one to.
		 * The target's fetch agent may or may not have read this
		 * previous ORB yet.
L
Linus Torvalds 已提交
1701
		 */
1702 1703
		pci_dma_sync_single_for_cpu(hi->host->pdev, last_orb_dma,
					    sizeof(struct sbp2_command_orb),
1704
					    PCI_DMA_TODEVICE);
1705 1706
		last_orb->next_ORB_lo = cpu_to_be32(command->command_orb_dma);
		wmb();
L
Linus Torvalds 已提交
1707
		/* Tells hardware that this pointer is valid */
1708 1709
		last_orb->next_ORB_hi = 0;
		pci_dma_sync_single_for_device(hi->host->pdev, last_orb_dma,
L
Linus Torvalds 已提交
1710
					       sizeof(struct sbp2_command_orb),
1711
					       PCI_DMA_TODEVICE);
1712 1713 1714 1715 1716 1717
		addr += SBP2_DOORBELL_OFFSET;
		data[0] = 0;
		length = 4;
	}
	scsi_id->last_orb = command_orb;
	scsi_id->last_orb_dma = command->command_orb_dma;
1718
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1719

1720 1721 1722 1723 1724 1725 1726 1727 1728 1729
	if (sbp2util_node_write_no_wait(scsi_id->ne, addr, data, length)) {
		/*
		 * sbp2util_node_write_no_wait failed. We certainly ran out
		 * of transaction labels, perhaps just because there were no
		 * context switches which gave khpsbpkt a chance to collect
		 * free tlabels. Try again in non-atomic context. If necessary,
		 * the workqueue job will sleep to guaranteedly get a tlabel.
		 * We do not accept new commands until the job is over.
		 */
		scsi_block_requests(scsi_id->scsi_host);
1730
		PREPARE_WORK(&scsi_id->protocol_work,
1731
			     last_orb ? sbp2util_write_doorbell:
1732 1733 1734
					sbp2util_write_orb_pointer
			     /* */);
		schedule_work(&scsi_id->protocol_work);
1735
	}
L
Linus Torvalds 已提交
1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746
}

static int sbp2_send_command(struct scsi_id_instance_data *scsi_id,
			     struct scsi_cmnd *SCpnt,
			     void (*done)(struct scsi_cmnd *))
{
	unchar *cmd = (unchar *) SCpnt->cmnd;
	unsigned int request_bufflen = SCpnt->request_bufflen;
	struct sbp2_command_info *command;

	command = sbp2util_allocate_command_orb(scsi_id, SCpnt, done);
1747
	if (!command)
S
Stefan Richter 已提交
1748
		return -EIO;
L
Linus Torvalds 已提交
1749 1750 1751 1752 1753 1754

	sbp2_create_command_orb(scsi_id, command, cmd, SCpnt->use_sg,
				request_bufflen, SCpnt->request_buffer,
				SCpnt->sc_data_direction);
	sbp2_link_orb_command(scsi_id, command);

S
Stefan Richter 已提交
1755
	return 0;
L
Linus Torvalds 已提交
1756 1757 1758 1759 1760 1761 1762
}

/*
 * Translates SBP-2 status into SCSI sense data for check conditions
 */
static unsigned int sbp2_status_to_sense_data(unchar *sbp2_status, unchar *sense_data)
{
1763
	/* OK, it's pretty ugly... ;-) */
L
Linus Torvalds 已提交
1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
	sense_data[0] = 0x70;
	sense_data[1] = 0x0;
	sense_data[2] = sbp2_status[9];
	sense_data[3] = sbp2_status[12];
	sense_data[4] = sbp2_status[13];
	sense_data[5] = sbp2_status[14];
	sense_data[6] = sbp2_status[15];
	sense_data[7] = 10;
	sense_data[8] = sbp2_status[16];
	sense_data[9] = sbp2_status[17];
	sense_data[10] = sbp2_status[18];
	sense_data[11] = sbp2_status[19];
	sense_data[12] = sbp2_status[10];
	sense_data[13] = sbp2_status[11];
	sense_data[14] = sbp2_status[20];
	sense_data[15] = sbp2_status[21];

1781
	return sbp2_status[8] & 0x3f;
L
Linus Torvalds 已提交
1782 1783
}

1784 1785 1786
static int sbp2_handle_status_write(struct hpsb_host *host, int nodeid,
				    int destid, quadlet_t *data, u64 addr,
				    size_t length, u16 fl)
L
Linus Torvalds 已提交
1787
{
1788
	struct sbp2_fwhost_info *hi;
L
Linus Torvalds 已提交
1789 1790
	struct scsi_id_instance_data *scsi_id = NULL, *scsi_id_tmp;
	struct scsi_cmnd *SCpnt = NULL;
1791
	struct sbp2_status_block *sb;
L
Linus Torvalds 已提交
1792 1793
	u32 scsi_status = SBP2_SCSI_STATUS_GOOD;
	struct sbp2_command_info *command;
1794
	unsigned long flags;
L
Linus Torvalds 已提交
1795

1796 1797 1798 1799 1800
	if (unlikely(length < 8 || length > sizeof(struct sbp2_status_block))) {
		SBP2_ERR("Wrong size of status block");
		return RCODE_ADDRESS_ERROR;
	}
	if (unlikely(!host)) {
L
Linus Torvalds 已提交
1801
		SBP2_ERR("host is NULL - this is bad!");
S
Stefan Richter 已提交
1802
		return RCODE_ADDRESS_ERROR;
L
Linus Torvalds 已提交
1803 1804
	}
	hi = hpsb_get_hostinfo(&sbp2_highlevel, host);
1805
	if (unlikely(!hi)) {
L
Linus Torvalds 已提交
1806
		SBP2_ERR("host info is NULL - this is bad!");
S
Stefan Richter 已提交
1807
		return RCODE_ADDRESS_ERROR;
L
Linus Torvalds 已提交
1808
	}
1809 1810

	/* Find the unit which wrote the status. */
L
Linus Torvalds 已提交
1811
	list_for_each_entry(scsi_id_tmp, &hi->scsi_ids, scsi_list) {
1812 1813
		if (scsi_id_tmp->ne->nodeid == nodeid &&
		    scsi_id_tmp->status_fifo_addr == addr) {
L
Linus Torvalds 已提交
1814 1815 1816 1817
			scsi_id = scsi_id_tmp;
			break;
		}
	}
1818
	if (unlikely(!scsi_id)) {
L
Linus Torvalds 已提交
1819
		SBP2_ERR("scsi_id is NULL - device is gone?");
S
Stefan Richter 已提交
1820
		return RCODE_ADDRESS_ERROR;
L
Linus Torvalds 已提交
1821 1822
	}

1823
	/* Put response into scsi_id status fifo buffer. The first two bytes
1824 1825
	 * come in big endian bit order. Often the target writes only a
	 * truncated status block, minimally the first two quadlets. The rest
1826
	 * is implied to be zeros. */
1827 1828 1829 1830
	sb = &scsi_id->status_block;
	memset(sb->command_set_dependent, 0, sizeof(sb->command_set_dependent));
	memcpy(sb, data, length);
	sbp2util_be32_to_cpu_buffer(sb, 8);
L
Linus Torvalds 已提交
1831

1832
	/* Ignore unsolicited status. Handle command ORB status. */
1833 1834 1835 1836 1837
	if (unlikely(STATUS_GET_SRC(sb->ORB_offset_hi_misc) == 2))
		command = NULL;
	else
		command = sbp2util_find_command_for_orb(scsi_id,
							sb->ORB_offset_lo);
L
Linus Torvalds 已提交
1838 1839 1840
	if (command) {
		pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma,
					    sizeof(struct sbp2_command_orb),
1841
					    PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
1842 1843 1844
		pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma,
					    sizeof(command->scatter_gather_element),
					    PCI_DMA_BIDIRECTIONAL);
1845
		/* Grab SCSI command pointers and check status. */
1846 1847 1848 1849
		/*
		 * FIXME: If the src field in the status is 1, the ORB DMA must
		 * not be reused until status for a subsequent ORB is received.
		 */
L
Linus Torvalds 已提交
1850
		SCpnt = command->Current_SCpnt;
1851
		spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1852
		sbp2util_mark_command_completed(scsi_id, command);
1853
		spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1854 1855

		if (SCpnt) {
1856 1857 1858 1859
			u32 h = sb->ORB_offset_hi_misc;
			u32 r = STATUS_GET_RESP(h);

			if (r != RESP_STATUS_REQUEST_COMPLETE) {
1860
				SBP2_INFO("resp 0x%x, sbp_status 0x%x",
1861
					  r, STATUS_GET_SBP_STATUS(h));
1862
				scsi_status =
1863 1864
					r == RESP_STATUS_TRANSPORT_FAILURE ?
					SBP2_SCSI_STATUS_BUSY :
1865
					SBP2_SCSI_STATUS_COMMAND_TERMINATED;
1866
			}
1867

1868
			if (STATUS_GET_LEN(h) > 1)
1869 1870
				scsi_status = sbp2_status_to_sense_data(
					(unchar *)sb, SCpnt->sense_buffer);
1871

1872
			if (STATUS_TEST_DEAD(h))
L
Linus Torvalds 已提交
1873 1874 1875
                                sbp2_agent_reset(scsi_id, 0);
		}

1876
		/* Check here to see if there are no commands in-use. If there
1877 1878 1879 1880
		 * are none, we know that the fetch agent left the active state
		 * _and_ that we did not reactivate it yet. Therefore clear
		 * last_orb so that next time we write directly to the
		 * ORB_POINTER register. That way the fetch agent does not need
1881
		 * to refetch the next_ORB. */
1882 1883
		spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
		if (list_empty(&scsi_id->cmd_orb_inuse))
L
Linus Torvalds 已提交
1884
			scsi_id->last_orb = NULL;
1885
		spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1886 1887

	} else {
1888
		/* It's probably status after a management request. */
1889 1890 1891
		if ((sb->ORB_offset_lo == scsi_id->reconnect_orb_dma) ||
		    (sb->ORB_offset_lo == scsi_id->login_orb_dma) ||
		    (sb->ORB_offset_lo == scsi_id->query_logins_orb_dma) ||
1892 1893
		    (sb->ORB_offset_lo == scsi_id->logout_orb_dma)) {
			scsi_id->access_complete = 1;
1894
			wake_up_interruptible(&sbp2_access_wq);
1895
		}
L
Linus Torvalds 已提交
1896 1897
	}

1898
	if (SCpnt)
L
Linus Torvalds 已提交
1899 1900
		sbp2scsi_complete_command(scsi_id, scsi_status, SCpnt,
					  command->Current_done);
S
Stefan Richter 已提交
1901
	return RCODE_COMPLETE;
L
Linus Torvalds 已提交
1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912
}

/**************************************
 * SCSI interface related section
 **************************************/

static int sbp2scsi_queuecommand(struct scsi_cmnd *SCpnt,
				 void (*done)(struct scsi_cmnd *))
{
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
1913
	struct sbp2_fwhost_info *hi;
1914
	int result = DID_NO_CONNECT << 16;
L
Linus Torvalds 已提交
1915

1916
	if (unlikely(!sbp2util_node_is_available(scsi_id)))
1917
		goto done;
L
Linus Torvalds 已提交
1918 1919 1920

	hi = scsi_id->hi;

1921
	if (unlikely(!hi)) {
1922
		SBP2_ERR("sbp2_fwhost_info is NULL - this is bad!");
1923
		goto done;
L
Linus Torvalds 已提交
1924 1925
	}

1926 1927 1928
	/* Multiple units are currently represented to the SCSI core as separate
	 * targets, not as one target with multiple LUs. Therefore return
	 * selection time-out to any IO directed at non-zero LUNs. */
1929
	if (unlikely(SCpnt->device->lun))
1930
		goto done;
L
Linus Torvalds 已提交
1931

1932
	/* handle the request sense command here (auto-request sense) */
L
Linus Torvalds 已提交
1933 1934 1935 1936
	if (SCpnt->cmnd[0] == REQUEST_SENSE) {
		memcpy(SCpnt->request_buffer, SCpnt->sense_buffer, SCpnt->request_bufflen);
		memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer));
		sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_GOOD, SCpnt, done);
1937
		return 0;
L
Linus Torvalds 已提交
1938 1939
	}

1940
	if (unlikely(!hpsb_node_entry_valid(scsi_id->ne))) {
L
Linus Torvalds 已提交
1941
		SBP2_ERR("Bus reset in progress - rejecting command");
1942 1943
		result = DID_BUS_BUSY << 16;
		goto done;
L
Linus Torvalds 已提交
1944 1945
	}

1946 1947
	/* Bidirectional commands are not yet implemented,
	 * and unknown transfer direction not handled. */
1948
	if (unlikely(SCpnt->sc_data_direction == DMA_BIDIRECTIONAL)) {
1949 1950 1951 1952 1953
		SBP2_ERR("Cannot handle DMA_BIDIRECTIONAL - rejecting command");
		result = DID_ERROR << 16;
		goto done;
	}

L
Linus Torvalds 已提交
1954 1955 1956 1957 1958
	if (sbp2_send_command(scsi_id, SCpnt, done)) {
		SBP2_ERR("Error sending SCSI command");
		sbp2scsi_complete_command(scsi_id, SBP2_SCSI_STATUS_SELECTION_TIMEOUT,
					  SCpnt, done);
	}
1959
	return 0;
L
Linus Torvalds 已提交
1960

1961 1962 1963 1964
done:
	SCpnt->result = result;
	done(SCpnt);
	return 0;
L
Linus Torvalds 已提交
1965 1966 1967 1968 1969
}

static void sbp2scsi_complete_all_commands(struct scsi_id_instance_data *scsi_id,
					   u32 status)
{
1970
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
1971 1972
	struct list_head *lh;
	struct sbp2_command_info *command;
1973
	unsigned long flags;
L
Linus Torvalds 已提交
1974

1975 1976 1977
	spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
	while (!list_empty(&scsi_id->cmd_orb_inuse)) {
		lh = scsi_id->cmd_orb_inuse.next;
L
Linus Torvalds 已提交
1978 1979 1980
		command = list_entry(lh, struct sbp2_command_info, list);
		pci_dma_sync_single_for_cpu(hi->host->pdev, command->command_orb_dma,
					    sizeof(struct sbp2_command_orb),
1981
					    PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
1982 1983 1984 1985 1986 1987 1988 1989 1990
		pci_dma_sync_single_for_cpu(hi->host->pdev, command->sge_dma,
					    sizeof(command->scatter_gather_element),
					    PCI_DMA_BIDIRECTIONAL);
		sbp2util_mark_command_completed(scsi_id, command);
		if (command->Current_SCpnt) {
			command->Current_SCpnt->result = status << 16;
			command->Current_done(command->Current_SCpnt);
		}
	}
1991
	spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
1992 1993 1994 1995 1996

	return;
}

/*
1997
 * Complete a regular SCSI command. Can be called in atomic context.
L
Linus Torvalds 已提交
1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008
 */
static void sbp2scsi_complete_command(struct scsi_id_instance_data *scsi_id,
				      u32 scsi_status, struct scsi_cmnd *SCpnt,
				      void (*done)(struct scsi_cmnd *))
{
	if (!SCpnt) {
		SBP2_ERR("SCpnt is NULL");
		return;
	}

	switch (scsi_status) {
S
Stefan Richter 已提交
2009
	case SBP2_SCSI_STATUS_GOOD:
2010
		SCpnt->result = DID_OK << 16;
S
Stefan Richter 已提交
2011
		break;
L
Linus Torvalds 已提交
2012

S
Stefan Richter 已提交
2013 2014 2015 2016
	case SBP2_SCSI_STATUS_BUSY:
		SBP2_ERR("SBP2_SCSI_STATUS_BUSY");
		SCpnt->result = DID_BUS_BUSY << 16;
		break;
L
Linus Torvalds 已提交
2017

S
Stefan Richter 已提交
2018
	case SBP2_SCSI_STATUS_CHECK_CONDITION:
2019
		SCpnt->result = CHECK_CONDITION << 1 | DID_OK << 16;
S
Stefan Richter 已提交
2020
		break;
L
Linus Torvalds 已提交
2021

S
Stefan Richter 已提交
2022 2023 2024 2025 2026
	case SBP2_SCSI_STATUS_SELECTION_TIMEOUT:
		SBP2_ERR("SBP2_SCSI_STATUS_SELECTION_TIMEOUT");
		SCpnt->result = DID_NO_CONNECT << 16;
		scsi_print_command(SCpnt);
		break;
L
Linus Torvalds 已提交
2027

S
Stefan Richter 已提交
2028 2029 2030 2031 2032 2033 2034
	case SBP2_SCSI_STATUS_CONDITION_MET:
	case SBP2_SCSI_STATUS_RESERVATION_CONFLICT:
	case SBP2_SCSI_STATUS_COMMAND_TERMINATED:
		SBP2_ERR("Bad SCSI status = %x", scsi_status);
		SCpnt->result = DID_ERROR << 16;
		scsi_print_command(SCpnt);
		break;
L
Linus Torvalds 已提交
2035

S
Stefan Richter 已提交
2036 2037 2038
	default:
		SBP2_ERR("Unsupported SCSI status = %x", scsi_status);
		SCpnt->result = DID_ERROR << 16;
L
Linus Torvalds 已提交
2039 2040
	}

2041 2042
	/* If a bus reset is in progress and there was an error, complete
	 * the command as busy so that it will get retried. */
S
Stefan Richter 已提交
2043 2044
	if (!hpsb_node_entry_valid(scsi_id->ne)
	    && (scsi_status != SBP2_SCSI_STATUS_GOOD)) {
L
Linus Torvalds 已提交
2045 2046 2047 2048
		SBP2_ERR("Completing command with busy (bus reset)");
		SCpnt->result = DID_BUS_BUSY << 16;
	}

2049
	/* Tell the SCSI stack that we're done with this command. */
S
Stefan Richter 已提交
2050
	done(SCpnt);
L
Linus Torvalds 已提交
2051 2052
}

2053
static int sbp2scsi_slave_alloc(struct scsi_device *sdev)
L
Linus Torvalds 已提交
2054
{
2055 2056 2057 2058
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)sdev->host->hostdata[0];

	scsi_id->sdev = sdev;
2059
	sdev->allow_restart = 1;
2060

2061
	if (scsi_id->workarounds & SBP2_WORKAROUND_INQUIRY_36)
2062
		sdev->inquiry_len = 36;
2063 2064 2065 2066 2067
	return 0;
}

static int sbp2scsi_slave_configure(struct scsi_device *sdev)
{
2068 2069 2070
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)sdev->host->hostdata[0];

2071
	blk_queue_dma_alignment(sdev->request_queue, (512 - 1));
2072
	sdev->use_10_for_rw = 1;
2073 2074 2075 2076

	if (sdev->type == TYPE_DISK &&
	    scsi_id->workarounds & SBP2_WORKAROUND_MODE_SENSE_8)
		sdev->skip_ms_page_8 = 1;
2077 2078
	if (scsi_id->workarounds & SBP2_WORKAROUND_FIX_CAPACITY)
		sdev->fix_capacity = 1;
L
Linus Torvalds 已提交
2079 2080 2081
	return 0;
}

2082 2083 2084 2085 2086 2087
static void sbp2scsi_slave_destroy(struct scsi_device *sdev)
{
	((struct scsi_id_instance_data *)sdev->host->hostdata[0])->sdev = NULL;
	return;
}

L
Linus Torvalds 已提交
2088
/*
2089 2090
 * Called by scsi stack when something has really gone wrong.
 * Usually called when a command has timed-out for some reason.
L
Linus Torvalds 已提交
2091 2092 2093 2094 2095
 */
static int sbp2scsi_abort(struct scsi_cmnd *SCpnt)
{
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];
2096
	struct sbp2_fwhost_info *hi = scsi_id->hi;
L
Linus Torvalds 已提交
2097
	struct sbp2_command_info *command;
2098
	unsigned long flags;
L
Linus Torvalds 已提交
2099

2100
	SBP2_INFO("aborting sbp2 command");
L
Linus Torvalds 已提交
2101 2102
	scsi_print_command(SCpnt);

2103
	if (sbp2util_node_is_available(scsi_id)) {
2104
		sbp2_agent_reset(scsi_id, 1);
L
Linus Torvalds 已提交
2105

2106
		/* Return a matching command structure to the free pool. */
2107
		spin_lock_irqsave(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
2108 2109 2110 2111 2112
		command = sbp2util_find_command_for_SCpnt(scsi_id, SCpnt);
		if (command) {
			pci_dma_sync_single_for_cpu(hi->host->pdev,
						    command->command_orb_dma,
						    sizeof(struct sbp2_command_orb),
2113
						    PCI_DMA_TODEVICE);
L
Linus Torvalds 已提交
2114 2115 2116 2117 2118 2119 2120 2121 2122 2123
			pci_dma_sync_single_for_cpu(hi->host->pdev,
						    command->sge_dma,
						    sizeof(command->scatter_gather_element),
						    PCI_DMA_BIDIRECTIONAL);
			sbp2util_mark_command_completed(scsi_id, command);
			if (command->Current_SCpnt) {
				command->Current_SCpnt->result = DID_ABORT << 16;
				command->Current_done(command->Current_SCpnt);
			}
		}
2124
		spin_unlock_irqrestore(&scsi_id->cmd_orb_lock, flags);
L
Linus Torvalds 已提交
2125 2126 2127 2128

		sbp2scsi_complete_all_commands(scsi_id, DID_BUS_BUSY);
	}

S
Stefan Richter 已提交
2129
	return SUCCESS;
L
Linus Torvalds 已提交
2130 2131 2132 2133 2134
}

/*
 * Called by scsi stack when something has really gone wrong.
 */
2135
static int sbp2scsi_reset(struct scsi_cmnd *SCpnt)
L
Linus Torvalds 已提交
2136 2137 2138 2139
{
	struct scsi_id_instance_data *scsi_id =
		(struct scsi_id_instance_data *)SCpnt->device->host->hostdata[0];

2140
	SBP2_INFO("reset requested");
L
Linus Torvalds 已提交
2141

2142
	if (sbp2util_node_is_available(scsi_id)) {
2143
		SBP2_INFO("generating sbp2 fetch agent reset");
2144
		sbp2_agent_reset(scsi_id, 1);
L
Linus Torvalds 已提交
2145 2146
	}

2147
	return SUCCESS;
2148 2149
}

S
Stefan Richter 已提交
2150 2151 2152
static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev,
					   struct device_attribute *attr,
					   char *buf)
L
Linus Torvalds 已提交
2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163
{
	struct scsi_device *sdev;
	struct scsi_id_instance_data *scsi_id;

	if (!(sdev = to_scsi_device(dev)))
		return 0;

	if (!(scsi_id = (struct scsi_id_instance_data *)sdev->host->hostdata[0]))
		return 0;

	return sprintf(buf, "%016Lx:%d:%d\n", (unsigned long long)scsi_id->ne->guid,
2164
		       scsi_id->ud->id, ORB_SET_LUN(scsi_id->lun));
L
Linus Torvalds 已提交
2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175
}

MODULE_AUTHOR("Ben Collins <bcollins@debian.org>");
MODULE_DESCRIPTION("IEEE-1394 SBP-2 protocol driver");
MODULE_SUPPORTED_DEVICE(SBP2_DEVICE_NAME);
MODULE_LICENSE("GPL");

static int sbp2_module_init(void)
{
	int ret;

2176 2177 2178
	if (sbp2_serialize_io) {
		sbp2_shost_template.can_queue = 1;
		sbp2_shost_template.cmd_per_lun = 1;
L
Linus Torvalds 已提交
2179 2180
	}

2181
	if (sbp2_default_workarounds & SBP2_WORKAROUND_128K_MAX_TRANS &&
2182 2183 2184
	    (sbp2_max_sectors * 512) > (128 * 1024))
		sbp2_max_sectors = 128 * 1024 / 512;
	sbp2_shost_template.max_sectors = sbp2_max_sectors;
L
Linus Torvalds 已提交
2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203

	hpsb_register_highlevel(&sbp2_highlevel);
	ret = hpsb_register_protocol(&sbp2_driver);
	if (ret) {
		SBP2_ERR("Failed to register protocol");
		hpsb_unregister_highlevel(&sbp2_highlevel);
		return ret;
	}
	return 0;
}

static void __exit sbp2_module_exit(void)
{
	hpsb_unregister_protocol(&sbp2_driver);
	hpsb_unregister_highlevel(&sbp2_highlevel);
}

module_init(sbp2_module_init);
module_exit(sbp2_module_exit);