xref: /linux/drivers/scsi/myrb.c (revision 26fbb4c8c7c3ee9a4c3b4de555a8587b5a19154e)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Linux Driver for Mylex DAC960/AcceleRAID/eXtremeRAID PCI RAID Controllers
4  *
5  * Copyright 2017 Hannes Reinecke, SUSE Linux GmbH <hare@suse.com>
6  *
7  * Based on the original DAC960 driver,
8  * Copyright 1998-2001 by Leonard N. Zubkoff <lnz@dandelion.com>
9  * Portions Copyright 2002 by Mylex (An IBM Business Unit)
10  *
11  */
12 
13 #include <linux/module.h>
14 #include <linux/types.h>
15 #include <linux/delay.h>
16 #include <linux/interrupt.h>
17 #include <linux/pci.h>
18 #include <linux/raid_class.h>
19 #include <asm/unaligned.h>
20 #include <scsi/scsi.h>
21 #include <scsi/scsi_host.h>
22 #include <scsi/scsi_device.h>
23 #include <scsi/scsi_cmnd.h>
24 #include <scsi/scsi_tcq.h>
25 #include "myrb.h"
26 
27 static struct raid_template *myrb_raid_template;
28 
29 static void myrb_monitor(struct work_struct *work);
30 static inline void myrb_translate_devstate(void *DeviceState);
31 
32 static inline int myrb_logical_channel(struct Scsi_Host *shost)
33 {
34 	return shost->max_channel - 1;
35 }
36 
37 static struct myrb_devstate_name_entry {
38 	enum myrb_devstate state;
39 	const char *name;
40 } myrb_devstate_name_list[] = {
41 	{ MYRB_DEVICE_DEAD, "Dead" },
42 	{ MYRB_DEVICE_WO, "WriteOnly" },
43 	{ MYRB_DEVICE_ONLINE, "Online" },
44 	{ MYRB_DEVICE_CRITICAL, "Critical" },
45 	{ MYRB_DEVICE_STANDBY, "Standby" },
46 	{ MYRB_DEVICE_OFFLINE, "Offline" },
47 };
48 
49 static const char *myrb_devstate_name(enum myrb_devstate state)
50 {
51 	struct myrb_devstate_name_entry *entry = myrb_devstate_name_list;
52 	int i;
53 
54 	for (i = 0; i < ARRAY_SIZE(myrb_devstate_name_list); i++) {
55 		if (entry[i].state == state)
56 			return entry[i].name;
57 	}
58 	return "Unknown";
59 }
60 
61 static struct myrb_raidlevel_name_entry {
62 	enum myrb_raidlevel level;
63 	const char *name;
64 } myrb_raidlevel_name_list[] = {
65 	{ MYRB_RAID_LEVEL0, "RAID0" },
66 	{ MYRB_RAID_LEVEL1, "RAID1" },
67 	{ MYRB_RAID_LEVEL3, "RAID3" },
68 	{ MYRB_RAID_LEVEL5, "RAID5" },
69 	{ MYRB_RAID_LEVEL6, "RAID6" },
70 	{ MYRB_RAID_JBOD, "JBOD" },
71 };
72 
73 static const char *myrb_raidlevel_name(enum myrb_raidlevel level)
74 {
75 	struct myrb_raidlevel_name_entry *entry = myrb_raidlevel_name_list;
76 	int i;
77 
78 	for (i = 0; i < ARRAY_SIZE(myrb_raidlevel_name_list); i++) {
79 		if (entry[i].level == level)
80 			return entry[i].name;
81 	}
82 	return NULL;
83 }
84 
85 /**
86  * myrb_create_mempools - allocates auxiliary data structures
87  *
88  * Return: true on success, false otherwise.
89  */
90 static bool myrb_create_mempools(struct pci_dev *pdev, struct myrb_hba *cb)
91 {
92 	size_t elem_size, elem_align;
93 
94 	elem_align = sizeof(struct myrb_sge);
95 	elem_size = cb->host->sg_tablesize * elem_align;
96 	cb->sg_pool = dma_pool_create("myrb_sg", &pdev->dev,
97 				      elem_size, elem_align, 0);
98 	if (cb->sg_pool == NULL) {
99 		shost_printk(KERN_ERR, cb->host,
100 			     "Failed to allocate SG pool\n");
101 		return false;
102 	}
103 
104 	cb->dcdb_pool = dma_pool_create("myrb_dcdb", &pdev->dev,
105 				       sizeof(struct myrb_dcdb),
106 				       sizeof(unsigned int), 0);
107 	if (!cb->dcdb_pool) {
108 		dma_pool_destroy(cb->sg_pool);
109 		cb->sg_pool = NULL;
110 		shost_printk(KERN_ERR, cb->host,
111 			     "Failed to allocate DCDB pool\n");
112 		return false;
113 	}
114 
115 	snprintf(cb->work_q_name, sizeof(cb->work_q_name),
116 		 "myrb_wq_%d", cb->host->host_no);
117 	cb->work_q = create_singlethread_workqueue(cb->work_q_name);
118 	if (!cb->work_q) {
119 		dma_pool_destroy(cb->dcdb_pool);
120 		cb->dcdb_pool = NULL;
121 		dma_pool_destroy(cb->sg_pool);
122 		cb->sg_pool = NULL;
123 		shost_printk(KERN_ERR, cb->host,
124 			     "Failed to create workqueue\n");
125 		return false;
126 	}
127 
128 	/*
129 	 * Initialize the Monitoring Timer.
130 	 */
131 	INIT_DELAYED_WORK(&cb->monitor_work, myrb_monitor);
132 	queue_delayed_work(cb->work_q, &cb->monitor_work, 1);
133 
134 	return true;
135 }
136 
137 /**
138  * myrb_destroy_mempools - tears down the memory pools for the controller
139  */
140 static void myrb_destroy_mempools(struct myrb_hba *cb)
141 {
142 	cancel_delayed_work_sync(&cb->monitor_work);
143 	destroy_workqueue(cb->work_q);
144 
145 	dma_pool_destroy(cb->sg_pool);
146 	dma_pool_destroy(cb->dcdb_pool);
147 }
148 
149 /**
150  * myrb_reset_cmd - reset command block
151  */
152 static inline void myrb_reset_cmd(struct myrb_cmdblk *cmd_blk)
153 {
154 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
155 
156 	memset(mbox, 0, sizeof(union myrb_cmd_mbox));
157 	cmd_blk->status = 0;
158 }
159 
160 /**
161  * myrb_qcmd - queues command block for execution
162  */
163 static void myrb_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
164 {
165 	void __iomem *base = cb->io_base;
166 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
167 	union myrb_cmd_mbox *next_mbox = cb->next_cmd_mbox;
168 
169 	cb->write_cmd_mbox(next_mbox, mbox);
170 	if (cb->prev_cmd_mbox1->words[0] == 0 ||
171 	    cb->prev_cmd_mbox2->words[0] == 0)
172 		cb->get_cmd_mbox(base);
173 	cb->prev_cmd_mbox2 = cb->prev_cmd_mbox1;
174 	cb->prev_cmd_mbox1 = next_mbox;
175 	if (++next_mbox > cb->last_cmd_mbox)
176 		next_mbox = cb->first_cmd_mbox;
177 	cb->next_cmd_mbox = next_mbox;
178 }
179 
180 /**
181  * myrb_exec_cmd - executes command block and waits for completion.
182  *
183  * Return: command status
184  */
185 static unsigned short myrb_exec_cmd(struct myrb_hba *cb,
186 		struct myrb_cmdblk *cmd_blk)
187 {
188 	DECLARE_COMPLETION_ONSTACK(cmpl);
189 	unsigned long flags;
190 
191 	cmd_blk->completion = &cmpl;
192 
193 	spin_lock_irqsave(&cb->queue_lock, flags);
194 	cb->qcmd(cb, cmd_blk);
195 	spin_unlock_irqrestore(&cb->queue_lock, flags);
196 
197 	wait_for_completion(&cmpl);
198 	return cmd_blk->status;
199 }
200 
201 /**
202  * myrb_exec_type3 - executes a type 3 command and waits for completion.
203  *
204  * Return: command status
205  */
206 static unsigned short myrb_exec_type3(struct myrb_hba *cb,
207 		enum myrb_cmd_opcode op, dma_addr_t addr)
208 {
209 	struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
210 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
211 	unsigned short status;
212 
213 	mutex_lock(&cb->dcmd_mutex);
214 	myrb_reset_cmd(cmd_blk);
215 	mbox->type3.id = MYRB_DCMD_TAG;
216 	mbox->type3.opcode = op;
217 	mbox->type3.addr = addr;
218 	status = myrb_exec_cmd(cb, cmd_blk);
219 	mutex_unlock(&cb->dcmd_mutex);
220 	return status;
221 }
222 
223 /**
224  * myrb_exec_type3D - executes a type 3D command and waits for completion.
225  *
226  * Return: command status
227  */
228 static unsigned short myrb_exec_type3D(struct myrb_hba *cb,
229 		enum myrb_cmd_opcode op, struct scsi_device *sdev,
230 		struct myrb_pdev_state *pdev_info)
231 {
232 	struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
233 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
234 	unsigned short status;
235 	dma_addr_t pdev_info_addr;
236 
237 	pdev_info_addr = dma_map_single(&cb->pdev->dev, pdev_info,
238 					sizeof(struct myrb_pdev_state),
239 					DMA_FROM_DEVICE);
240 	if (dma_mapping_error(&cb->pdev->dev, pdev_info_addr))
241 		return MYRB_STATUS_SUBSYS_FAILED;
242 
243 	mutex_lock(&cb->dcmd_mutex);
244 	myrb_reset_cmd(cmd_blk);
245 	mbox->type3D.id = MYRB_DCMD_TAG;
246 	mbox->type3D.opcode = op;
247 	mbox->type3D.channel = sdev->channel;
248 	mbox->type3D.target = sdev->id;
249 	mbox->type3D.addr = pdev_info_addr;
250 	status = myrb_exec_cmd(cb, cmd_blk);
251 	mutex_unlock(&cb->dcmd_mutex);
252 	dma_unmap_single(&cb->pdev->dev, pdev_info_addr,
253 			 sizeof(struct myrb_pdev_state), DMA_FROM_DEVICE);
254 	if (status == MYRB_STATUS_SUCCESS &&
255 	    mbox->type3D.opcode == MYRB_CMD_GET_DEVICE_STATE_OLD)
256 		myrb_translate_devstate(pdev_info);
257 
258 	return status;
259 }
260 
261 static char *myrb_event_msg[] = {
262 	"killed because write recovery failed",
263 	"killed because of SCSI bus reset failure",
264 	"killed because of double check condition",
265 	"killed because it was removed",
266 	"killed because of gross error on SCSI chip",
267 	"killed because of bad tag returned from drive",
268 	"killed because of timeout on SCSI command",
269 	"killed because of reset SCSI command issued from system",
270 	"killed because busy or parity error count exceeded limit",
271 	"killed because of 'kill drive' command from system",
272 	"killed because of selection timeout",
273 	"killed due to SCSI phase sequence error",
274 	"killed due to unknown status",
275 };
276 
277 /**
278  * myrb_get_event - get event log from HBA
279  * @cb: pointer to the hba structure
280  * @event: number of the event
281  *
282  * Execute a type 3E command and logs the event message
283  */
284 static void myrb_get_event(struct myrb_hba *cb, unsigned int event)
285 {
286 	struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
287 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
288 	struct myrb_log_entry *ev_buf;
289 	dma_addr_t ev_addr;
290 	unsigned short status;
291 
292 	ev_buf = dma_alloc_coherent(&cb->pdev->dev,
293 				    sizeof(struct myrb_log_entry),
294 				    &ev_addr, GFP_KERNEL);
295 	if (!ev_buf)
296 		return;
297 
298 	myrb_reset_cmd(cmd_blk);
299 	mbox->type3E.id = MYRB_MCMD_TAG;
300 	mbox->type3E.opcode = MYRB_CMD_EVENT_LOG_OPERATION;
301 	mbox->type3E.optype = DAC960_V1_GetEventLogEntry;
302 	mbox->type3E.opqual = 1;
303 	mbox->type3E.ev_seq = event;
304 	mbox->type3E.addr = ev_addr;
305 	status = myrb_exec_cmd(cb, cmd_blk);
306 	if (status != MYRB_STATUS_SUCCESS)
307 		shost_printk(KERN_INFO, cb->host,
308 			     "Failed to get event log %d, status %04x\n",
309 			     event, status);
310 
311 	else if (ev_buf->seq_num == event) {
312 		struct scsi_sense_hdr sshdr;
313 
314 		memset(&sshdr, 0, sizeof(sshdr));
315 		scsi_normalize_sense(ev_buf->sense, 32, &sshdr);
316 
317 		if (sshdr.sense_key == VENDOR_SPECIFIC &&
318 		    sshdr.asc == 0x80 &&
319 		    sshdr.ascq < ARRAY_SIZE(myrb_event_msg))
320 			shost_printk(KERN_CRIT, cb->host,
321 				     "Physical drive %d:%d: %s\n",
322 				     ev_buf->channel, ev_buf->target,
323 				     myrb_event_msg[sshdr.ascq]);
324 		else
325 			shost_printk(KERN_CRIT, cb->host,
326 				     "Physical drive %d:%d: Sense: %X/%02X/%02X\n",
327 				     ev_buf->channel, ev_buf->target,
328 				     sshdr.sense_key, sshdr.asc, sshdr.ascq);
329 	}
330 
331 	dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_log_entry),
332 			  ev_buf, ev_addr);
333 }
334 
335 /**
336  * myrb_get_errtable - retrieves the error table from the controller
337  *
338  * Executes a type 3 command and logs the error table from the controller.
339  */
340 static void myrb_get_errtable(struct myrb_hba *cb)
341 {
342 	struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
343 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
344 	unsigned short status;
345 	struct myrb_error_entry old_table[MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS];
346 
347 	memcpy(&old_table, cb->err_table, sizeof(old_table));
348 
349 	myrb_reset_cmd(cmd_blk);
350 	mbox->type3.id = MYRB_MCMD_TAG;
351 	mbox->type3.opcode = MYRB_CMD_GET_ERROR_TABLE;
352 	mbox->type3.addr = cb->err_table_addr;
353 	status = myrb_exec_cmd(cb, cmd_blk);
354 	if (status == MYRB_STATUS_SUCCESS) {
355 		struct myrb_error_entry *table = cb->err_table;
356 		struct myrb_error_entry *new, *old;
357 		size_t err_table_offset;
358 		struct scsi_device *sdev;
359 
360 		shost_for_each_device(sdev, cb->host) {
361 			if (sdev->channel >= myrb_logical_channel(cb->host))
362 				continue;
363 			err_table_offset = sdev->channel * MYRB_MAX_TARGETS
364 				+ sdev->id;
365 			new = table + err_table_offset;
366 			old = &old_table[err_table_offset];
367 			if (new->parity_err == old->parity_err &&
368 			    new->soft_err == old->soft_err &&
369 			    new->hard_err == old->hard_err &&
370 			    new->misc_err == old->misc_err)
371 				continue;
372 			sdev_printk(KERN_CRIT, sdev,
373 				    "Errors: Parity = %d, Soft = %d, Hard = %d, Misc = %d\n",
374 				    new->parity_err, new->soft_err,
375 				    new->hard_err, new->misc_err);
376 		}
377 	}
378 }
379 
380 /**
381  * myrb_get_ldev_info - retrieves the logical device table from the controller
382  *
383  * Executes a type 3 command and updates the logical device table.
384  *
385  * Return: command status
386  */
387 static unsigned short myrb_get_ldev_info(struct myrb_hba *cb)
388 {
389 	unsigned short status;
390 	int ldev_num, ldev_cnt = cb->enquiry->ldev_count;
391 	struct Scsi_Host *shost = cb->host;
392 
393 	status = myrb_exec_type3(cb, MYRB_CMD_GET_LDEV_INFO,
394 				 cb->ldev_info_addr);
395 	if (status != MYRB_STATUS_SUCCESS)
396 		return status;
397 
398 	for (ldev_num = 0; ldev_num < ldev_cnt; ldev_num++) {
399 		struct myrb_ldev_info *old = NULL;
400 		struct myrb_ldev_info *new = cb->ldev_info_buf + ldev_num;
401 		struct scsi_device *sdev;
402 
403 		sdev = scsi_device_lookup(shost, myrb_logical_channel(shost),
404 					  ldev_num, 0);
405 		if (!sdev) {
406 			if (new->state == MYRB_DEVICE_OFFLINE)
407 				continue;
408 			shost_printk(KERN_INFO, shost,
409 				     "Adding Logical Drive %d in state %s\n",
410 				     ldev_num, myrb_devstate_name(new->state));
411 			scsi_add_device(shost, myrb_logical_channel(shost),
412 					ldev_num, 0);
413 			continue;
414 		}
415 		old = sdev->hostdata;
416 		if (new->state != old->state)
417 			shost_printk(KERN_INFO, shost,
418 				     "Logical Drive %d is now %s\n",
419 				     ldev_num, myrb_devstate_name(new->state));
420 		if (new->wb_enabled != old->wb_enabled)
421 			sdev_printk(KERN_INFO, sdev,
422 				    "Logical Drive is now WRITE %s\n",
423 				    (new->wb_enabled ? "BACK" : "THRU"));
424 		memcpy(old, new, sizeof(*new));
425 		scsi_device_put(sdev);
426 	}
427 	return status;
428 }
429 
430 /**
431  * myrb_get_rbld_progress - get rebuild progress information
432  *
433  * Executes a type 3 command and returns the rebuild progress
434  * information.
435  *
436  * Return: command status
437  */
438 static unsigned short myrb_get_rbld_progress(struct myrb_hba *cb,
439 		struct myrb_rbld_progress *rbld)
440 {
441 	struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
442 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
443 	struct myrb_rbld_progress *rbld_buf;
444 	dma_addr_t rbld_addr;
445 	unsigned short status;
446 
447 	rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
448 				      sizeof(struct myrb_rbld_progress),
449 				      &rbld_addr, GFP_KERNEL);
450 	if (!rbld_buf)
451 		return MYRB_STATUS_RBLD_NOT_CHECKED;
452 
453 	myrb_reset_cmd(cmd_blk);
454 	mbox->type3.id = MYRB_MCMD_TAG;
455 	mbox->type3.opcode = MYRB_CMD_GET_REBUILD_PROGRESS;
456 	mbox->type3.addr = rbld_addr;
457 	status = myrb_exec_cmd(cb, cmd_blk);
458 	if (rbld)
459 		memcpy(rbld, rbld_buf, sizeof(struct myrb_rbld_progress));
460 	dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
461 			  rbld_buf, rbld_addr);
462 	return status;
463 }
464 
465 /**
466  * myrb_update_rbld_progress - updates the rebuild status
467  *
468  * Updates the rebuild status for the attached logical devices.
469  *
470  */
471 static void myrb_update_rbld_progress(struct myrb_hba *cb)
472 {
473 	struct myrb_rbld_progress rbld_buf;
474 	unsigned short status;
475 
476 	status = myrb_get_rbld_progress(cb, &rbld_buf);
477 	if (status == MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS &&
478 	    cb->last_rbld_status == MYRB_STATUS_SUCCESS)
479 		status = MYRB_STATUS_RBLD_SUCCESS;
480 	if (status != MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS) {
481 		unsigned int blocks_done =
482 			rbld_buf.ldev_size - rbld_buf.blocks_left;
483 		struct scsi_device *sdev;
484 
485 		sdev = scsi_device_lookup(cb->host,
486 					  myrb_logical_channel(cb->host),
487 					  rbld_buf.ldev_num, 0);
488 		if (!sdev)
489 			return;
490 
491 		switch (status) {
492 		case MYRB_STATUS_SUCCESS:
493 			sdev_printk(KERN_INFO, sdev,
494 				    "Rebuild in Progress, %d%% completed\n",
495 				    (100 * (blocks_done >> 7))
496 				    / (rbld_buf.ldev_size >> 7));
497 			break;
498 		case MYRB_STATUS_RBLD_FAILED_LDEV_FAILURE:
499 			sdev_printk(KERN_INFO, sdev,
500 				    "Rebuild Failed due to Logical Drive Failure\n");
501 			break;
502 		case MYRB_STATUS_RBLD_FAILED_BADBLOCKS:
503 			sdev_printk(KERN_INFO, sdev,
504 				    "Rebuild Failed due to Bad Blocks on Other Drives\n");
505 			break;
506 		case MYRB_STATUS_RBLD_FAILED_NEW_DRIVE_FAILED:
507 			sdev_printk(KERN_INFO, sdev,
508 				    "Rebuild Failed due to Failure of Drive Being Rebuilt\n");
509 			break;
510 		case MYRB_STATUS_RBLD_SUCCESS:
511 			sdev_printk(KERN_INFO, sdev,
512 				    "Rebuild Completed Successfully\n");
513 			break;
514 		case MYRB_STATUS_RBLD_SUCCESS_TERMINATED:
515 			sdev_printk(KERN_INFO, sdev,
516 				     "Rebuild Successfully Terminated\n");
517 			break;
518 		default:
519 			break;
520 		}
521 		scsi_device_put(sdev);
522 	}
523 	cb->last_rbld_status = status;
524 }
525 
526 /**
527  * myrb_get_cc_progress - retrieve the rebuild status
528  *
529  * Execute a type 3 Command and fetch the rebuild / consistency check
530  * status.
531  */
532 static void myrb_get_cc_progress(struct myrb_hba *cb)
533 {
534 	struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
535 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
536 	struct myrb_rbld_progress *rbld_buf;
537 	dma_addr_t rbld_addr;
538 	unsigned short status;
539 
540 	rbld_buf = dma_alloc_coherent(&cb->pdev->dev,
541 				      sizeof(struct myrb_rbld_progress),
542 				      &rbld_addr, GFP_KERNEL);
543 	if (!rbld_buf) {
544 		cb->need_cc_status = true;
545 		return;
546 	}
547 	myrb_reset_cmd(cmd_blk);
548 	mbox->type3.id = MYRB_MCMD_TAG;
549 	mbox->type3.opcode = MYRB_CMD_REBUILD_STAT;
550 	mbox->type3.addr = rbld_addr;
551 	status = myrb_exec_cmd(cb, cmd_blk);
552 	if (status == MYRB_STATUS_SUCCESS) {
553 		unsigned int ldev_num = rbld_buf->ldev_num;
554 		unsigned int ldev_size = rbld_buf->ldev_size;
555 		unsigned int blocks_done =
556 			ldev_size - rbld_buf->blocks_left;
557 		struct scsi_device *sdev;
558 
559 		sdev = scsi_device_lookup(cb->host,
560 					  myrb_logical_channel(cb->host),
561 					  ldev_num, 0);
562 		if (sdev) {
563 			sdev_printk(KERN_INFO, sdev,
564 				    "Consistency Check in Progress: %d%% completed\n",
565 				    (100 * (blocks_done >> 7))
566 				    / (ldev_size >> 7));
567 			scsi_device_put(sdev);
568 		}
569 	}
570 	dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_rbld_progress),
571 			  rbld_buf, rbld_addr);
572 }
573 
574 /**
575  * myrb_bgi_control - updates background initialisation status
576  *
577  * Executes a type 3B command and updates the background initialisation status
578  */
579 static void myrb_bgi_control(struct myrb_hba *cb)
580 {
581 	struct myrb_cmdblk *cmd_blk = &cb->mcmd_blk;
582 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
583 	struct myrb_bgi_status *bgi, *last_bgi;
584 	dma_addr_t bgi_addr;
585 	struct scsi_device *sdev = NULL;
586 	unsigned short status;
587 
588 	bgi = dma_alloc_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
589 				 &bgi_addr, GFP_KERNEL);
590 	if (!bgi) {
591 		shost_printk(KERN_ERR, cb->host,
592 			     "Failed to allocate bgi memory\n");
593 		return;
594 	}
595 	myrb_reset_cmd(cmd_blk);
596 	mbox->type3B.id = MYRB_DCMD_TAG;
597 	mbox->type3B.opcode = MYRB_CMD_BGI_CONTROL;
598 	mbox->type3B.optype = 0x20;
599 	mbox->type3B.addr = bgi_addr;
600 	status = myrb_exec_cmd(cb, cmd_blk);
601 	last_bgi = &cb->bgi_status;
602 	sdev = scsi_device_lookup(cb->host,
603 				  myrb_logical_channel(cb->host),
604 				  bgi->ldev_num, 0);
605 	switch (status) {
606 	case MYRB_STATUS_SUCCESS:
607 		switch (bgi->status) {
608 		case MYRB_BGI_INVALID:
609 			break;
610 		case MYRB_BGI_STARTED:
611 			if (!sdev)
612 				break;
613 			sdev_printk(KERN_INFO, sdev,
614 				    "Background Initialization Started\n");
615 			break;
616 		case MYRB_BGI_INPROGRESS:
617 			if (!sdev)
618 				break;
619 			if (bgi->blocks_done == last_bgi->blocks_done &&
620 			    bgi->ldev_num == last_bgi->ldev_num)
621 				break;
622 			sdev_printk(KERN_INFO, sdev,
623 				 "Background Initialization in Progress: %d%% completed\n",
624 				 (100 * (bgi->blocks_done >> 7))
625 				 / (bgi->ldev_size >> 7));
626 			break;
627 		case MYRB_BGI_SUSPENDED:
628 			if (!sdev)
629 				break;
630 			sdev_printk(KERN_INFO, sdev,
631 				    "Background Initialization Suspended\n");
632 			break;
633 		case MYRB_BGI_CANCELLED:
634 			if (!sdev)
635 				break;
636 			sdev_printk(KERN_INFO, sdev,
637 				    "Background Initialization Cancelled\n");
638 			break;
639 		}
640 		memcpy(&cb->bgi_status, bgi, sizeof(struct myrb_bgi_status));
641 		break;
642 	case MYRB_STATUS_BGI_SUCCESS:
643 		if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
644 			sdev_printk(KERN_INFO, sdev,
645 				    "Background Initialization Completed Successfully\n");
646 		cb->bgi_status.status = MYRB_BGI_INVALID;
647 		break;
648 	case MYRB_STATUS_BGI_ABORTED:
649 		if (sdev && cb->bgi_status.status == MYRB_BGI_INPROGRESS)
650 			sdev_printk(KERN_INFO, sdev,
651 				    "Background Initialization Aborted\n");
652 		fallthrough;
653 	case MYRB_STATUS_NO_BGI_INPROGRESS:
654 		cb->bgi_status.status = MYRB_BGI_INVALID;
655 		break;
656 	}
657 	if (sdev)
658 		scsi_device_put(sdev);
659 	dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_bgi_status),
660 			  bgi, bgi_addr);
661 }
662 
663 /**
664  * myrb_hba_enquiry - updates the controller status
665  *
666  * Executes a DAC_V1_Enquiry command and updates the controller status.
667  *
668  * Return: command status
669  */
670 static unsigned short myrb_hba_enquiry(struct myrb_hba *cb)
671 {
672 	struct myrb_enquiry old, *new;
673 	unsigned short status;
674 
675 	memcpy(&old, cb->enquiry, sizeof(struct myrb_enquiry));
676 
677 	status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY, cb->enquiry_addr);
678 	if (status != MYRB_STATUS_SUCCESS)
679 		return status;
680 
681 	new = cb->enquiry;
682 	if (new->ldev_count > old.ldev_count) {
683 		int ldev_num = old.ldev_count - 1;
684 
685 		while (++ldev_num < new->ldev_count)
686 			shost_printk(KERN_CRIT, cb->host,
687 				     "Logical Drive %d Now Exists\n",
688 				     ldev_num);
689 	}
690 	if (new->ldev_count < old.ldev_count) {
691 		int ldev_num = new->ldev_count - 1;
692 
693 		while (++ldev_num < old.ldev_count)
694 			shost_printk(KERN_CRIT, cb->host,
695 				     "Logical Drive %d No Longer Exists\n",
696 				     ldev_num);
697 	}
698 	if (new->status.deferred != old.status.deferred)
699 		shost_printk(KERN_CRIT, cb->host,
700 			     "Deferred Write Error Flag is now %s\n",
701 			     (new->status.deferred ? "TRUE" : "FALSE"));
702 	if (new->ev_seq != old.ev_seq) {
703 		cb->new_ev_seq = new->ev_seq;
704 		cb->need_err_info = true;
705 		shost_printk(KERN_INFO, cb->host,
706 			     "Event log %d/%d (%d/%d) available\n",
707 			     cb->old_ev_seq, cb->new_ev_seq,
708 			     old.ev_seq, new->ev_seq);
709 	}
710 	if ((new->ldev_critical > 0 &&
711 	     new->ldev_critical != old.ldev_critical) ||
712 	    (new->ldev_offline > 0 &&
713 	     new->ldev_offline != old.ldev_offline) ||
714 	    (new->ldev_count != old.ldev_count)) {
715 		shost_printk(KERN_INFO, cb->host,
716 			     "Logical drive count changed (%d/%d/%d)\n",
717 			     new->ldev_critical,
718 			     new->ldev_offline,
719 			     new->ldev_count);
720 		cb->need_ldev_info = true;
721 	}
722 	if (new->pdev_dead > 0 ||
723 	    new->pdev_dead != old.pdev_dead ||
724 	    time_after_eq(jiffies, cb->secondary_monitor_time
725 			  + MYRB_SECONDARY_MONITOR_INTERVAL)) {
726 		cb->need_bgi_status = cb->bgi_status_supported;
727 		cb->secondary_monitor_time = jiffies;
728 	}
729 	if (new->rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
730 	    new->rbld == MYRB_BG_RBLD_IN_PROGRESS ||
731 	    old.rbld == MYRB_STDBY_RBLD_IN_PROGRESS ||
732 	    old.rbld == MYRB_BG_RBLD_IN_PROGRESS) {
733 		cb->need_rbld = true;
734 		cb->rbld_first = (new->ldev_critical < old.ldev_critical);
735 	}
736 	if (old.rbld == MYRB_BG_CHECK_IN_PROGRESS)
737 		switch (new->rbld) {
738 		case MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS:
739 			shost_printk(KERN_INFO, cb->host,
740 				     "Consistency Check Completed Successfully\n");
741 			break;
742 		case MYRB_STDBY_RBLD_IN_PROGRESS:
743 		case MYRB_BG_RBLD_IN_PROGRESS:
744 			break;
745 		case MYRB_BG_CHECK_IN_PROGRESS:
746 			cb->need_cc_status = true;
747 			break;
748 		case MYRB_STDBY_RBLD_COMPLETED_WITH_ERROR:
749 			shost_printk(KERN_INFO, cb->host,
750 				     "Consistency Check Completed with Error\n");
751 			break;
752 		case MYRB_BG_RBLD_OR_CHECK_FAILED_DRIVE_FAILED:
753 			shost_printk(KERN_INFO, cb->host,
754 				     "Consistency Check Failed - Physical Device Failed\n");
755 			break;
756 		case MYRB_BG_RBLD_OR_CHECK_FAILED_LDEV_FAILED:
757 			shost_printk(KERN_INFO, cb->host,
758 				     "Consistency Check Failed - Logical Drive Failed\n");
759 			break;
760 		case MYRB_BG_RBLD_OR_CHECK_FAILED_OTHER:
761 			shost_printk(KERN_INFO, cb->host,
762 				     "Consistency Check Failed - Other Causes\n");
763 			break;
764 		case MYRB_BG_RBLD_OR_CHECK_SUCCESS_TERMINATED:
765 			shost_printk(KERN_INFO, cb->host,
766 				     "Consistency Check Successfully Terminated\n");
767 			break;
768 		}
769 	else if (new->rbld == MYRB_BG_CHECK_IN_PROGRESS)
770 		cb->need_cc_status = true;
771 
772 	return MYRB_STATUS_SUCCESS;
773 }
774 
775 /**
776  * myrb_set_pdev_state - sets the device state for a physical device
777  *
778  * Return: command status
779  */
780 static unsigned short myrb_set_pdev_state(struct myrb_hba *cb,
781 		struct scsi_device *sdev, enum myrb_devstate state)
782 {
783 	struct myrb_cmdblk *cmd_blk = &cb->dcmd_blk;
784 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
785 	unsigned short status;
786 
787 	mutex_lock(&cb->dcmd_mutex);
788 	mbox->type3D.opcode = MYRB_CMD_START_DEVICE;
789 	mbox->type3D.id = MYRB_DCMD_TAG;
790 	mbox->type3D.channel = sdev->channel;
791 	mbox->type3D.target = sdev->id;
792 	mbox->type3D.state = state & 0x1F;
793 	status = myrb_exec_cmd(cb, cmd_blk);
794 	mutex_unlock(&cb->dcmd_mutex);
795 
796 	return status;
797 }
798 
799 /**
800  * myrb_enable_mmio - enables the Memory Mailbox Interface
801  *
802  * PD and P controller types have no memory mailbox, but still need the
803  * other dma mapped memory.
804  *
805  * Return: true on success, false otherwise.
806  */
807 static bool myrb_enable_mmio(struct myrb_hba *cb, mbox_mmio_init_t mmio_init_fn)
808 {
809 	void __iomem *base = cb->io_base;
810 	struct pci_dev *pdev = cb->pdev;
811 	size_t err_table_size;
812 	size_t ldev_info_size;
813 	union myrb_cmd_mbox *cmd_mbox_mem;
814 	struct myrb_stat_mbox *stat_mbox_mem;
815 	union myrb_cmd_mbox mbox;
816 	unsigned short status;
817 
818 	memset(&mbox, 0, sizeof(union myrb_cmd_mbox));
819 
820 	if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(32))) {
821 		dev_err(&pdev->dev, "DMA mask out of range\n");
822 		return false;
823 	}
824 
825 	cb->enquiry = dma_alloc_coherent(&pdev->dev,
826 					 sizeof(struct myrb_enquiry),
827 					 &cb->enquiry_addr, GFP_KERNEL);
828 	if (!cb->enquiry)
829 		return false;
830 
831 	err_table_size = sizeof(struct myrb_error_entry) *
832 		MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
833 	cb->err_table = dma_alloc_coherent(&pdev->dev, err_table_size,
834 					   &cb->err_table_addr, GFP_KERNEL);
835 	if (!cb->err_table)
836 		return false;
837 
838 	ldev_info_size = sizeof(struct myrb_ldev_info) * MYRB_MAX_LDEVS;
839 	cb->ldev_info_buf = dma_alloc_coherent(&pdev->dev, ldev_info_size,
840 					       &cb->ldev_info_addr, GFP_KERNEL);
841 	if (!cb->ldev_info_buf)
842 		return false;
843 
844 	/*
845 	 * Skip mailbox initialisation for PD and P Controllers
846 	 */
847 	if (!mmio_init_fn)
848 		return true;
849 
850 	/* These are the base addresses for the command memory mailbox array */
851 	cb->cmd_mbox_size =  MYRB_CMD_MBOX_COUNT * sizeof(union myrb_cmd_mbox);
852 	cb->first_cmd_mbox = dma_alloc_coherent(&pdev->dev,
853 						cb->cmd_mbox_size,
854 						&cb->cmd_mbox_addr,
855 						GFP_KERNEL);
856 	if (!cb->first_cmd_mbox)
857 		return false;
858 
859 	cmd_mbox_mem = cb->first_cmd_mbox;
860 	cmd_mbox_mem += MYRB_CMD_MBOX_COUNT - 1;
861 	cb->last_cmd_mbox = cmd_mbox_mem;
862 	cb->next_cmd_mbox = cb->first_cmd_mbox;
863 	cb->prev_cmd_mbox1 = cb->last_cmd_mbox;
864 	cb->prev_cmd_mbox2 = cb->last_cmd_mbox - 1;
865 
866 	/* These are the base addresses for the status memory mailbox array */
867 	cb->stat_mbox_size = MYRB_STAT_MBOX_COUNT *
868 	    sizeof(struct myrb_stat_mbox);
869 	cb->first_stat_mbox = dma_alloc_coherent(&pdev->dev,
870 						 cb->stat_mbox_size,
871 						 &cb->stat_mbox_addr,
872 						 GFP_KERNEL);
873 	if (!cb->first_stat_mbox)
874 		return false;
875 
876 	stat_mbox_mem = cb->first_stat_mbox;
877 	stat_mbox_mem += MYRB_STAT_MBOX_COUNT - 1;
878 	cb->last_stat_mbox = stat_mbox_mem;
879 	cb->next_stat_mbox = cb->first_stat_mbox;
880 
881 	/* Enable the Memory Mailbox Interface. */
882 	cb->dual_mode_interface = true;
883 	mbox.typeX.opcode = 0x2B;
884 	mbox.typeX.id = 0;
885 	mbox.typeX.opcode2 = 0x14;
886 	mbox.typeX.cmd_mbox_addr = cb->cmd_mbox_addr;
887 	mbox.typeX.stat_mbox_addr = cb->stat_mbox_addr;
888 
889 	status = mmio_init_fn(pdev, base, &mbox);
890 	if (status != MYRB_STATUS_SUCCESS) {
891 		cb->dual_mode_interface = false;
892 		mbox.typeX.opcode2 = 0x10;
893 		status = mmio_init_fn(pdev, base, &mbox);
894 		if (status != MYRB_STATUS_SUCCESS) {
895 			dev_err(&pdev->dev,
896 				"Failed to enable mailbox, statux %02X\n",
897 				status);
898 			return false;
899 		}
900 	}
901 	return true;
902 }
903 
904 /**
905  * myrb_get_hba_config - reads the configuration information
906  *
907  * Reads the configuration information from the controller and
908  * initializes the controller structure.
909  *
910  * Return: 0 on success, errno otherwise
911  */
912 static int myrb_get_hba_config(struct myrb_hba *cb)
913 {
914 	struct myrb_enquiry2 *enquiry2;
915 	dma_addr_t enquiry2_addr;
916 	struct myrb_config2 *config2;
917 	dma_addr_t config2_addr;
918 	struct Scsi_Host *shost = cb->host;
919 	struct pci_dev *pdev = cb->pdev;
920 	int pchan_max = 0, pchan_cur = 0;
921 	unsigned short status;
922 	int ret = -ENODEV, memsize = 0;
923 
924 	enquiry2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
925 				      &enquiry2_addr, GFP_KERNEL);
926 	if (!enquiry2) {
927 		shost_printk(KERN_ERR, cb->host,
928 			     "Failed to allocate V1 enquiry2 memory\n");
929 		return -ENOMEM;
930 	}
931 	config2 = dma_alloc_coherent(&pdev->dev, sizeof(struct myrb_config2),
932 				     &config2_addr, GFP_KERNEL);
933 	if (!config2) {
934 		shost_printk(KERN_ERR, cb->host,
935 			     "Failed to allocate V1 config2 memory\n");
936 		dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
937 				  enquiry2, enquiry2_addr);
938 		return -ENOMEM;
939 	}
940 	mutex_lock(&cb->dma_mutex);
941 	status = myrb_hba_enquiry(cb);
942 	mutex_unlock(&cb->dma_mutex);
943 	if (status != MYRB_STATUS_SUCCESS) {
944 		shost_printk(KERN_WARNING, cb->host,
945 			     "Failed it issue V1 Enquiry\n");
946 		goto out_free;
947 	}
948 
949 	status = myrb_exec_type3(cb, MYRB_CMD_ENQUIRY2, enquiry2_addr);
950 	if (status != MYRB_STATUS_SUCCESS) {
951 		shost_printk(KERN_WARNING, cb->host,
952 			     "Failed to issue V1 Enquiry2\n");
953 		goto out_free;
954 	}
955 
956 	status = myrb_exec_type3(cb, MYRB_CMD_READ_CONFIG2, config2_addr);
957 	if (status != MYRB_STATUS_SUCCESS) {
958 		shost_printk(KERN_WARNING, cb->host,
959 			     "Failed to issue ReadConfig2\n");
960 		goto out_free;
961 	}
962 
963 	status = myrb_get_ldev_info(cb);
964 	if (status != MYRB_STATUS_SUCCESS) {
965 		shost_printk(KERN_WARNING, cb->host,
966 			     "Failed to get logical drive information\n");
967 		goto out_free;
968 	}
969 
970 	/*
971 	 * Initialize the Controller Model Name and Full Model Name fields.
972 	 */
973 	switch (enquiry2->hw.sub_model) {
974 	case DAC960_V1_P_PD_PU:
975 		if (enquiry2->scsi_cap.bus_speed == MYRB_SCSI_SPEED_ULTRA)
976 			strcpy(cb->model_name, "DAC960PU");
977 		else
978 			strcpy(cb->model_name, "DAC960PD");
979 		break;
980 	case DAC960_V1_PL:
981 		strcpy(cb->model_name, "DAC960PL");
982 		break;
983 	case DAC960_V1_PG:
984 		strcpy(cb->model_name, "DAC960PG");
985 		break;
986 	case DAC960_V1_PJ:
987 		strcpy(cb->model_name, "DAC960PJ");
988 		break;
989 	case DAC960_V1_PR:
990 		strcpy(cb->model_name, "DAC960PR");
991 		break;
992 	case DAC960_V1_PT:
993 		strcpy(cb->model_name, "DAC960PT");
994 		break;
995 	case DAC960_V1_PTL0:
996 		strcpy(cb->model_name, "DAC960PTL0");
997 		break;
998 	case DAC960_V1_PRL:
999 		strcpy(cb->model_name, "DAC960PRL");
1000 		break;
1001 	case DAC960_V1_PTL1:
1002 		strcpy(cb->model_name, "DAC960PTL1");
1003 		break;
1004 	case DAC960_V1_1164P:
1005 		strcpy(cb->model_name, "eXtremeRAID 1100");
1006 		break;
1007 	default:
1008 		shost_printk(KERN_WARNING, cb->host,
1009 			     "Unknown Model %X\n",
1010 			     enquiry2->hw.sub_model);
1011 		goto out;
1012 	}
1013 	/*
1014 	 * Initialize the Controller Firmware Version field and verify that it
1015 	 * is a supported firmware version.
1016 	 * The supported firmware versions are:
1017 	 *
1018 	 * DAC1164P		    5.06 and above
1019 	 * DAC960PTL/PRL/PJ/PG	    4.06 and above
1020 	 * DAC960PU/PD/PL	    3.51 and above
1021 	 * DAC960PU/PD/PL/P	    2.73 and above
1022 	 */
1023 #if defined(CONFIG_ALPHA)
1024 	/*
1025 	 * DEC Alpha machines were often equipped with DAC960 cards that were
1026 	 * OEMed from Mylex, and had their own custom firmware. Version 2.70,
1027 	 * the last custom FW revision to be released by DEC for these older
1028 	 * controllers, appears to work quite well with this driver.
1029 	 *
1030 	 * Cards tested successfully were several versions each of the PD and
1031 	 * PU, called by DEC the KZPSC and KZPAC, respectively, and having
1032 	 * the Manufacturer Numbers (from Mylex), usually on a sticker on the
1033 	 * back of the board, of:
1034 	 *
1035 	 * KZPSC:  D040347 (1-channel) or D040348 (2-channel)
1036 	 *         or D040349 (3-channel)
1037 	 * KZPAC:  D040395 (1-channel) or D040396 (2-channel)
1038 	 *         or D040397 (3-channel)
1039 	 */
1040 # define FIRMWARE_27X	"2.70"
1041 #else
1042 # define FIRMWARE_27X	"2.73"
1043 #endif
1044 
1045 	if (enquiry2->fw.major_version == 0) {
1046 		enquiry2->fw.major_version = cb->enquiry->fw_major_version;
1047 		enquiry2->fw.minor_version = cb->enquiry->fw_minor_version;
1048 		enquiry2->fw.firmware_type = '0';
1049 		enquiry2->fw.turn_id = 0;
1050 	}
1051 	snprintf(cb->fw_version, sizeof(cb->fw_version),
1052 		"%u.%02u-%c-%02u",
1053 		enquiry2->fw.major_version,
1054 		enquiry2->fw.minor_version,
1055 		enquiry2->fw.firmware_type,
1056 		enquiry2->fw.turn_id);
1057 	if (!((enquiry2->fw.major_version == 5 &&
1058 	       enquiry2->fw.minor_version >= 6) ||
1059 	      (enquiry2->fw.major_version == 4 &&
1060 	       enquiry2->fw.minor_version >= 6) ||
1061 	      (enquiry2->fw.major_version == 3 &&
1062 	       enquiry2->fw.minor_version >= 51) ||
1063 	      (enquiry2->fw.major_version == 2 &&
1064 	       strcmp(cb->fw_version, FIRMWARE_27X) >= 0))) {
1065 		shost_printk(KERN_WARNING, cb->host,
1066 			"Firmware Version '%s' unsupported\n",
1067 			cb->fw_version);
1068 		goto out;
1069 	}
1070 	/*
1071 	 * Initialize the Channels, Targets, Memory Size, and SAF-TE
1072 	 * Enclosure Management Enabled fields.
1073 	 */
1074 	switch (enquiry2->hw.model) {
1075 	case MYRB_5_CHANNEL_BOARD:
1076 		pchan_max = 5;
1077 		break;
1078 	case MYRB_3_CHANNEL_BOARD:
1079 	case MYRB_3_CHANNEL_ASIC_DAC:
1080 		pchan_max = 3;
1081 		break;
1082 	case MYRB_2_CHANNEL_BOARD:
1083 		pchan_max = 2;
1084 		break;
1085 	default:
1086 		pchan_max = enquiry2->cfg_chan;
1087 		break;
1088 	}
1089 	pchan_cur = enquiry2->cur_chan;
1090 	if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_32BIT)
1091 		cb->bus_width = 32;
1092 	else if (enquiry2->scsi_cap.bus_width == MYRB_WIDTH_WIDE_16BIT)
1093 		cb->bus_width = 16;
1094 	else
1095 		cb->bus_width = 8;
1096 	cb->ldev_block_size = enquiry2->ldev_block_size;
1097 	shost->max_channel = pchan_cur;
1098 	shost->max_id = enquiry2->max_targets;
1099 	memsize = enquiry2->mem_size >> 20;
1100 	cb->safte_enabled = (enquiry2->fault_mgmt == MYRB_FAULT_SAFTE);
1101 	/*
1102 	 * Initialize the Controller Queue Depth, Driver Queue Depth,
1103 	 * Logical Drive Count, Maximum Blocks per Command, Controller
1104 	 * Scatter/Gather Limit, and Driver Scatter/Gather Limit.
1105 	 * The Driver Queue Depth must be at most one less than the
1106 	 * Controller Queue Depth to allow for an automatic drive
1107 	 * rebuild operation.
1108 	 */
1109 	shost->can_queue = cb->enquiry->max_tcq;
1110 	if (shost->can_queue < 3)
1111 		shost->can_queue = enquiry2->max_cmds;
1112 	if (shost->can_queue < 3)
1113 		/* Play safe and disable TCQ */
1114 		shost->can_queue = 1;
1115 
1116 	if (shost->can_queue > MYRB_CMD_MBOX_COUNT - 2)
1117 		shost->can_queue = MYRB_CMD_MBOX_COUNT - 2;
1118 	shost->max_sectors = enquiry2->max_sectors;
1119 	shost->sg_tablesize = enquiry2->max_sge;
1120 	if (shost->sg_tablesize > MYRB_SCATTER_GATHER_LIMIT)
1121 		shost->sg_tablesize = MYRB_SCATTER_GATHER_LIMIT;
1122 	/*
1123 	 * Initialize the Stripe Size, Segment Size, and Geometry Translation.
1124 	 */
1125 	cb->stripe_size = config2->blocks_per_stripe * config2->block_factor
1126 		>> (10 - MYRB_BLKSIZE_BITS);
1127 	cb->segment_size = config2->blocks_per_cacheline * config2->block_factor
1128 		>> (10 - MYRB_BLKSIZE_BITS);
1129 	/* Assume 255/63 translation */
1130 	cb->ldev_geom_heads = 255;
1131 	cb->ldev_geom_sectors = 63;
1132 	if (config2->drive_geometry) {
1133 		cb->ldev_geom_heads = 128;
1134 		cb->ldev_geom_sectors = 32;
1135 	}
1136 
1137 	/*
1138 	 * Initialize the Background Initialization Status.
1139 	 */
1140 	if ((cb->fw_version[0] == '4' &&
1141 	     strcmp(cb->fw_version, "4.08") >= 0) ||
1142 	    (cb->fw_version[0] == '5' &&
1143 	     strcmp(cb->fw_version, "5.08") >= 0)) {
1144 		cb->bgi_status_supported = true;
1145 		myrb_bgi_control(cb);
1146 	}
1147 	cb->last_rbld_status = MYRB_NO_STDBY_RBLD_OR_CHECK_IN_PROGRESS;
1148 	ret = 0;
1149 
1150 out:
1151 	shost_printk(KERN_INFO, cb->host,
1152 		"Configuring %s PCI RAID Controller\n", cb->model_name);
1153 	shost_printk(KERN_INFO, cb->host,
1154 		"  Firmware Version: %s, Memory Size: %dMB\n",
1155 		cb->fw_version, memsize);
1156 	if (cb->io_addr == 0)
1157 		shost_printk(KERN_INFO, cb->host,
1158 			"  I/O Address: n/a, PCI Address: 0x%lX, IRQ Channel: %d\n",
1159 			(unsigned long)cb->pci_addr, cb->irq);
1160 	else
1161 		shost_printk(KERN_INFO, cb->host,
1162 			"  I/O Address: 0x%lX, PCI Address: 0x%lX, IRQ Channel: %d\n",
1163 			(unsigned long)cb->io_addr, (unsigned long)cb->pci_addr,
1164 			cb->irq);
1165 	shost_printk(KERN_INFO, cb->host,
1166 		"  Controller Queue Depth: %d, Maximum Blocks per Command: %d\n",
1167 		cb->host->can_queue, cb->host->max_sectors);
1168 	shost_printk(KERN_INFO, cb->host,
1169 		     "  Driver Queue Depth: %d, Scatter/Gather Limit: %d of %d Segments\n",
1170 		     cb->host->can_queue, cb->host->sg_tablesize,
1171 		     MYRB_SCATTER_GATHER_LIMIT);
1172 	shost_printk(KERN_INFO, cb->host,
1173 		     "  Stripe Size: %dKB, Segment Size: %dKB, BIOS Geometry: %d/%d%s\n",
1174 		     cb->stripe_size, cb->segment_size,
1175 		     cb->ldev_geom_heads, cb->ldev_geom_sectors,
1176 		     cb->safte_enabled ?
1177 		     "  SAF-TE Enclosure Management Enabled" : "");
1178 	shost_printk(KERN_INFO, cb->host,
1179 		     "  Physical: %d/%d channels %d/%d/%d devices\n",
1180 		     pchan_cur, pchan_max, 0, cb->enquiry->pdev_dead,
1181 		     cb->host->max_id);
1182 
1183 	shost_printk(KERN_INFO, cb->host,
1184 		     "  Logical: 1/1 channels, %d/%d disks\n",
1185 		     cb->enquiry->ldev_count, MYRB_MAX_LDEVS);
1186 
1187 out_free:
1188 	dma_free_coherent(&pdev->dev, sizeof(struct myrb_enquiry2),
1189 			  enquiry2, enquiry2_addr);
1190 	dma_free_coherent(&pdev->dev, sizeof(struct myrb_config2),
1191 			  config2, config2_addr);
1192 
1193 	return ret;
1194 }
1195 
1196 /**
1197  * myrb_unmap - unmaps controller structures
1198  */
1199 static void myrb_unmap(struct myrb_hba *cb)
1200 {
1201 	if (cb->ldev_info_buf) {
1202 		size_t ldev_info_size = sizeof(struct myrb_ldev_info) *
1203 			MYRB_MAX_LDEVS;
1204 		dma_free_coherent(&cb->pdev->dev, ldev_info_size,
1205 				  cb->ldev_info_buf, cb->ldev_info_addr);
1206 		cb->ldev_info_buf = NULL;
1207 	}
1208 	if (cb->err_table) {
1209 		size_t err_table_size = sizeof(struct myrb_error_entry) *
1210 			MYRB_MAX_CHANNELS * MYRB_MAX_TARGETS;
1211 		dma_free_coherent(&cb->pdev->dev, err_table_size,
1212 				  cb->err_table, cb->err_table_addr);
1213 		cb->err_table = NULL;
1214 	}
1215 	if (cb->enquiry) {
1216 		dma_free_coherent(&cb->pdev->dev, sizeof(struct myrb_enquiry),
1217 				  cb->enquiry, cb->enquiry_addr);
1218 		cb->enquiry = NULL;
1219 	}
1220 	if (cb->first_stat_mbox) {
1221 		dma_free_coherent(&cb->pdev->dev, cb->stat_mbox_size,
1222 				  cb->first_stat_mbox, cb->stat_mbox_addr);
1223 		cb->first_stat_mbox = NULL;
1224 	}
1225 	if (cb->first_cmd_mbox) {
1226 		dma_free_coherent(&cb->pdev->dev, cb->cmd_mbox_size,
1227 				  cb->first_cmd_mbox, cb->cmd_mbox_addr);
1228 		cb->first_cmd_mbox = NULL;
1229 	}
1230 }
1231 
1232 /**
1233  * myrb_cleanup - cleanup controller structures
1234  */
1235 static void myrb_cleanup(struct myrb_hba *cb)
1236 {
1237 	struct pci_dev *pdev = cb->pdev;
1238 
1239 	/* Free the memory mailbox, status, and related structures */
1240 	myrb_unmap(cb);
1241 
1242 	if (cb->mmio_base) {
1243 		cb->disable_intr(cb->io_base);
1244 		iounmap(cb->mmio_base);
1245 	}
1246 	if (cb->irq)
1247 		free_irq(cb->irq, cb);
1248 	if (cb->io_addr)
1249 		release_region(cb->io_addr, 0x80);
1250 	pci_set_drvdata(pdev, NULL);
1251 	pci_disable_device(pdev);
1252 	scsi_host_put(cb->host);
1253 }
1254 
1255 static int myrb_host_reset(struct scsi_cmnd *scmd)
1256 {
1257 	struct Scsi_Host *shost = scmd->device->host;
1258 	struct myrb_hba *cb = shost_priv(shost);
1259 
1260 	cb->reset(cb->io_base);
1261 	return SUCCESS;
1262 }
1263 
1264 static int myrb_pthru_queuecommand(struct Scsi_Host *shost,
1265 		struct scsi_cmnd *scmd)
1266 {
1267 	struct myrb_hba *cb = shost_priv(shost);
1268 	struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1269 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1270 	struct myrb_dcdb *dcdb;
1271 	dma_addr_t dcdb_addr;
1272 	struct scsi_device *sdev = scmd->device;
1273 	struct scatterlist *sgl;
1274 	unsigned long flags;
1275 	int nsge;
1276 
1277 	myrb_reset_cmd(cmd_blk);
1278 	dcdb = dma_pool_alloc(cb->dcdb_pool, GFP_ATOMIC, &dcdb_addr);
1279 	if (!dcdb)
1280 		return SCSI_MLQUEUE_HOST_BUSY;
1281 	nsge = scsi_dma_map(scmd);
1282 	if (nsge > 1) {
1283 		dma_pool_free(cb->dcdb_pool, dcdb, dcdb_addr);
1284 		scmd->result = (DID_ERROR << 16);
1285 		scmd->scsi_done(scmd);
1286 		return 0;
1287 	}
1288 
1289 	mbox->type3.opcode = MYRB_CMD_DCDB;
1290 	mbox->type3.id = scmd->request->tag + 3;
1291 	mbox->type3.addr = dcdb_addr;
1292 	dcdb->channel = sdev->channel;
1293 	dcdb->target = sdev->id;
1294 	switch (scmd->sc_data_direction) {
1295 	case DMA_NONE:
1296 		dcdb->data_xfer = MYRB_DCDB_XFER_NONE;
1297 		break;
1298 	case DMA_TO_DEVICE:
1299 		dcdb->data_xfer = MYRB_DCDB_XFER_SYSTEM_TO_DEVICE;
1300 		break;
1301 	case DMA_FROM_DEVICE:
1302 		dcdb->data_xfer = MYRB_DCDB_XFER_DEVICE_TO_SYSTEM;
1303 		break;
1304 	default:
1305 		dcdb->data_xfer = MYRB_DCDB_XFER_ILLEGAL;
1306 		break;
1307 	}
1308 	dcdb->early_status = false;
1309 	if (scmd->request->timeout <= 10)
1310 		dcdb->timeout = MYRB_DCDB_TMO_10_SECS;
1311 	else if (scmd->request->timeout <= 60)
1312 		dcdb->timeout = MYRB_DCDB_TMO_60_SECS;
1313 	else if (scmd->request->timeout <= 600)
1314 		dcdb->timeout = MYRB_DCDB_TMO_10_MINS;
1315 	else
1316 		dcdb->timeout = MYRB_DCDB_TMO_24_HRS;
1317 	dcdb->no_autosense = false;
1318 	dcdb->allow_disconnect = true;
1319 	sgl = scsi_sglist(scmd);
1320 	dcdb->dma_addr = sg_dma_address(sgl);
1321 	if (sg_dma_len(sgl) > USHRT_MAX) {
1322 		dcdb->xfer_len_lo = sg_dma_len(sgl) & 0xffff;
1323 		dcdb->xfer_len_hi4 = sg_dma_len(sgl) >> 16;
1324 	} else {
1325 		dcdb->xfer_len_lo = sg_dma_len(sgl);
1326 		dcdb->xfer_len_hi4 = 0;
1327 	}
1328 	dcdb->cdb_len = scmd->cmd_len;
1329 	dcdb->sense_len = sizeof(dcdb->sense);
1330 	memcpy(&dcdb->cdb, scmd->cmnd, scmd->cmd_len);
1331 
1332 	spin_lock_irqsave(&cb->queue_lock, flags);
1333 	cb->qcmd(cb, cmd_blk);
1334 	spin_unlock_irqrestore(&cb->queue_lock, flags);
1335 	return 0;
1336 }
1337 
1338 static void myrb_inquiry(struct myrb_hba *cb,
1339 		struct scsi_cmnd *scmd)
1340 {
1341 	unsigned char inq[36] = {
1342 		0x00, 0x00, 0x03, 0x02, 0x20, 0x00, 0x01, 0x00,
1343 		0x4d, 0x59, 0x4c, 0x45, 0x58, 0x20, 0x20, 0x20,
1344 		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1345 		0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
1346 		0x20, 0x20, 0x20, 0x20,
1347 	};
1348 
1349 	if (cb->bus_width > 16)
1350 		inq[7] |= 1 << 6;
1351 	if (cb->bus_width > 8)
1352 		inq[7] |= 1 << 5;
1353 	memcpy(&inq[16], cb->model_name, 16);
1354 	memcpy(&inq[32], cb->fw_version, 1);
1355 	memcpy(&inq[33], &cb->fw_version[2], 2);
1356 	memcpy(&inq[35], &cb->fw_version[7], 1);
1357 
1358 	scsi_sg_copy_from_buffer(scmd, (void *)inq, 36);
1359 }
1360 
1361 static void
1362 myrb_mode_sense(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1363 		struct myrb_ldev_info *ldev_info)
1364 {
1365 	unsigned char modes[32], *mode_pg;
1366 	bool dbd;
1367 	size_t mode_len;
1368 
1369 	dbd = (scmd->cmnd[1] & 0x08) == 0x08;
1370 	if (dbd) {
1371 		mode_len = 24;
1372 		mode_pg = &modes[4];
1373 	} else {
1374 		mode_len = 32;
1375 		mode_pg = &modes[12];
1376 	}
1377 	memset(modes, 0, sizeof(modes));
1378 	modes[0] = mode_len - 1;
1379 	if (!dbd) {
1380 		unsigned char *block_desc = &modes[4];
1381 
1382 		modes[3] = 8;
1383 		put_unaligned_be32(ldev_info->size, &block_desc[0]);
1384 		put_unaligned_be32(cb->ldev_block_size, &block_desc[5]);
1385 	}
1386 	mode_pg[0] = 0x08;
1387 	mode_pg[1] = 0x12;
1388 	if (ldev_info->wb_enabled)
1389 		mode_pg[2] |= 0x04;
1390 	if (cb->segment_size) {
1391 		mode_pg[2] |= 0x08;
1392 		put_unaligned_be16(cb->segment_size, &mode_pg[14]);
1393 	}
1394 
1395 	scsi_sg_copy_from_buffer(scmd, modes, mode_len);
1396 }
1397 
1398 static void myrb_request_sense(struct myrb_hba *cb,
1399 		struct scsi_cmnd *scmd)
1400 {
1401 	scsi_build_sense_buffer(0, scmd->sense_buffer,
1402 				NO_SENSE, 0, 0);
1403 	scsi_sg_copy_from_buffer(scmd, scmd->sense_buffer,
1404 				 SCSI_SENSE_BUFFERSIZE);
1405 }
1406 
1407 static void myrb_read_capacity(struct myrb_hba *cb, struct scsi_cmnd *scmd,
1408 		struct myrb_ldev_info *ldev_info)
1409 {
1410 	unsigned char data[8];
1411 
1412 	dev_dbg(&scmd->device->sdev_gendev,
1413 		"Capacity %u, blocksize %u\n",
1414 		ldev_info->size, cb->ldev_block_size);
1415 	put_unaligned_be32(ldev_info->size - 1, &data[0]);
1416 	put_unaligned_be32(cb->ldev_block_size, &data[4]);
1417 	scsi_sg_copy_from_buffer(scmd, data, 8);
1418 }
1419 
1420 static int myrb_ldev_queuecommand(struct Scsi_Host *shost,
1421 		struct scsi_cmnd *scmd)
1422 {
1423 	struct myrb_hba *cb = shost_priv(shost);
1424 	struct myrb_cmdblk *cmd_blk = scsi_cmd_priv(scmd);
1425 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
1426 	struct myrb_ldev_info *ldev_info;
1427 	struct scsi_device *sdev = scmd->device;
1428 	struct scatterlist *sgl;
1429 	unsigned long flags;
1430 	u64 lba;
1431 	u32 block_cnt;
1432 	int nsge;
1433 
1434 	ldev_info = sdev->hostdata;
1435 	if (ldev_info->state != MYRB_DEVICE_ONLINE &&
1436 	    ldev_info->state != MYRB_DEVICE_WO) {
1437 		dev_dbg(&shost->shost_gendev, "ldev %u in state %x, skip\n",
1438 			sdev->id, ldev_info ? ldev_info->state : 0xff);
1439 		scmd->result = (DID_BAD_TARGET << 16);
1440 		scmd->scsi_done(scmd);
1441 		return 0;
1442 	}
1443 	switch (scmd->cmnd[0]) {
1444 	case TEST_UNIT_READY:
1445 		scmd->result = (DID_OK << 16);
1446 		scmd->scsi_done(scmd);
1447 		return 0;
1448 	case INQUIRY:
1449 		if (scmd->cmnd[1] & 1) {
1450 			/* Illegal request, invalid field in CDB */
1451 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1452 						ILLEGAL_REQUEST, 0x24, 0);
1453 			scmd->result = (DRIVER_SENSE << 24) |
1454 				SAM_STAT_CHECK_CONDITION;
1455 		} else {
1456 			myrb_inquiry(cb, scmd);
1457 			scmd->result = (DID_OK << 16);
1458 		}
1459 		scmd->scsi_done(scmd);
1460 		return 0;
1461 	case SYNCHRONIZE_CACHE:
1462 		scmd->result = (DID_OK << 16);
1463 		scmd->scsi_done(scmd);
1464 		return 0;
1465 	case MODE_SENSE:
1466 		if ((scmd->cmnd[2] & 0x3F) != 0x3F &&
1467 		    (scmd->cmnd[2] & 0x3F) != 0x08) {
1468 			/* Illegal request, invalid field in CDB */
1469 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1470 						ILLEGAL_REQUEST, 0x24, 0);
1471 			scmd->result = (DRIVER_SENSE << 24) |
1472 				SAM_STAT_CHECK_CONDITION;
1473 		} else {
1474 			myrb_mode_sense(cb, scmd, ldev_info);
1475 			scmd->result = (DID_OK << 16);
1476 		}
1477 		scmd->scsi_done(scmd);
1478 		return 0;
1479 	case READ_CAPACITY:
1480 		if ((scmd->cmnd[1] & 1) ||
1481 		    (scmd->cmnd[8] & 1)) {
1482 			/* Illegal request, invalid field in CDB */
1483 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1484 						ILLEGAL_REQUEST, 0x24, 0);
1485 			scmd->result = (DRIVER_SENSE << 24) |
1486 				SAM_STAT_CHECK_CONDITION;
1487 			scmd->scsi_done(scmd);
1488 			return 0;
1489 		}
1490 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1491 		if (lba) {
1492 			/* Illegal request, invalid field in CDB */
1493 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1494 						ILLEGAL_REQUEST, 0x24, 0);
1495 			scmd->result = (DRIVER_SENSE << 24) |
1496 				SAM_STAT_CHECK_CONDITION;
1497 			scmd->scsi_done(scmd);
1498 			return 0;
1499 		}
1500 		myrb_read_capacity(cb, scmd, ldev_info);
1501 		scmd->scsi_done(scmd);
1502 		return 0;
1503 	case REQUEST_SENSE:
1504 		myrb_request_sense(cb, scmd);
1505 		scmd->result = (DID_OK << 16);
1506 		return 0;
1507 	case SEND_DIAGNOSTIC:
1508 		if (scmd->cmnd[1] != 0x04) {
1509 			/* Illegal request, invalid field in CDB */
1510 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1511 						ILLEGAL_REQUEST, 0x24, 0);
1512 			scmd->result = (DRIVER_SENSE << 24) |
1513 				SAM_STAT_CHECK_CONDITION;
1514 		} else {
1515 			/* Assume good status */
1516 			scmd->result = (DID_OK << 16);
1517 		}
1518 		scmd->scsi_done(scmd);
1519 		return 0;
1520 	case READ_6:
1521 		if (ldev_info->state == MYRB_DEVICE_WO) {
1522 			/* Data protect, attempt to read invalid data */
1523 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1524 						DATA_PROTECT, 0x21, 0x06);
1525 			scmd->result = (DRIVER_SENSE << 24) |
1526 				SAM_STAT_CHECK_CONDITION;
1527 			scmd->scsi_done(scmd);
1528 			return 0;
1529 		}
1530 		fallthrough;
1531 	case WRITE_6:
1532 		lba = (((scmd->cmnd[1] & 0x1F) << 16) |
1533 		       (scmd->cmnd[2] << 8) |
1534 		       scmd->cmnd[3]);
1535 		block_cnt = scmd->cmnd[4];
1536 		break;
1537 	case READ_10:
1538 		if (ldev_info->state == MYRB_DEVICE_WO) {
1539 			/* Data protect, attempt to read invalid data */
1540 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1541 						DATA_PROTECT, 0x21, 0x06);
1542 			scmd->result = (DRIVER_SENSE << 24) |
1543 				SAM_STAT_CHECK_CONDITION;
1544 			scmd->scsi_done(scmd);
1545 			return 0;
1546 		}
1547 		fallthrough;
1548 	case WRITE_10:
1549 	case VERIFY:		/* 0x2F */
1550 	case WRITE_VERIFY:	/* 0x2E */
1551 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1552 		block_cnt = get_unaligned_be16(&scmd->cmnd[7]);
1553 		break;
1554 	case READ_12:
1555 		if (ldev_info->state == MYRB_DEVICE_WO) {
1556 			/* Data protect, attempt to read invalid data */
1557 			scsi_build_sense_buffer(0, scmd->sense_buffer,
1558 						DATA_PROTECT, 0x21, 0x06);
1559 			scmd->result = (DRIVER_SENSE << 24) |
1560 				SAM_STAT_CHECK_CONDITION;
1561 			scmd->scsi_done(scmd);
1562 			return 0;
1563 		}
1564 		fallthrough;
1565 	case WRITE_12:
1566 	case VERIFY_12: /* 0xAF */
1567 	case WRITE_VERIFY_12:	/* 0xAE */
1568 		lba = get_unaligned_be32(&scmd->cmnd[2]);
1569 		block_cnt = get_unaligned_be32(&scmd->cmnd[6]);
1570 		break;
1571 	default:
1572 		/* Illegal request, invalid opcode */
1573 		scsi_build_sense_buffer(0, scmd->sense_buffer,
1574 					ILLEGAL_REQUEST, 0x20, 0);
1575 		scmd->result = (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
1576 		scmd->scsi_done(scmd);
1577 		return 0;
1578 	}
1579 
1580 	myrb_reset_cmd(cmd_blk);
1581 	mbox->type5.id = scmd->request->tag + 3;
1582 	if (scmd->sc_data_direction == DMA_NONE)
1583 		goto submit;
1584 	nsge = scsi_dma_map(scmd);
1585 	if (nsge == 1) {
1586 		sgl = scsi_sglist(scmd);
1587 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1588 			mbox->type5.opcode = MYRB_CMD_READ;
1589 		else
1590 			mbox->type5.opcode = MYRB_CMD_WRITE;
1591 
1592 		mbox->type5.ld.xfer_len = block_cnt;
1593 		mbox->type5.ld.ldev_num = sdev->id;
1594 		mbox->type5.lba = lba;
1595 		mbox->type5.addr = (u32)sg_dma_address(sgl);
1596 	} else {
1597 		struct myrb_sge *hw_sgl;
1598 		dma_addr_t hw_sgl_addr;
1599 		int i;
1600 
1601 		hw_sgl = dma_pool_alloc(cb->sg_pool, GFP_ATOMIC, &hw_sgl_addr);
1602 		if (!hw_sgl)
1603 			return SCSI_MLQUEUE_HOST_BUSY;
1604 
1605 		cmd_blk->sgl = hw_sgl;
1606 		cmd_blk->sgl_addr = hw_sgl_addr;
1607 
1608 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
1609 			mbox->type5.opcode = MYRB_CMD_READ_SG;
1610 		else
1611 			mbox->type5.opcode = MYRB_CMD_WRITE_SG;
1612 
1613 		mbox->type5.ld.xfer_len = block_cnt;
1614 		mbox->type5.ld.ldev_num = sdev->id;
1615 		mbox->type5.lba = lba;
1616 		mbox->type5.addr = hw_sgl_addr;
1617 		mbox->type5.sg_count = nsge;
1618 
1619 		scsi_for_each_sg(scmd, sgl, nsge, i) {
1620 			hw_sgl->sge_addr = (u32)sg_dma_address(sgl);
1621 			hw_sgl->sge_count = (u32)sg_dma_len(sgl);
1622 			hw_sgl++;
1623 		}
1624 	}
1625 submit:
1626 	spin_lock_irqsave(&cb->queue_lock, flags);
1627 	cb->qcmd(cb, cmd_blk);
1628 	spin_unlock_irqrestore(&cb->queue_lock, flags);
1629 
1630 	return 0;
1631 }
1632 
1633 static int myrb_queuecommand(struct Scsi_Host *shost,
1634 		struct scsi_cmnd *scmd)
1635 {
1636 	struct scsi_device *sdev = scmd->device;
1637 
1638 	if (sdev->channel > myrb_logical_channel(shost)) {
1639 		scmd->result = (DID_BAD_TARGET << 16);
1640 		scmd->scsi_done(scmd);
1641 		return 0;
1642 	}
1643 	if (sdev->channel == myrb_logical_channel(shost))
1644 		return myrb_ldev_queuecommand(shost, scmd);
1645 
1646 	return myrb_pthru_queuecommand(shost, scmd);
1647 }
1648 
1649 static int myrb_ldev_slave_alloc(struct scsi_device *sdev)
1650 {
1651 	struct myrb_hba *cb = shost_priv(sdev->host);
1652 	struct myrb_ldev_info *ldev_info;
1653 	unsigned short ldev_num = sdev->id;
1654 	enum raid_level level;
1655 
1656 	ldev_info = cb->ldev_info_buf + ldev_num;
1657 	if (!ldev_info)
1658 		return -ENXIO;
1659 
1660 	sdev->hostdata = kzalloc(sizeof(*ldev_info), GFP_KERNEL);
1661 	if (!sdev->hostdata)
1662 		return -ENOMEM;
1663 	dev_dbg(&sdev->sdev_gendev,
1664 		"slave alloc ldev %d state %x\n",
1665 		ldev_num, ldev_info->state);
1666 	memcpy(sdev->hostdata, ldev_info,
1667 	       sizeof(*ldev_info));
1668 	switch (ldev_info->raid_level) {
1669 	case MYRB_RAID_LEVEL0:
1670 		level = RAID_LEVEL_LINEAR;
1671 		break;
1672 	case MYRB_RAID_LEVEL1:
1673 		level = RAID_LEVEL_1;
1674 		break;
1675 	case MYRB_RAID_LEVEL3:
1676 		level = RAID_LEVEL_3;
1677 		break;
1678 	case MYRB_RAID_LEVEL5:
1679 		level = RAID_LEVEL_5;
1680 		break;
1681 	case MYRB_RAID_LEVEL6:
1682 		level = RAID_LEVEL_6;
1683 		break;
1684 	case MYRB_RAID_JBOD:
1685 		level = RAID_LEVEL_JBOD;
1686 		break;
1687 	default:
1688 		level = RAID_LEVEL_UNKNOWN;
1689 		break;
1690 	}
1691 	raid_set_level(myrb_raid_template, &sdev->sdev_gendev, level);
1692 	return 0;
1693 }
1694 
1695 static int myrb_pdev_slave_alloc(struct scsi_device *sdev)
1696 {
1697 	struct myrb_hba *cb = shost_priv(sdev->host);
1698 	struct myrb_pdev_state *pdev_info;
1699 	unsigned short status;
1700 
1701 	if (sdev->id > MYRB_MAX_TARGETS)
1702 		return -ENXIO;
1703 
1704 	pdev_info = kzalloc(sizeof(*pdev_info), GFP_KERNEL|GFP_DMA);
1705 	if (!pdev_info)
1706 		return -ENOMEM;
1707 
1708 	status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1709 				  sdev, pdev_info);
1710 	if (status != MYRB_STATUS_SUCCESS) {
1711 		dev_dbg(&sdev->sdev_gendev,
1712 			"Failed to get device state, status %x\n",
1713 			status);
1714 		kfree(pdev_info);
1715 		return -ENXIO;
1716 	}
1717 	if (!pdev_info->present) {
1718 		dev_dbg(&sdev->sdev_gendev,
1719 			"device not present, skip\n");
1720 		kfree(pdev_info);
1721 		return -ENXIO;
1722 	}
1723 	dev_dbg(&sdev->sdev_gendev,
1724 		"slave alloc pdev %d:%d state %x\n",
1725 		sdev->channel, sdev->id, pdev_info->state);
1726 	sdev->hostdata = pdev_info;
1727 
1728 	return 0;
1729 }
1730 
1731 static int myrb_slave_alloc(struct scsi_device *sdev)
1732 {
1733 	if (sdev->channel > myrb_logical_channel(sdev->host))
1734 		return -ENXIO;
1735 
1736 	if (sdev->lun > 0)
1737 		return -ENXIO;
1738 
1739 	if (sdev->channel == myrb_logical_channel(sdev->host))
1740 		return myrb_ldev_slave_alloc(sdev);
1741 
1742 	return myrb_pdev_slave_alloc(sdev);
1743 }
1744 
1745 static int myrb_slave_configure(struct scsi_device *sdev)
1746 {
1747 	struct myrb_ldev_info *ldev_info;
1748 
1749 	if (sdev->channel > myrb_logical_channel(sdev->host))
1750 		return -ENXIO;
1751 
1752 	if (sdev->channel < myrb_logical_channel(sdev->host)) {
1753 		sdev->no_uld_attach = 1;
1754 		return 0;
1755 	}
1756 	if (sdev->lun != 0)
1757 		return -ENXIO;
1758 
1759 	ldev_info = sdev->hostdata;
1760 	if (!ldev_info)
1761 		return -ENXIO;
1762 	if (ldev_info->state != MYRB_DEVICE_ONLINE)
1763 		sdev_printk(KERN_INFO, sdev,
1764 			    "Logical drive is %s\n",
1765 			    myrb_devstate_name(ldev_info->state));
1766 
1767 	sdev->tagged_supported = 1;
1768 	return 0;
1769 }
1770 
1771 static void myrb_slave_destroy(struct scsi_device *sdev)
1772 {
1773 	kfree(sdev->hostdata);
1774 }
1775 
1776 static int myrb_biosparam(struct scsi_device *sdev, struct block_device *bdev,
1777 		sector_t capacity, int geom[])
1778 {
1779 	struct myrb_hba *cb = shost_priv(sdev->host);
1780 
1781 	geom[0] = cb->ldev_geom_heads;
1782 	geom[1] = cb->ldev_geom_sectors;
1783 	geom[2] = sector_div(capacity, geom[0] * geom[1]);
1784 
1785 	return 0;
1786 }
1787 
1788 static ssize_t raid_state_show(struct device *dev,
1789 		struct device_attribute *attr, char *buf)
1790 {
1791 	struct scsi_device *sdev = to_scsi_device(dev);
1792 	struct myrb_hba *cb = shost_priv(sdev->host);
1793 	int ret;
1794 
1795 	if (!sdev->hostdata)
1796 		return snprintf(buf, 16, "Unknown\n");
1797 
1798 	if (sdev->channel == myrb_logical_channel(sdev->host)) {
1799 		struct myrb_ldev_info *ldev_info = sdev->hostdata;
1800 		const char *name;
1801 
1802 		name = myrb_devstate_name(ldev_info->state);
1803 		if (name)
1804 			ret = snprintf(buf, 32, "%s\n", name);
1805 		else
1806 			ret = snprintf(buf, 32, "Invalid (%02X)\n",
1807 				       ldev_info->state);
1808 	} else {
1809 		struct myrb_pdev_state *pdev_info = sdev->hostdata;
1810 		unsigned short status;
1811 		const char *name;
1812 
1813 		status = myrb_exec_type3D(cb, MYRB_CMD_GET_DEVICE_STATE,
1814 					  sdev, pdev_info);
1815 		if (status != MYRB_STATUS_SUCCESS)
1816 			sdev_printk(KERN_INFO, sdev,
1817 				    "Failed to get device state, status %x\n",
1818 				    status);
1819 
1820 		if (!pdev_info->present)
1821 			name = "Removed";
1822 		else
1823 			name = myrb_devstate_name(pdev_info->state);
1824 		if (name)
1825 			ret = snprintf(buf, 32, "%s\n", name);
1826 		else
1827 			ret = snprintf(buf, 32, "Invalid (%02X)\n",
1828 				       pdev_info->state);
1829 	}
1830 	return ret;
1831 }
1832 
1833 static ssize_t raid_state_store(struct device *dev,
1834 		struct device_attribute *attr, const char *buf, size_t count)
1835 {
1836 	struct scsi_device *sdev = to_scsi_device(dev);
1837 	struct myrb_hba *cb = shost_priv(sdev->host);
1838 	struct myrb_pdev_state *pdev_info;
1839 	enum myrb_devstate new_state;
1840 	unsigned short status;
1841 
1842 	if (!strncmp(buf, "kill", 4) ||
1843 	    !strncmp(buf, "offline", 7))
1844 		new_state = MYRB_DEVICE_DEAD;
1845 	else if (!strncmp(buf, "online", 6))
1846 		new_state = MYRB_DEVICE_ONLINE;
1847 	else if (!strncmp(buf, "standby", 7))
1848 		new_state = MYRB_DEVICE_STANDBY;
1849 	else
1850 		return -EINVAL;
1851 
1852 	pdev_info = sdev->hostdata;
1853 	if (!pdev_info) {
1854 		sdev_printk(KERN_INFO, sdev,
1855 			    "Failed - no physical device information\n");
1856 		return -ENXIO;
1857 	}
1858 	if (!pdev_info->present) {
1859 		sdev_printk(KERN_INFO, sdev,
1860 			    "Failed - device not present\n");
1861 		return -ENXIO;
1862 	}
1863 
1864 	if (pdev_info->state == new_state)
1865 		return count;
1866 
1867 	status = myrb_set_pdev_state(cb, sdev, new_state);
1868 	switch (status) {
1869 	case MYRB_STATUS_SUCCESS:
1870 		break;
1871 	case MYRB_STATUS_START_DEVICE_FAILED:
1872 		sdev_printk(KERN_INFO, sdev,
1873 			     "Failed - Unable to Start Device\n");
1874 		count = -EAGAIN;
1875 		break;
1876 	case MYRB_STATUS_NO_DEVICE:
1877 		sdev_printk(KERN_INFO, sdev,
1878 			    "Failed - No Device at Address\n");
1879 		count = -ENODEV;
1880 		break;
1881 	case MYRB_STATUS_INVALID_CHANNEL_OR_TARGET:
1882 		sdev_printk(KERN_INFO, sdev,
1883 			 "Failed - Invalid Channel or Target or Modifier\n");
1884 		count = -EINVAL;
1885 		break;
1886 	case MYRB_STATUS_CHANNEL_BUSY:
1887 		sdev_printk(KERN_INFO, sdev,
1888 			 "Failed - Channel Busy\n");
1889 		count = -EBUSY;
1890 		break;
1891 	default:
1892 		sdev_printk(KERN_INFO, sdev,
1893 			 "Failed - Unexpected Status %04X\n", status);
1894 		count = -EIO;
1895 		break;
1896 	}
1897 	return count;
1898 }
1899 static DEVICE_ATTR_RW(raid_state);
1900 
1901 static ssize_t raid_level_show(struct device *dev,
1902 		struct device_attribute *attr, char *buf)
1903 {
1904 	struct scsi_device *sdev = to_scsi_device(dev);
1905 
1906 	if (sdev->channel == myrb_logical_channel(sdev->host)) {
1907 		struct myrb_ldev_info *ldev_info = sdev->hostdata;
1908 		const char *name;
1909 
1910 		if (!ldev_info)
1911 			return -ENXIO;
1912 
1913 		name = myrb_raidlevel_name(ldev_info->raid_level);
1914 		if (!name)
1915 			return snprintf(buf, 32, "Invalid (%02X)\n",
1916 					ldev_info->state);
1917 		return snprintf(buf, 32, "%s\n", name);
1918 	}
1919 	return snprintf(buf, 32, "Physical Drive\n");
1920 }
1921 static DEVICE_ATTR_RO(raid_level);
1922 
1923 static ssize_t rebuild_show(struct device *dev,
1924 		struct device_attribute *attr, char *buf)
1925 {
1926 	struct scsi_device *sdev = to_scsi_device(dev);
1927 	struct myrb_hba *cb = shost_priv(sdev->host);
1928 	struct myrb_rbld_progress rbld_buf;
1929 	unsigned char status;
1930 
1931 	if (sdev->channel < myrb_logical_channel(sdev->host))
1932 		return snprintf(buf, 32, "physical device - not rebuilding\n");
1933 
1934 	status = myrb_get_rbld_progress(cb, &rbld_buf);
1935 
1936 	if (rbld_buf.ldev_num != sdev->id ||
1937 	    status != MYRB_STATUS_SUCCESS)
1938 		return snprintf(buf, 32, "not rebuilding\n");
1939 
1940 	return snprintf(buf, 32, "rebuilding block %u of %u\n",
1941 			rbld_buf.ldev_size - rbld_buf.blocks_left,
1942 			rbld_buf.ldev_size);
1943 }
1944 
1945 static ssize_t rebuild_store(struct device *dev,
1946 		struct device_attribute *attr, const char *buf, size_t count)
1947 {
1948 	struct scsi_device *sdev = to_scsi_device(dev);
1949 	struct myrb_hba *cb = shost_priv(sdev->host);
1950 	struct myrb_cmdblk *cmd_blk;
1951 	union myrb_cmd_mbox *mbox;
1952 	unsigned short status;
1953 	int rc, start;
1954 	const char *msg;
1955 
1956 	rc = kstrtoint(buf, 0, &start);
1957 	if (rc)
1958 		return rc;
1959 
1960 	if (sdev->channel >= myrb_logical_channel(sdev->host))
1961 		return -ENXIO;
1962 
1963 	status = myrb_get_rbld_progress(cb, NULL);
1964 	if (start) {
1965 		if (status == MYRB_STATUS_SUCCESS) {
1966 			sdev_printk(KERN_INFO, sdev,
1967 				    "Rebuild Not Initiated; already in progress\n");
1968 			return -EALREADY;
1969 		}
1970 		mutex_lock(&cb->dcmd_mutex);
1971 		cmd_blk = &cb->dcmd_blk;
1972 		myrb_reset_cmd(cmd_blk);
1973 		mbox = &cmd_blk->mbox;
1974 		mbox->type3D.opcode = MYRB_CMD_REBUILD_ASYNC;
1975 		mbox->type3D.id = MYRB_DCMD_TAG;
1976 		mbox->type3D.channel = sdev->channel;
1977 		mbox->type3D.target = sdev->id;
1978 		status = myrb_exec_cmd(cb, cmd_blk);
1979 		mutex_unlock(&cb->dcmd_mutex);
1980 	} else {
1981 		struct pci_dev *pdev = cb->pdev;
1982 		unsigned char *rate;
1983 		dma_addr_t rate_addr;
1984 
1985 		if (status != MYRB_STATUS_SUCCESS) {
1986 			sdev_printk(KERN_INFO, sdev,
1987 				    "Rebuild Not Cancelled; not in progress\n");
1988 			return 0;
1989 		}
1990 
1991 		rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
1992 					  &rate_addr, GFP_KERNEL);
1993 		if (rate == NULL) {
1994 			sdev_printk(KERN_INFO, sdev,
1995 				    "Cancellation of Rebuild Failed - Out of Memory\n");
1996 			return -ENOMEM;
1997 		}
1998 		mutex_lock(&cb->dcmd_mutex);
1999 		cmd_blk = &cb->dcmd_blk;
2000 		myrb_reset_cmd(cmd_blk);
2001 		mbox = &cmd_blk->mbox;
2002 		mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2003 		mbox->type3R.id = MYRB_DCMD_TAG;
2004 		mbox->type3R.rbld_rate = 0xFF;
2005 		mbox->type3R.addr = rate_addr;
2006 		status = myrb_exec_cmd(cb, cmd_blk);
2007 		dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2008 		mutex_unlock(&cb->dcmd_mutex);
2009 	}
2010 	if (status == MYRB_STATUS_SUCCESS) {
2011 		sdev_printk(KERN_INFO, sdev, "Rebuild %s\n",
2012 			    start ? "Initiated" : "Cancelled");
2013 		return count;
2014 	}
2015 	if (!start) {
2016 		sdev_printk(KERN_INFO, sdev,
2017 			    "Rebuild Not Cancelled, status 0x%x\n",
2018 			    status);
2019 		return -EIO;
2020 	}
2021 
2022 	switch (status) {
2023 	case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2024 		msg = "Attempt to Rebuild Online or Unresponsive Drive";
2025 		break;
2026 	case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2027 		msg = "New Disk Failed During Rebuild";
2028 		break;
2029 	case MYRB_STATUS_INVALID_ADDRESS:
2030 		msg = "Invalid Device Address";
2031 		break;
2032 	case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2033 		msg = "Already in Progress";
2034 		break;
2035 	default:
2036 		msg = NULL;
2037 		break;
2038 	}
2039 	if (msg)
2040 		sdev_printk(KERN_INFO, sdev,
2041 			    "Rebuild Failed - %s\n", msg);
2042 	else
2043 		sdev_printk(KERN_INFO, sdev,
2044 			    "Rebuild Failed, status 0x%x\n", status);
2045 
2046 	return -EIO;
2047 }
2048 static DEVICE_ATTR_RW(rebuild);
2049 
2050 static ssize_t consistency_check_store(struct device *dev,
2051 		struct device_attribute *attr, const char *buf, size_t count)
2052 {
2053 	struct scsi_device *sdev = to_scsi_device(dev);
2054 	struct myrb_hba *cb = shost_priv(sdev->host);
2055 	struct myrb_rbld_progress rbld_buf;
2056 	struct myrb_cmdblk *cmd_blk;
2057 	union myrb_cmd_mbox *mbox;
2058 	unsigned short ldev_num = 0xFFFF;
2059 	unsigned short status;
2060 	int rc, start;
2061 	const char *msg;
2062 
2063 	rc = kstrtoint(buf, 0, &start);
2064 	if (rc)
2065 		return rc;
2066 
2067 	if (sdev->channel < myrb_logical_channel(sdev->host))
2068 		return -ENXIO;
2069 
2070 	status = myrb_get_rbld_progress(cb, &rbld_buf);
2071 	if (start) {
2072 		if (status == MYRB_STATUS_SUCCESS) {
2073 			sdev_printk(KERN_INFO, sdev,
2074 				    "Check Consistency Not Initiated; already in progress\n");
2075 			return -EALREADY;
2076 		}
2077 		mutex_lock(&cb->dcmd_mutex);
2078 		cmd_blk = &cb->dcmd_blk;
2079 		myrb_reset_cmd(cmd_blk);
2080 		mbox = &cmd_blk->mbox;
2081 		mbox->type3C.opcode = MYRB_CMD_CHECK_CONSISTENCY_ASYNC;
2082 		mbox->type3C.id = MYRB_DCMD_TAG;
2083 		mbox->type3C.ldev_num = sdev->id;
2084 		mbox->type3C.auto_restore = true;
2085 
2086 		status = myrb_exec_cmd(cb, cmd_blk);
2087 		mutex_unlock(&cb->dcmd_mutex);
2088 	} else {
2089 		struct pci_dev *pdev = cb->pdev;
2090 		unsigned char *rate;
2091 		dma_addr_t rate_addr;
2092 
2093 		if (ldev_num != sdev->id) {
2094 			sdev_printk(KERN_INFO, sdev,
2095 				    "Check Consistency Not Cancelled; not in progress\n");
2096 			return 0;
2097 		}
2098 		rate = dma_alloc_coherent(&pdev->dev, sizeof(char),
2099 					  &rate_addr, GFP_KERNEL);
2100 		if (rate == NULL) {
2101 			sdev_printk(KERN_INFO, sdev,
2102 				    "Cancellation of Check Consistency Failed - Out of Memory\n");
2103 			return -ENOMEM;
2104 		}
2105 		mutex_lock(&cb->dcmd_mutex);
2106 		cmd_blk = &cb->dcmd_blk;
2107 		myrb_reset_cmd(cmd_blk);
2108 		mbox = &cmd_blk->mbox;
2109 		mbox->type3R.opcode = MYRB_CMD_REBUILD_CONTROL;
2110 		mbox->type3R.id = MYRB_DCMD_TAG;
2111 		mbox->type3R.rbld_rate = 0xFF;
2112 		mbox->type3R.addr = rate_addr;
2113 		status = myrb_exec_cmd(cb, cmd_blk);
2114 		dma_free_coherent(&pdev->dev, sizeof(char), rate, rate_addr);
2115 		mutex_unlock(&cb->dcmd_mutex);
2116 	}
2117 	if (status == MYRB_STATUS_SUCCESS) {
2118 		sdev_printk(KERN_INFO, sdev, "Check Consistency %s\n",
2119 			    start ? "Initiated" : "Cancelled");
2120 		return count;
2121 	}
2122 	if (!start) {
2123 		sdev_printk(KERN_INFO, sdev,
2124 			    "Check Consistency Not Cancelled, status 0x%x\n",
2125 			    status);
2126 		return -EIO;
2127 	}
2128 
2129 	switch (status) {
2130 	case MYRB_STATUS_ATTEMPT_TO_RBLD_ONLINE_DRIVE:
2131 		msg = "Dependent Physical Device is DEAD";
2132 		break;
2133 	case MYRB_STATUS_RBLD_NEW_DISK_FAILED:
2134 		msg = "New Disk Failed During Rebuild";
2135 		break;
2136 	case MYRB_STATUS_INVALID_ADDRESS:
2137 		msg = "Invalid or Nonredundant Logical Drive";
2138 		break;
2139 	case MYRB_STATUS_RBLD_OR_CHECK_INPROGRESS:
2140 		msg = "Already in Progress";
2141 		break;
2142 	default:
2143 		msg = NULL;
2144 		break;
2145 	}
2146 	if (msg)
2147 		sdev_printk(KERN_INFO, sdev,
2148 			    "Check Consistency Failed - %s\n", msg);
2149 	else
2150 		sdev_printk(KERN_INFO, sdev,
2151 			    "Check Consistency Failed, status 0x%x\n", status);
2152 
2153 	return -EIO;
2154 }
2155 
2156 static ssize_t consistency_check_show(struct device *dev,
2157 		struct device_attribute *attr, char *buf)
2158 {
2159 	return rebuild_show(dev, attr, buf);
2160 }
2161 static DEVICE_ATTR_RW(consistency_check);
2162 
2163 static ssize_t ctlr_num_show(struct device *dev,
2164 		struct device_attribute *attr, char *buf)
2165 {
2166 	struct Scsi_Host *shost = class_to_shost(dev);
2167 	struct myrb_hba *cb = shost_priv(shost);
2168 
2169 	return snprintf(buf, 20, "%u\n", cb->ctlr_num);
2170 }
2171 static DEVICE_ATTR_RO(ctlr_num);
2172 
2173 static ssize_t firmware_show(struct device *dev,
2174 		struct device_attribute *attr, char *buf)
2175 {
2176 	struct Scsi_Host *shost = class_to_shost(dev);
2177 	struct myrb_hba *cb = shost_priv(shost);
2178 
2179 	return snprintf(buf, 16, "%s\n", cb->fw_version);
2180 }
2181 static DEVICE_ATTR_RO(firmware);
2182 
2183 static ssize_t model_show(struct device *dev,
2184 		struct device_attribute *attr, char *buf)
2185 {
2186 	struct Scsi_Host *shost = class_to_shost(dev);
2187 	struct myrb_hba *cb = shost_priv(shost);
2188 
2189 	return snprintf(buf, 16, "%s\n", cb->model_name);
2190 }
2191 static DEVICE_ATTR_RO(model);
2192 
2193 static ssize_t flush_cache_store(struct device *dev,
2194 		struct device_attribute *attr, const char *buf, size_t count)
2195 {
2196 	struct Scsi_Host *shost = class_to_shost(dev);
2197 	struct myrb_hba *cb = shost_priv(shost);
2198 	unsigned short status;
2199 
2200 	status = myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
2201 	if (status == MYRB_STATUS_SUCCESS) {
2202 		shost_printk(KERN_INFO, shost,
2203 			     "Cache Flush Completed\n");
2204 		return count;
2205 	}
2206 	shost_printk(KERN_INFO, shost,
2207 		     "Cache Flush Failed, status %x\n", status);
2208 	return -EIO;
2209 }
2210 static DEVICE_ATTR_WO(flush_cache);
2211 
2212 static struct device_attribute *myrb_sdev_attrs[] = {
2213 	&dev_attr_rebuild,
2214 	&dev_attr_consistency_check,
2215 	&dev_attr_raid_state,
2216 	&dev_attr_raid_level,
2217 	NULL,
2218 };
2219 
2220 static struct device_attribute *myrb_shost_attrs[] = {
2221 	&dev_attr_ctlr_num,
2222 	&dev_attr_model,
2223 	&dev_attr_firmware,
2224 	&dev_attr_flush_cache,
2225 	NULL,
2226 };
2227 
2228 static struct scsi_host_template myrb_template = {
2229 	.module			= THIS_MODULE,
2230 	.name			= "DAC960",
2231 	.proc_name		= "myrb",
2232 	.queuecommand		= myrb_queuecommand,
2233 	.eh_host_reset_handler	= myrb_host_reset,
2234 	.slave_alloc		= myrb_slave_alloc,
2235 	.slave_configure	= myrb_slave_configure,
2236 	.slave_destroy		= myrb_slave_destroy,
2237 	.bios_param		= myrb_biosparam,
2238 	.cmd_size		= sizeof(struct myrb_cmdblk),
2239 	.shost_attrs		= myrb_shost_attrs,
2240 	.sdev_attrs		= myrb_sdev_attrs,
2241 	.this_id		= -1,
2242 };
2243 
2244 /**
2245  * myrb_is_raid - return boolean indicating device is raid volume
2246  * @dev the device struct object
2247  */
2248 static int myrb_is_raid(struct device *dev)
2249 {
2250 	struct scsi_device *sdev = to_scsi_device(dev);
2251 
2252 	return sdev->channel == myrb_logical_channel(sdev->host);
2253 }
2254 
2255 /**
2256  * myrb_get_resync - get raid volume resync percent complete
2257  * @dev the device struct object
2258  */
2259 static void myrb_get_resync(struct device *dev)
2260 {
2261 	struct scsi_device *sdev = to_scsi_device(dev);
2262 	struct myrb_hba *cb = shost_priv(sdev->host);
2263 	struct myrb_rbld_progress rbld_buf;
2264 	unsigned int percent_complete = 0;
2265 	unsigned short status;
2266 	unsigned int ldev_size = 0, remaining = 0;
2267 
2268 	if (sdev->channel < myrb_logical_channel(sdev->host))
2269 		return;
2270 	status = myrb_get_rbld_progress(cb, &rbld_buf);
2271 	if (status == MYRB_STATUS_SUCCESS) {
2272 		if (rbld_buf.ldev_num == sdev->id) {
2273 			ldev_size = rbld_buf.ldev_size;
2274 			remaining = rbld_buf.blocks_left;
2275 		}
2276 	}
2277 	if (remaining && ldev_size)
2278 		percent_complete = (ldev_size - remaining) * 100 / ldev_size;
2279 	raid_set_resync(myrb_raid_template, dev, percent_complete);
2280 }
2281 
2282 /**
2283  * myrb_get_state - get raid volume status
2284  * @dev the device struct object
2285  */
2286 static void myrb_get_state(struct device *dev)
2287 {
2288 	struct scsi_device *sdev = to_scsi_device(dev);
2289 	struct myrb_hba *cb = shost_priv(sdev->host);
2290 	struct myrb_ldev_info *ldev_info = sdev->hostdata;
2291 	enum raid_state state = RAID_STATE_UNKNOWN;
2292 	unsigned short status;
2293 
2294 	if (sdev->channel < myrb_logical_channel(sdev->host) || !ldev_info)
2295 		state = RAID_STATE_UNKNOWN;
2296 	else {
2297 		status = myrb_get_rbld_progress(cb, NULL);
2298 		if (status == MYRB_STATUS_SUCCESS)
2299 			state = RAID_STATE_RESYNCING;
2300 		else {
2301 			switch (ldev_info->state) {
2302 			case MYRB_DEVICE_ONLINE:
2303 				state = RAID_STATE_ACTIVE;
2304 				break;
2305 			case MYRB_DEVICE_WO:
2306 			case MYRB_DEVICE_CRITICAL:
2307 				state = RAID_STATE_DEGRADED;
2308 				break;
2309 			default:
2310 				state = RAID_STATE_OFFLINE;
2311 			}
2312 		}
2313 	}
2314 	raid_set_state(myrb_raid_template, dev, state);
2315 }
2316 
2317 static struct raid_function_template myrb_raid_functions = {
2318 	.cookie		= &myrb_template,
2319 	.is_raid	= myrb_is_raid,
2320 	.get_resync	= myrb_get_resync,
2321 	.get_state	= myrb_get_state,
2322 };
2323 
2324 static void myrb_handle_scsi(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk,
2325 		struct scsi_cmnd *scmd)
2326 {
2327 	unsigned short status;
2328 
2329 	if (!cmd_blk)
2330 		return;
2331 
2332 	scsi_dma_unmap(scmd);
2333 
2334 	if (cmd_blk->dcdb) {
2335 		memcpy(scmd->sense_buffer, &cmd_blk->dcdb->sense, 64);
2336 		dma_pool_free(cb->dcdb_pool, cmd_blk->dcdb,
2337 			      cmd_blk->dcdb_addr);
2338 		cmd_blk->dcdb = NULL;
2339 	}
2340 	if (cmd_blk->sgl) {
2341 		dma_pool_free(cb->sg_pool, cmd_blk->sgl, cmd_blk->sgl_addr);
2342 		cmd_blk->sgl = NULL;
2343 		cmd_blk->sgl_addr = 0;
2344 	}
2345 	status = cmd_blk->status;
2346 	switch (status) {
2347 	case MYRB_STATUS_SUCCESS:
2348 	case MYRB_STATUS_DEVICE_BUSY:
2349 		scmd->result = (DID_OK << 16) | status;
2350 		break;
2351 	case MYRB_STATUS_BAD_DATA:
2352 		dev_dbg(&scmd->device->sdev_gendev,
2353 			"Bad Data Encountered\n");
2354 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2355 			/* Unrecovered read error */
2356 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2357 						MEDIUM_ERROR, 0x11, 0);
2358 		else
2359 			/* Write error */
2360 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2361 						MEDIUM_ERROR, 0x0C, 0);
2362 		scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
2363 		break;
2364 	case MYRB_STATUS_IRRECOVERABLE_DATA_ERROR:
2365 		scmd_printk(KERN_ERR, scmd, "Irrecoverable Data Error\n");
2366 		if (scmd->sc_data_direction == DMA_FROM_DEVICE)
2367 			/* Unrecovered read error, auto-reallocation failed */
2368 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2369 						MEDIUM_ERROR, 0x11, 0x04);
2370 		else
2371 			/* Write error, auto-reallocation failed */
2372 			scsi_build_sense_buffer(0, scmd->sense_buffer,
2373 						MEDIUM_ERROR, 0x0C, 0x02);
2374 		scmd->result = (DID_OK << 16) | SAM_STAT_CHECK_CONDITION;
2375 		break;
2376 	case MYRB_STATUS_LDRV_NONEXISTENT_OR_OFFLINE:
2377 		dev_dbg(&scmd->device->sdev_gendev,
2378 			    "Logical Drive Nonexistent or Offline");
2379 		scmd->result = (DID_BAD_TARGET << 16);
2380 		break;
2381 	case MYRB_STATUS_ACCESS_BEYOND_END_OF_LDRV:
2382 		dev_dbg(&scmd->device->sdev_gendev,
2383 			    "Attempt to Access Beyond End of Logical Drive");
2384 		/* Logical block address out of range */
2385 		scsi_build_sense_buffer(0, scmd->sense_buffer,
2386 					NOT_READY, 0x21, 0);
2387 		break;
2388 	case MYRB_STATUS_DEVICE_NONRESPONSIVE:
2389 		dev_dbg(&scmd->device->sdev_gendev, "Device nonresponsive\n");
2390 		scmd->result = (DID_BAD_TARGET << 16);
2391 		break;
2392 	default:
2393 		scmd_printk(KERN_ERR, scmd,
2394 			    "Unexpected Error Status %04X", status);
2395 		scmd->result = (DID_ERROR << 16);
2396 		break;
2397 	}
2398 	scmd->scsi_done(scmd);
2399 }
2400 
2401 static void myrb_handle_cmdblk(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
2402 {
2403 	if (!cmd_blk)
2404 		return;
2405 
2406 	if (cmd_blk->completion) {
2407 		complete(cmd_blk->completion);
2408 		cmd_blk->completion = NULL;
2409 	}
2410 }
2411 
2412 static void myrb_monitor(struct work_struct *work)
2413 {
2414 	struct myrb_hba *cb = container_of(work,
2415 			struct myrb_hba, monitor_work.work);
2416 	struct Scsi_Host *shost = cb->host;
2417 	unsigned long interval = MYRB_PRIMARY_MONITOR_INTERVAL;
2418 
2419 	dev_dbg(&shost->shost_gendev, "monitor tick\n");
2420 
2421 	if (cb->new_ev_seq > cb->old_ev_seq) {
2422 		int event = cb->old_ev_seq;
2423 
2424 		dev_dbg(&shost->shost_gendev,
2425 			"get event log no %d/%d\n",
2426 			cb->new_ev_seq, event);
2427 		myrb_get_event(cb, event);
2428 		cb->old_ev_seq = event + 1;
2429 		interval = 10;
2430 	} else if (cb->need_err_info) {
2431 		cb->need_err_info = false;
2432 		dev_dbg(&shost->shost_gendev, "get error table\n");
2433 		myrb_get_errtable(cb);
2434 		interval = 10;
2435 	} else if (cb->need_rbld && cb->rbld_first) {
2436 		cb->need_rbld = false;
2437 		dev_dbg(&shost->shost_gendev,
2438 			"get rebuild progress\n");
2439 		myrb_update_rbld_progress(cb);
2440 		interval = 10;
2441 	} else if (cb->need_ldev_info) {
2442 		cb->need_ldev_info = false;
2443 		dev_dbg(&shost->shost_gendev,
2444 			"get logical drive info\n");
2445 		myrb_get_ldev_info(cb);
2446 		interval = 10;
2447 	} else if (cb->need_rbld) {
2448 		cb->need_rbld = false;
2449 		dev_dbg(&shost->shost_gendev,
2450 			"get rebuild progress\n");
2451 		myrb_update_rbld_progress(cb);
2452 		interval = 10;
2453 	} else if (cb->need_cc_status) {
2454 		cb->need_cc_status = false;
2455 		dev_dbg(&shost->shost_gendev,
2456 			"get consistency check progress\n");
2457 		myrb_get_cc_progress(cb);
2458 		interval = 10;
2459 	} else if (cb->need_bgi_status) {
2460 		cb->need_bgi_status = false;
2461 		dev_dbg(&shost->shost_gendev, "get background init status\n");
2462 		myrb_bgi_control(cb);
2463 		interval = 10;
2464 	} else {
2465 		dev_dbg(&shost->shost_gendev, "new enquiry\n");
2466 		mutex_lock(&cb->dma_mutex);
2467 		myrb_hba_enquiry(cb);
2468 		mutex_unlock(&cb->dma_mutex);
2469 		if ((cb->new_ev_seq - cb->old_ev_seq > 0) ||
2470 		    cb->need_err_info || cb->need_rbld ||
2471 		    cb->need_ldev_info || cb->need_cc_status ||
2472 		    cb->need_bgi_status) {
2473 			dev_dbg(&shost->shost_gendev,
2474 				"reschedule monitor\n");
2475 			interval = 0;
2476 		}
2477 	}
2478 	if (interval > 1)
2479 		cb->primary_monitor_time = jiffies;
2480 	queue_delayed_work(cb->work_q, &cb->monitor_work, interval);
2481 }
2482 
2483 /**
2484  * myrb_err_status - reports controller BIOS messages
2485  *
2486  * Controller BIOS messages are passed through the Error Status Register
2487  * when the driver performs the BIOS handshaking.
2488  *
2489  * Return: true for fatal errors and false otherwise.
2490  */
2491 static bool myrb_err_status(struct myrb_hba *cb, unsigned char error,
2492 		unsigned char parm0, unsigned char parm1)
2493 {
2494 	struct pci_dev *pdev = cb->pdev;
2495 
2496 	switch (error) {
2497 	case 0x00:
2498 		dev_info(&pdev->dev,
2499 			 "Physical Device %d:%d Not Responding\n",
2500 			 parm1, parm0);
2501 		break;
2502 	case 0x08:
2503 		dev_notice(&pdev->dev, "Spinning Up Drives\n");
2504 		break;
2505 	case 0x30:
2506 		dev_notice(&pdev->dev, "Configuration Checksum Error\n");
2507 		break;
2508 	case 0x60:
2509 		dev_notice(&pdev->dev, "Mirror Race Recovery Failed\n");
2510 		break;
2511 	case 0x70:
2512 		dev_notice(&pdev->dev, "Mirror Race Recovery In Progress\n");
2513 		break;
2514 	case 0x90:
2515 		dev_notice(&pdev->dev, "Physical Device %d:%d COD Mismatch\n",
2516 			   parm1, parm0);
2517 		break;
2518 	case 0xA0:
2519 		dev_notice(&pdev->dev, "Logical Drive Installation Aborted\n");
2520 		break;
2521 	case 0xB0:
2522 		dev_notice(&pdev->dev, "Mirror Race On A Critical Logical Drive\n");
2523 		break;
2524 	case 0xD0:
2525 		dev_notice(&pdev->dev, "New Controller Configuration Found\n");
2526 		break;
2527 	case 0xF0:
2528 		dev_err(&pdev->dev, "Fatal Memory Parity Error\n");
2529 		return true;
2530 	default:
2531 		dev_err(&pdev->dev, "Unknown Initialization Error %02X\n",
2532 			error);
2533 		return true;
2534 	}
2535 	return false;
2536 }
2537 
2538 /*
2539  * Hardware-specific functions
2540  */
2541 
2542 /*
2543  * DAC960 LA Series Controllers
2544  */
2545 
2546 static inline void DAC960_LA_hw_mbox_new_cmd(void __iomem *base)
2547 {
2548 	writeb(DAC960_LA_IDB_HWMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2549 }
2550 
2551 static inline void DAC960_LA_ack_hw_mbox_status(void __iomem *base)
2552 {
2553 	writeb(DAC960_LA_IDB_HWMBOX_ACK_STS, base + DAC960_LA_IDB_OFFSET);
2554 }
2555 
2556 static inline void DAC960_LA_gen_intr(void __iomem *base)
2557 {
2558 	writeb(DAC960_LA_IDB_GEN_IRQ, base + DAC960_LA_IDB_OFFSET);
2559 }
2560 
2561 static inline void DAC960_LA_reset_ctrl(void __iomem *base)
2562 {
2563 	writeb(DAC960_LA_IDB_CTRL_RESET, base + DAC960_LA_IDB_OFFSET);
2564 }
2565 
2566 static inline void DAC960_LA_mem_mbox_new_cmd(void __iomem *base)
2567 {
2568 	writeb(DAC960_LA_IDB_MMBOX_NEW_CMD, base + DAC960_LA_IDB_OFFSET);
2569 }
2570 
2571 static inline bool DAC960_LA_hw_mbox_is_full(void __iomem *base)
2572 {
2573 	unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2574 
2575 	return !(idb & DAC960_LA_IDB_HWMBOX_EMPTY);
2576 }
2577 
2578 static inline bool DAC960_LA_init_in_progress(void __iomem *base)
2579 {
2580 	unsigned char idb = readb(base + DAC960_LA_IDB_OFFSET);
2581 
2582 	return !(idb & DAC960_LA_IDB_INIT_DONE);
2583 }
2584 
2585 static inline void DAC960_LA_ack_hw_mbox_intr(void __iomem *base)
2586 {
2587 	writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET);
2588 }
2589 
2590 static inline void DAC960_LA_ack_mem_mbox_intr(void __iomem *base)
2591 {
2592 	writeb(DAC960_LA_ODB_MMBOX_ACK_IRQ, base + DAC960_LA_ODB_OFFSET);
2593 }
2594 
2595 static inline void DAC960_LA_ack_intr(void __iomem *base)
2596 {
2597 	writeb(DAC960_LA_ODB_HWMBOX_ACK_IRQ | DAC960_LA_ODB_MMBOX_ACK_IRQ,
2598 	       base + DAC960_LA_ODB_OFFSET);
2599 }
2600 
2601 static inline bool DAC960_LA_hw_mbox_status_available(void __iomem *base)
2602 {
2603 	unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET);
2604 
2605 	return odb & DAC960_LA_ODB_HWMBOX_STS_AVAIL;
2606 }
2607 
2608 static inline bool DAC960_LA_mem_mbox_status_available(void __iomem *base)
2609 {
2610 	unsigned char odb = readb(base + DAC960_LA_ODB_OFFSET);
2611 
2612 	return odb & DAC960_LA_ODB_MMBOX_STS_AVAIL;
2613 }
2614 
2615 static inline void DAC960_LA_enable_intr(void __iomem *base)
2616 {
2617 	unsigned char odb = 0xFF;
2618 
2619 	odb &= ~DAC960_LA_IRQMASK_DISABLE_IRQ;
2620 	writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2621 }
2622 
2623 static inline void DAC960_LA_disable_intr(void __iomem *base)
2624 {
2625 	unsigned char odb = 0xFF;
2626 
2627 	odb |= DAC960_LA_IRQMASK_DISABLE_IRQ;
2628 	writeb(odb, base + DAC960_LA_IRQMASK_OFFSET);
2629 }
2630 
2631 static inline bool DAC960_LA_intr_enabled(void __iomem *base)
2632 {
2633 	unsigned char imask = readb(base + DAC960_LA_IRQMASK_OFFSET);
2634 
2635 	return !(imask & DAC960_LA_IRQMASK_DISABLE_IRQ);
2636 }
2637 
2638 static inline void DAC960_LA_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2639 		union myrb_cmd_mbox *mbox)
2640 {
2641 	mem_mbox->words[1] = mbox->words[1];
2642 	mem_mbox->words[2] = mbox->words[2];
2643 	mem_mbox->words[3] = mbox->words[3];
2644 	/* Memory barrier to prevent reordering */
2645 	wmb();
2646 	mem_mbox->words[0] = mbox->words[0];
2647 	/* Memory barrier to force PCI access */
2648 	mb();
2649 }
2650 
2651 static inline void DAC960_LA_write_hw_mbox(void __iomem *base,
2652 		union myrb_cmd_mbox *mbox)
2653 {
2654 	writel(mbox->words[0], base + DAC960_LA_CMDOP_OFFSET);
2655 	writel(mbox->words[1], base + DAC960_LA_MBOX4_OFFSET);
2656 	writel(mbox->words[2], base + DAC960_LA_MBOX8_OFFSET);
2657 	writeb(mbox->bytes[12], base + DAC960_LA_MBOX12_OFFSET);
2658 }
2659 
2660 static inline unsigned char DAC960_LA_read_status_cmd_ident(void __iomem *base)
2661 {
2662 	return readb(base + DAC960_LA_STSID_OFFSET);
2663 }
2664 
2665 static inline unsigned short DAC960_LA_read_status(void __iomem *base)
2666 {
2667 	return readw(base + DAC960_LA_STS_OFFSET);
2668 }
2669 
2670 static inline bool
2671 DAC960_LA_read_error_status(void __iomem *base, unsigned char *error,
2672 		unsigned char *param0, unsigned char *param1)
2673 {
2674 	unsigned char errsts = readb(base + DAC960_LA_ERRSTS_OFFSET);
2675 
2676 	if (!(errsts & DAC960_LA_ERRSTS_PENDING))
2677 		return false;
2678 	errsts &= ~DAC960_LA_ERRSTS_PENDING;
2679 
2680 	*error = errsts;
2681 	*param0 = readb(base + DAC960_LA_CMDOP_OFFSET);
2682 	*param1 = readb(base + DAC960_LA_CMDID_OFFSET);
2683 	writeb(0xFF, base + DAC960_LA_ERRSTS_OFFSET);
2684 	return true;
2685 }
2686 
2687 static inline unsigned short
2688 DAC960_LA_mbox_init(struct pci_dev *pdev, void __iomem *base,
2689 		union myrb_cmd_mbox *mbox)
2690 {
2691 	unsigned short status;
2692 	int timeout = 0;
2693 
2694 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2695 		if (!DAC960_LA_hw_mbox_is_full(base))
2696 			break;
2697 		udelay(10);
2698 		timeout++;
2699 	}
2700 	if (DAC960_LA_hw_mbox_is_full(base)) {
2701 		dev_err(&pdev->dev,
2702 			"Timeout waiting for empty mailbox\n");
2703 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2704 	}
2705 	DAC960_LA_write_hw_mbox(base, mbox);
2706 	DAC960_LA_hw_mbox_new_cmd(base);
2707 	timeout = 0;
2708 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2709 		if (DAC960_LA_hw_mbox_status_available(base))
2710 			break;
2711 		udelay(10);
2712 		timeout++;
2713 	}
2714 	if (!DAC960_LA_hw_mbox_status_available(base)) {
2715 		dev_err(&pdev->dev, "Timeout waiting for mailbox status\n");
2716 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2717 	}
2718 	status = DAC960_LA_read_status(base);
2719 	DAC960_LA_ack_hw_mbox_intr(base);
2720 	DAC960_LA_ack_hw_mbox_status(base);
2721 
2722 	return status;
2723 }
2724 
2725 static int DAC960_LA_hw_init(struct pci_dev *pdev,
2726 		struct myrb_hba *cb, void __iomem *base)
2727 {
2728 	int timeout = 0;
2729 	unsigned char error, parm0, parm1;
2730 
2731 	DAC960_LA_disable_intr(base);
2732 	DAC960_LA_ack_hw_mbox_status(base);
2733 	udelay(1000);
2734 	while (DAC960_LA_init_in_progress(base) &&
2735 	       timeout < MYRB_MAILBOX_TIMEOUT) {
2736 		if (DAC960_LA_read_error_status(base, &error,
2737 					      &parm0, &parm1) &&
2738 		    myrb_err_status(cb, error, parm0, parm1))
2739 			return -ENODEV;
2740 		udelay(10);
2741 		timeout++;
2742 	}
2743 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
2744 		dev_err(&pdev->dev,
2745 			"Timeout waiting for Controller Initialisation\n");
2746 		return -ETIMEDOUT;
2747 	}
2748 	if (!myrb_enable_mmio(cb, DAC960_LA_mbox_init)) {
2749 		dev_err(&pdev->dev,
2750 			"Unable to Enable Memory Mailbox Interface\n");
2751 		DAC960_LA_reset_ctrl(base);
2752 		return -ENODEV;
2753 	}
2754 	DAC960_LA_enable_intr(base);
2755 	cb->qcmd = myrb_qcmd;
2756 	cb->write_cmd_mbox = DAC960_LA_write_cmd_mbox;
2757 	if (cb->dual_mode_interface)
2758 		cb->get_cmd_mbox = DAC960_LA_mem_mbox_new_cmd;
2759 	else
2760 		cb->get_cmd_mbox = DAC960_LA_hw_mbox_new_cmd;
2761 	cb->disable_intr = DAC960_LA_disable_intr;
2762 	cb->reset = DAC960_LA_reset_ctrl;
2763 
2764 	return 0;
2765 }
2766 
2767 static irqreturn_t DAC960_LA_intr_handler(int irq, void *arg)
2768 {
2769 	struct myrb_hba *cb = arg;
2770 	void __iomem *base = cb->io_base;
2771 	struct myrb_stat_mbox *next_stat_mbox;
2772 	unsigned long flags;
2773 
2774 	spin_lock_irqsave(&cb->queue_lock, flags);
2775 	DAC960_LA_ack_intr(base);
2776 	next_stat_mbox = cb->next_stat_mbox;
2777 	while (next_stat_mbox->valid) {
2778 		unsigned char id = next_stat_mbox->id;
2779 		struct scsi_cmnd *scmd = NULL;
2780 		struct myrb_cmdblk *cmd_blk = NULL;
2781 
2782 		if (id == MYRB_DCMD_TAG)
2783 			cmd_blk = &cb->dcmd_blk;
2784 		else if (id == MYRB_MCMD_TAG)
2785 			cmd_blk = &cb->mcmd_blk;
2786 		else {
2787 			scmd = scsi_host_find_tag(cb->host, id - 3);
2788 			if (scmd)
2789 				cmd_blk = scsi_cmd_priv(scmd);
2790 		}
2791 		if (cmd_blk)
2792 			cmd_blk->status = next_stat_mbox->status;
2793 		else
2794 			dev_err(&cb->pdev->dev,
2795 				"Unhandled command completion %d\n", id);
2796 
2797 		memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
2798 		if (++next_stat_mbox > cb->last_stat_mbox)
2799 			next_stat_mbox = cb->first_stat_mbox;
2800 
2801 		if (cmd_blk) {
2802 			if (id < 3)
2803 				myrb_handle_cmdblk(cb, cmd_blk);
2804 			else
2805 				myrb_handle_scsi(cb, cmd_blk, scmd);
2806 		}
2807 	}
2808 	cb->next_stat_mbox = next_stat_mbox;
2809 	spin_unlock_irqrestore(&cb->queue_lock, flags);
2810 	return IRQ_HANDLED;
2811 }
2812 
2813 struct myrb_privdata DAC960_LA_privdata = {
2814 	.hw_init =	DAC960_LA_hw_init,
2815 	.irq_handler =	DAC960_LA_intr_handler,
2816 	.mmio_size =	DAC960_LA_mmio_size,
2817 };
2818 
2819 /*
2820  * DAC960 PG Series Controllers
2821  */
2822 static inline void DAC960_PG_hw_mbox_new_cmd(void __iomem *base)
2823 {
2824 	writel(DAC960_PG_IDB_HWMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2825 }
2826 
2827 static inline void DAC960_PG_ack_hw_mbox_status(void __iomem *base)
2828 {
2829 	writel(DAC960_PG_IDB_HWMBOX_ACK_STS, base + DAC960_PG_IDB_OFFSET);
2830 }
2831 
2832 static inline void DAC960_PG_gen_intr(void __iomem *base)
2833 {
2834 	writel(DAC960_PG_IDB_GEN_IRQ, base + DAC960_PG_IDB_OFFSET);
2835 }
2836 
2837 static inline void DAC960_PG_reset_ctrl(void __iomem *base)
2838 {
2839 	writel(DAC960_PG_IDB_CTRL_RESET, base + DAC960_PG_IDB_OFFSET);
2840 }
2841 
2842 static inline void DAC960_PG_mem_mbox_new_cmd(void __iomem *base)
2843 {
2844 	writel(DAC960_PG_IDB_MMBOX_NEW_CMD, base + DAC960_PG_IDB_OFFSET);
2845 }
2846 
2847 static inline bool DAC960_PG_hw_mbox_is_full(void __iomem *base)
2848 {
2849 	unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2850 
2851 	return idb & DAC960_PG_IDB_HWMBOX_FULL;
2852 }
2853 
2854 static inline bool DAC960_PG_init_in_progress(void __iomem *base)
2855 {
2856 	unsigned char idb = readl(base + DAC960_PG_IDB_OFFSET);
2857 
2858 	return idb & DAC960_PG_IDB_INIT_IN_PROGRESS;
2859 }
2860 
2861 static inline void DAC960_PG_ack_hw_mbox_intr(void __iomem *base)
2862 {
2863 	writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET);
2864 }
2865 
2866 static inline void DAC960_PG_ack_mem_mbox_intr(void __iomem *base)
2867 {
2868 	writel(DAC960_PG_ODB_MMBOX_ACK_IRQ, base + DAC960_PG_ODB_OFFSET);
2869 }
2870 
2871 static inline void DAC960_PG_ack_intr(void __iomem *base)
2872 {
2873 	writel(DAC960_PG_ODB_HWMBOX_ACK_IRQ | DAC960_PG_ODB_MMBOX_ACK_IRQ,
2874 	       base + DAC960_PG_ODB_OFFSET);
2875 }
2876 
2877 static inline bool DAC960_PG_hw_mbox_status_available(void __iomem *base)
2878 {
2879 	unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET);
2880 
2881 	return odb & DAC960_PG_ODB_HWMBOX_STS_AVAIL;
2882 }
2883 
2884 static inline bool DAC960_PG_mem_mbox_status_available(void __iomem *base)
2885 {
2886 	unsigned char odb = readl(base + DAC960_PG_ODB_OFFSET);
2887 
2888 	return odb & DAC960_PG_ODB_MMBOX_STS_AVAIL;
2889 }
2890 
2891 static inline void DAC960_PG_enable_intr(void __iomem *base)
2892 {
2893 	unsigned int imask = (unsigned int)-1;
2894 
2895 	imask &= ~DAC960_PG_IRQMASK_DISABLE_IRQ;
2896 	writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2897 }
2898 
2899 static inline void DAC960_PG_disable_intr(void __iomem *base)
2900 {
2901 	unsigned int imask = (unsigned int)-1;
2902 
2903 	writel(imask, base + DAC960_PG_IRQMASK_OFFSET);
2904 }
2905 
2906 static inline bool DAC960_PG_intr_enabled(void __iomem *base)
2907 {
2908 	unsigned int imask = readl(base + DAC960_PG_IRQMASK_OFFSET);
2909 
2910 	return !(imask & DAC960_PG_IRQMASK_DISABLE_IRQ);
2911 }
2912 
2913 static inline void DAC960_PG_write_cmd_mbox(union myrb_cmd_mbox *mem_mbox,
2914 		union myrb_cmd_mbox *mbox)
2915 {
2916 	mem_mbox->words[1] = mbox->words[1];
2917 	mem_mbox->words[2] = mbox->words[2];
2918 	mem_mbox->words[3] = mbox->words[3];
2919 	/* Memory barrier to prevent reordering */
2920 	wmb();
2921 	mem_mbox->words[0] = mbox->words[0];
2922 	/* Memory barrier to force PCI access */
2923 	mb();
2924 }
2925 
2926 static inline void DAC960_PG_write_hw_mbox(void __iomem *base,
2927 		union myrb_cmd_mbox *mbox)
2928 {
2929 	writel(mbox->words[0], base + DAC960_PG_CMDOP_OFFSET);
2930 	writel(mbox->words[1], base + DAC960_PG_MBOX4_OFFSET);
2931 	writel(mbox->words[2], base + DAC960_PG_MBOX8_OFFSET);
2932 	writeb(mbox->bytes[12], base + DAC960_PG_MBOX12_OFFSET);
2933 }
2934 
2935 static inline unsigned char
2936 DAC960_PG_read_status_cmd_ident(void __iomem *base)
2937 {
2938 	return readb(base + DAC960_PG_STSID_OFFSET);
2939 }
2940 
2941 static inline unsigned short
2942 DAC960_PG_read_status(void __iomem *base)
2943 {
2944 	return readw(base + DAC960_PG_STS_OFFSET);
2945 }
2946 
2947 static inline bool
2948 DAC960_PG_read_error_status(void __iomem *base, unsigned char *error,
2949 		unsigned char *param0, unsigned char *param1)
2950 {
2951 	unsigned char errsts = readb(base + DAC960_PG_ERRSTS_OFFSET);
2952 
2953 	if (!(errsts & DAC960_PG_ERRSTS_PENDING))
2954 		return false;
2955 	errsts &= ~DAC960_PG_ERRSTS_PENDING;
2956 	*error = errsts;
2957 	*param0 = readb(base + DAC960_PG_CMDOP_OFFSET);
2958 	*param1 = readb(base + DAC960_PG_CMDID_OFFSET);
2959 	writeb(0, base + DAC960_PG_ERRSTS_OFFSET);
2960 	return true;
2961 }
2962 
2963 static inline unsigned short
2964 DAC960_PG_mbox_init(struct pci_dev *pdev, void __iomem *base,
2965 		union myrb_cmd_mbox *mbox)
2966 {
2967 	unsigned short status;
2968 	int timeout = 0;
2969 
2970 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2971 		if (!DAC960_PG_hw_mbox_is_full(base))
2972 			break;
2973 		udelay(10);
2974 		timeout++;
2975 	}
2976 	if (DAC960_PG_hw_mbox_is_full(base)) {
2977 		dev_err(&pdev->dev,
2978 			"Timeout waiting for empty mailbox\n");
2979 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2980 	}
2981 	DAC960_PG_write_hw_mbox(base, mbox);
2982 	DAC960_PG_hw_mbox_new_cmd(base);
2983 
2984 	timeout = 0;
2985 	while (timeout < MYRB_MAILBOX_TIMEOUT) {
2986 		if (DAC960_PG_hw_mbox_status_available(base))
2987 			break;
2988 		udelay(10);
2989 		timeout++;
2990 	}
2991 	if (!DAC960_PG_hw_mbox_status_available(base)) {
2992 		dev_err(&pdev->dev,
2993 			"Timeout waiting for mailbox status\n");
2994 		return MYRB_STATUS_SUBSYS_TIMEOUT;
2995 	}
2996 	status = DAC960_PG_read_status(base);
2997 	DAC960_PG_ack_hw_mbox_intr(base);
2998 	DAC960_PG_ack_hw_mbox_status(base);
2999 
3000 	return status;
3001 }
3002 
3003 static int DAC960_PG_hw_init(struct pci_dev *pdev,
3004 		struct myrb_hba *cb, void __iomem *base)
3005 {
3006 	int timeout = 0;
3007 	unsigned char error, parm0, parm1;
3008 
3009 	DAC960_PG_disable_intr(base);
3010 	DAC960_PG_ack_hw_mbox_status(base);
3011 	udelay(1000);
3012 	while (DAC960_PG_init_in_progress(base) &&
3013 	       timeout < MYRB_MAILBOX_TIMEOUT) {
3014 		if (DAC960_PG_read_error_status(base, &error,
3015 						&parm0, &parm1) &&
3016 		    myrb_err_status(cb, error, parm0, parm1))
3017 			return -EIO;
3018 		udelay(10);
3019 		timeout++;
3020 	}
3021 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
3022 		dev_err(&pdev->dev,
3023 			"Timeout waiting for Controller Initialisation\n");
3024 		return -ETIMEDOUT;
3025 	}
3026 	if (!myrb_enable_mmio(cb, DAC960_PG_mbox_init)) {
3027 		dev_err(&pdev->dev,
3028 			"Unable to Enable Memory Mailbox Interface\n");
3029 		DAC960_PG_reset_ctrl(base);
3030 		return -ENODEV;
3031 	}
3032 	DAC960_PG_enable_intr(base);
3033 	cb->qcmd = myrb_qcmd;
3034 	cb->write_cmd_mbox = DAC960_PG_write_cmd_mbox;
3035 	if (cb->dual_mode_interface)
3036 		cb->get_cmd_mbox = DAC960_PG_mem_mbox_new_cmd;
3037 	else
3038 		cb->get_cmd_mbox = DAC960_PG_hw_mbox_new_cmd;
3039 	cb->disable_intr = DAC960_PG_disable_intr;
3040 	cb->reset = DAC960_PG_reset_ctrl;
3041 
3042 	return 0;
3043 }
3044 
3045 static irqreturn_t DAC960_PG_intr_handler(int irq, void *arg)
3046 {
3047 	struct myrb_hba *cb = arg;
3048 	void __iomem *base = cb->io_base;
3049 	struct myrb_stat_mbox *next_stat_mbox;
3050 	unsigned long flags;
3051 
3052 	spin_lock_irqsave(&cb->queue_lock, flags);
3053 	DAC960_PG_ack_intr(base);
3054 	next_stat_mbox = cb->next_stat_mbox;
3055 	while (next_stat_mbox->valid) {
3056 		unsigned char id = next_stat_mbox->id;
3057 		struct scsi_cmnd *scmd = NULL;
3058 		struct myrb_cmdblk *cmd_blk = NULL;
3059 
3060 		if (id == MYRB_DCMD_TAG)
3061 			cmd_blk = &cb->dcmd_blk;
3062 		else if (id == MYRB_MCMD_TAG)
3063 			cmd_blk = &cb->mcmd_blk;
3064 		else {
3065 			scmd = scsi_host_find_tag(cb->host, id - 3);
3066 			if (scmd)
3067 				cmd_blk = scsi_cmd_priv(scmd);
3068 		}
3069 		if (cmd_blk)
3070 			cmd_blk->status = next_stat_mbox->status;
3071 		else
3072 			dev_err(&cb->pdev->dev,
3073 				"Unhandled command completion %d\n", id);
3074 
3075 		memset(next_stat_mbox, 0, sizeof(struct myrb_stat_mbox));
3076 		if (++next_stat_mbox > cb->last_stat_mbox)
3077 			next_stat_mbox = cb->first_stat_mbox;
3078 
3079 		if (id < 3)
3080 			myrb_handle_cmdblk(cb, cmd_blk);
3081 		else
3082 			myrb_handle_scsi(cb, cmd_blk, scmd);
3083 	}
3084 	cb->next_stat_mbox = next_stat_mbox;
3085 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3086 	return IRQ_HANDLED;
3087 }
3088 
3089 struct myrb_privdata DAC960_PG_privdata = {
3090 	.hw_init =	DAC960_PG_hw_init,
3091 	.irq_handler =	DAC960_PG_intr_handler,
3092 	.mmio_size =	DAC960_PG_mmio_size,
3093 };
3094 
3095 
3096 /*
3097  * DAC960 PD Series Controllers
3098  */
3099 
3100 static inline void DAC960_PD_hw_mbox_new_cmd(void __iomem *base)
3101 {
3102 	writeb(DAC960_PD_IDB_HWMBOX_NEW_CMD, base + DAC960_PD_IDB_OFFSET);
3103 }
3104 
3105 static inline void DAC960_PD_ack_hw_mbox_status(void __iomem *base)
3106 {
3107 	writeb(DAC960_PD_IDB_HWMBOX_ACK_STS, base + DAC960_PD_IDB_OFFSET);
3108 }
3109 
3110 static inline void DAC960_PD_gen_intr(void __iomem *base)
3111 {
3112 	writeb(DAC960_PD_IDB_GEN_IRQ, base + DAC960_PD_IDB_OFFSET);
3113 }
3114 
3115 static inline void DAC960_PD_reset_ctrl(void __iomem *base)
3116 {
3117 	writeb(DAC960_PD_IDB_CTRL_RESET, base + DAC960_PD_IDB_OFFSET);
3118 }
3119 
3120 static inline bool DAC960_PD_hw_mbox_is_full(void __iomem *base)
3121 {
3122 	unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3123 
3124 	return idb & DAC960_PD_IDB_HWMBOX_FULL;
3125 }
3126 
3127 static inline bool DAC960_PD_init_in_progress(void __iomem *base)
3128 {
3129 	unsigned char idb = readb(base + DAC960_PD_IDB_OFFSET);
3130 
3131 	return idb & DAC960_PD_IDB_INIT_IN_PROGRESS;
3132 }
3133 
3134 static inline void DAC960_PD_ack_intr(void __iomem *base)
3135 {
3136 	writeb(DAC960_PD_ODB_HWMBOX_ACK_IRQ, base + DAC960_PD_ODB_OFFSET);
3137 }
3138 
3139 static inline bool DAC960_PD_hw_mbox_status_available(void __iomem *base)
3140 {
3141 	unsigned char odb = readb(base + DAC960_PD_ODB_OFFSET);
3142 
3143 	return odb & DAC960_PD_ODB_HWMBOX_STS_AVAIL;
3144 }
3145 
3146 static inline void DAC960_PD_enable_intr(void __iomem *base)
3147 {
3148 	writeb(DAC960_PD_IRQMASK_ENABLE_IRQ, base + DAC960_PD_IRQEN_OFFSET);
3149 }
3150 
3151 static inline void DAC960_PD_disable_intr(void __iomem *base)
3152 {
3153 	writeb(0, base + DAC960_PD_IRQEN_OFFSET);
3154 }
3155 
3156 static inline bool DAC960_PD_intr_enabled(void __iomem *base)
3157 {
3158 	unsigned char imask = readb(base + DAC960_PD_IRQEN_OFFSET);
3159 
3160 	return imask & DAC960_PD_IRQMASK_ENABLE_IRQ;
3161 }
3162 
3163 static inline void DAC960_PD_write_cmd_mbox(void __iomem *base,
3164 		union myrb_cmd_mbox *mbox)
3165 {
3166 	writel(mbox->words[0], base + DAC960_PD_CMDOP_OFFSET);
3167 	writel(mbox->words[1], base + DAC960_PD_MBOX4_OFFSET);
3168 	writel(mbox->words[2], base + DAC960_PD_MBOX8_OFFSET);
3169 	writeb(mbox->bytes[12], base + DAC960_PD_MBOX12_OFFSET);
3170 }
3171 
3172 static inline unsigned char
3173 DAC960_PD_read_status_cmd_ident(void __iomem *base)
3174 {
3175 	return readb(base + DAC960_PD_STSID_OFFSET);
3176 }
3177 
3178 static inline unsigned short
3179 DAC960_PD_read_status(void __iomem *base)
3180 {
3181 	return readw(base + DAC960_PD_STS_OFFSET);
3182 }
3183 
3184 static inline bool
3185 DAC960_PD_read_error_status(void __iomem *base, unsigned char *error,
3186 		unsigned char *param0, unsigned char *param1)
3187 {
3188 	unsigned char errsts = readb(base + DAC960_PD_ERRSTS_OFFSET);
3189 
3190 	if (!(errsts & DAC960_PD_ERRSTS_PENDING))
3191 		return false;
3192 	errsts &= ~DAC960_PD_ERRSTS_PENDING;
3193 	*error = errsts;
3194 	*param0 = readb(base + DAC960_PD_CMDOP_OFFSET);
3195 	*param1 = readb(base + DAC960_PD_CMDID_OFFSET);
3196 	writeb(0, base + DAC960_PD_ERRSTS_OFFSET);
3197 	return true;
3198 }
3199 
3200 static void DAC960_PD_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3201 {
3202 	void __iomem *base = cb->io_base;
3203 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3204 
3205 	while (DAC960_PD_hw_mbox_is_full(base))
3206 		udelay(1);
3207 	DAC960_PD_write_cmd_mbox(base, mbox);
3208 	DAC960_PD_hw_mbox_new_cmd(base);
3209 }
3210 
3211 static int DAC960_PD_hw_init(struct pci_dev *pdev,
3212 		struct myrb_hba *cb, void __iomem *base)
3213 {
3214 	int timeout = 0;
3215 	unsigned char error, parm0, parm1;
3216 
3217 	if (!request_region(cb->io_addr, 0x80, "myrb")) {
3218 		dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3219 			(unsigned long)cb->io_addr);
3220 		return -EBUSY;
3221 	}
3222 	DAC960_PD_disable_intr(base);
3223 	DAC960_PD_ack_hw_mbox_status(base);
3224 	udelay(1000);
3225 	while (DAC960_PD_init_in_progress(base) &&
3226 	       timeout < MYRB_MAILBOX_TIMEOUT) {
3227 		if (DAC960_PD_read_error_status(base, &error,
3228 					      &parm0, &parm1) &&
3229 		    myrb_err_status(cb, error, parm0, parm1))
3230 			return -EIO;
3231 		udelay(10);
3232 		timeout++;
3233 	}
3234 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
3235 		dev_err(&pdev->dev,
3236 			"Timeout waiting for Controller Initialisation\n");
3237 		return -ETIMEDOUT;
3238 	}
3239 	if (!myrb_enable_mmio(cb, NULL)) {
3240 		dev_err(&pdev->dev,
3241 			"Unable to Enable Memory Mailbox Interface\n");
3242 		DAC960_PD_reset_ctrl(base);
3243 		return -ENODEV;
3244 	}
3245 	DAC960_PD_enable_intr(base);
3246 	cb->qcmd = DAC960_PD_qcmd;
3247 	cb->disable_intr = DAC960_PD_disable_intr;
3248 	cb->reset = DAC960_PD_reset_ctrl;
3249 
3250 	return 0;
3251 }
3252 
3253 static irqreturn_t DAC960_PD_intr_handler(int irq, void *arg)
3254 {
3255 	struct myrb_hba *cb = arg;
3256 	void __iomem *base = cb->io_base;
3257 	unsigned long flags;
3258 
3259 	spin_lock_irqsave(&cb->queue_lock, flags);
3260 	while (DAC960_PD_hw_mbox_status_available(base)) {
3261 		unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3262 		struct scsi_cmnd *scmd = NULL;
3263 		struct myrb_cmdblk *cmd_blk = NULL;
3264 
3265 		if (id == MYRB_DCMD_TAG)
3266 			cmd_blk = &cb->dcmd_blk;
3267 		else if (id == MYRB_MCMD_TAG)
3268 			cmd_blk = &cb->mcmd_blk;
3269 		else {
3270 			scmd = scsi_host_find_tag(cb->host, id - 3);
3271 			if (scmd)
3272 				cmd_blk = scsi_cmd_priv(scmd);
3273 		}
3274 		if (cmd_blk)
3275 			cmd_blk->status = DAC960_PD_read_status(base);
3276 		else
3277 			dev_err(&cb->pdev->dev,
3278 				"Unhandled command completion %d\n", id);
3279 
3280 		DAC960_PD_ack_intr(base);
3281 		DAC960_PD_ack_hw_mbox_status(base);
3282 
3283 		if (id < 3)
3284 			myrb_handle_cmdblk(cb, cmd_blk);
3285 		else
3286 			myrb_handle_scsi(cb, cmd_blk, scmd);
3287 	}
3288 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3289 	return IRQ_HANDLED;
3290 }
3291 
3292 struct myrb_privdata DAC960_PD_privdata = {
3293 	.hw_init =	DAC960_PD_hw_init,
3294 	.irq_handler =	DAC960_PD_intr_handler,
3295 	.mmio_size =	DAC960_PD_mmio_size,
3296 };
3297 
3298 
3299 /*
3300  * DAC960 P Series Controllers
3301  *
3302  * Similar to the DAC960 PD Series Controllers, but some commands have
3303  * to be translated.
3304  */
3305 
3306 static inline void myrb_translate_enquiry(void *enq)
3307 {
3308 	memcpy(enq + 132, enq + 36, 64);
3309 	memset(enq + 36, 0, 96);
3310 }
3311 
3312 static inline void myrb_translate_devstate(void *state)
3313 {
3314 	memcpy(state + 2, state + 3, 1);
3315 	memmove(state + 4, state + 5, 2);
3316 	memmove(state + 6, state + 8, 4);
3317 }
3318 
3319 static inline void myrb_translate_to_rw_command(struct myrb_cmdblk *cmd_blk)
3320 {
3321 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3322 	int ldev_num = mbox->type5.ld.ldev_num;
3323 
3324 	mbox->bytes[3] &= 0x7;
3325 	mbox->bytes[3] |= mbox->bytes[7] << 6;
3326 	mbox->bytes[7] = ldev_num;
3327 }
3328 
3329 static inline void myrb_translate_from_rw_command(struct myrb_cmdblk *cmd_blk)
3330 {
3331 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3332 	int ldev_num = mbox->bytes[7];
3333 
3334 	mbox->bytes[7] = mbox->bytes[3] >> 6;
3335 	mbox->bytes[3] &= 0x7;
3336 	mbox->bytes[3] |= ldev_num << 3;
3337 }
3338 
3339 static void DAC960_P_qcmd(struct myrb_hba *cb, struct myrb_cmdblk *cmd_blk)
3340 {
3341 	void __iomem *base = cb->io_base;
3342 	union myrb_cmd_mbox *mbox = &cmd_blk->mbox;
3343 
3344 	switch (mbox->common.opcode) {
3345 	case MYRB_CMD_ENQUIRY:
3346 		mbox->common.opcode = MYRB_CMD_ENQUIRY_OLD;
3347 		break;
3348 	case MYRB_CMD_GET_DEVICE_STATE:
3349 		mbox->common.opcode = MYRB_CMD_GET_DEVICE_STATE_OLD;
3350 		break;
3351 	case MYRB_CMD_READ:
3352 		mbox->common.opcode = MYRB_CMD_READ_OLD;
3353 		myrb_translate_to_rw_command(cmd_blk);
3354 		break;
3355 	case MYRB_CMD_WRITE:
3356 		mbox->common.opcode = MYRB_CMD_WRITE_OLD;
3357 		myrb_translate_to_rw_command(cmd_blk);
3358 		break;
3359 	case MYRB_CMD_READ_SG:
3360 		mbox->common.opcode = MYRB_CMD_READ_SG_OLD;
3361 		myrb_translate_to_rw_command(cmd_blk);
3362 		break;
3363 	case MYRB_CMD_WRITE_SG:
3364 		mbox->common.opcode = MYRB_CMD_WRITE_SG_OLD;
3365 		myrb_translate_to_rw_command(cmd_blk);
3366 		break;
3367 	default:
3368 		break;
3369 	}
3370 	while (DAC960_PD_hw_mbox_is_full(base))
3371 		udelay(1);
3372 	DAC960_PD_write_cmd_mbox(base, mbox);
3373 	DAC960_PD_hw_mbox_new_cmd(base);
3374 }
3375 
3376 
3377 static int DAC960_P_hw_init(struct pci_dev *pdev,
3378 		struct myrb_hba *cb, void __iomem *base)
3379 {
3380 	int timeout = 0;
3381 	unsigned char error, parm0, parm1;
3382 
3383 	if (!request_region(cb->io_addr, 0x80, "myrb")) {
3384 		dev_err(&pdev->dev, "IO port 0x%lx busy\n",
3385 			(unsigned long)cb->io_addr);
3386 		return -EBUSY;
3387 	}
3388 	DAC960_PD_disable_intr(base);
3389 	DAC960_PD_ack_hw_mbox_status(base);
3390 	udelay(1000);
3391 	while (DAC960_PD_init_in_progress(base) &&
3392 	       timeout < MYRB_MAILBOX_TIMEOUT) {
3393 		if (DAC960_PD_read_error_status(base, &error,
3394 						&parm0, &parm1) &&
3395 		    myrb_err_status(cb, error, parm0, parm1))
3396 			return -EAGAIN;
3397 		udelay(10);
3398 		timeout++;
3399 	}
3400 	if (timeout == MYRB_MAILBOX_TIMEOUT) {
3401 		dev_err(&pdev->dev,
3402 			"Timeout waiting for Controller Initialisation\n");
3403 		return -ETIMEDOUT;
3404 	}
3405 	if (!myrb_enable_mmio(cb, NULL)) {
3406 		dev_err(&pdev->dev,
3407 			"Unable to allocate DMA mapped memory\n");
3408 		DAC960_PD_reset_ctrl(base);
3409 		return -ETIMEDOUT;
3410 	}
3411 	DAC960_PD_enable_intr(base);
3412 	cb->qcmd = DAC960_P_qcmd;
3413 	cb->disable_intr = DAC960_PD_disable_intr;
3414 	cb->reset = DAC960_PD_reset_ctrl;
3415 
3416 	return 0;
3417 }
3418 
3419 static irqreturn_t DAC960_P_intr_handler(int irq, void *arg)
3420 {
3421 	struct myrb_hba *cb = arg;
3422 	void __iomem *base = cb->io_base;
3423 	unsigned long flags;
3424 
3425 	spin_lock_irqsave(&cb->queue_lock, flags);
3426 	while (DAC960_PD_hw_mbox_status_available(base)) {
3427 		unsigned char id = DAC960_PD_read_status_cmd_ident(base);
3428 		struct scsi_cmnd *scmd = NULL;
3429 		struct myrb_cmdblk *cmd_blk = NULL;
3430 		union myrb_cmd_mbox *mbox;
3431 		enum myrb_cmd_opcode op;
3432 
3433 
3434 		if (id == MYRB_DCMD_TAG)
3435 			cmd_blk = &cb->dcmd_blk;
3436 		else if (id == MYRB_MCMD_TAG)
3437 			cmd_blk = &cb->mcmd_blk;
3438 		else {
3439 			scmd = scsi_host_find_tag(cb->host, id - 3);
3440 			if (scmd)
3441 				cmd_blk = scsi_cmd_priv(scmd);
3442 		}
3443 		if (cmd_blk)
3444 			cmd_blk->status = DAC960_PD_read_status(base);
3445 		else
3446 			dev_err(&cb->pdev->dev,
3447 				"Unhandled command completion %d\n", id);
3448 
3449 		DAC960_PD_ack_intr(base);
3450 		DAC960_PD_ack_hw_mbox_status(base);
3451 
3452 		if (!cmd_blk)
3453 			continue;
3454 
3455 		mbox = &cmd_blk->mbox;
3456 		op = mbox->common.opcode;
3457 		switch (op) {
3458 		case MYRB_CMD_ENQUIRY_OLD:
3459 			mbox->common.opcode = MYRB_CMD_ENQUIRY;
3460 			myrb_translate_enquiry(cb->enquiry);
3461 			break;
3462 		case MYRB_CMD_READ_OLD:
3463 			mbox->common.opcode = MYRB_CMD_READ;
3464 			myrb_translate_from_rw_command(cmd_blk);
3465 			break;
3466 		case MYRB_CMD_WRITE_OLD:
3467 			mbox->common.opcode = MYRB_CMD_WRITE;
3468 			myrb_translate_from_rw_command(cmd_blk);
3469 			break;
3470 		case MYRB_CMD_READ_SG_OLD:
3471 			mbox->common.opcode = MYRB_CMD_READ_SG;
3472 			myrb_translate_from_rw_command(cmd_blk);
3473 			break;
3474 		case MYRB_CMD_WRITE_SG_OLD:
3475 			mbox->common.opcode = MYRB_CMD_WRITE_SG;
3476 			myrb_translate_from_rw_command(cmd_blk);
3477 			break;
3478 		default:
3479 			break;
3480 		}
3481 		if (id < 3)
3482 			myrb_handle_cmdblk(cb, cmd_blk);
3483 		else
3484 			myrb_handle_scsi(cb, cmd_blk, scmd);
3485 	}
3486 	spin_unlock_irqrestore(&cb->queue_lock, flags);
3487 	return IRQ_HANDLED;
3488 }
3489 
3490 struct myrb_privdata DAC960_P_privdata = {
3491 	.hw_init =	DAC960_P_hw_init,
3492 	.irq_handler =	DAC960_P_intr_handler,
3493 	.mmio_size =	DAC960_PD_mmio_size,
3494 };
3495 
3496 static struct myrb_hba *myrb_detect(struct pci_dev *pdev,
3497 		const struct pci_device_id *entry)
3498 {
3499 	struct myrb_privdata *privdata =
3500 		(struct myrb_privdata *)entry->driver_data;
3501 	irq_handler_t irq_handler = privdata->irq_handler;
3502 	unsigned int mmio_size = privdata->mmio_size;
3503 	struct Scsi_Host *shost;
3504 	struct myrb_hba *cb = NULL;
3505 
3506 	shost = scsi_host_alloc(&myrb_template, sizeof(struct myrb_hba));
3507 	if (!shost) {
3508 		dev_err(&pdev->dev, "Unable to allocate Controller\n");
3509 		return NULL;
3510 	}
3511 	shost->max_cmd_len = 12;
3512 	shost->max_lun = 256;
3513 	cb = shost_priv(shost);
3514 	mutex_init(&cb->dcmd_mutex);
3515 	mutex_init(&cb->dma_mutex);
3516 	cb->pdev = pdev;
3517 
3518 	if (pci_enable_device(pdev))
3519 		goto failure;
3520 
3521 	if (privdata->hw_init == DAC960_PD_hw_init ||
3522 	    privdata->hw_init == DAC960_P_hw_init) {
3523 		cb->io_addr = pci_resource_start(pdev, 0);
3524 		cb->pci_addr = pci_resource_start(pdev, 1);
3525 	} else
3526 		cb->pci_addr = pci_resource_start(pdev, 0);
3527 
3528 	pci_set_drvdata(pdev, cb);
3529 	spin_lock_init(&cb->queue_lock);
3530 	if (mmio_size < PAGE_SIZE)
3531 		mmio_size = PAGE_SIZE;
3532 	cb->mmio_base = ioremap(cb->pci_addr & PAGE_MASK, mmio_size);
3533 	if (cb->mmio_base == NULL) {
3534 		dev_err(&pdev->dev,
3535 			"Unable to map Controller Register Window\n");
3536 		goto failure;
3537 	}
3538 
3539 	cb->io_base = cb->mmio_base + (cb->pci_addr & ~PAGE_MASK);
3540 	if (privdata->hw_init(pdev, cb, cb->io_base))
3541 		goto failure;
3542 
3543 	if (request_irq(pdev->irq, irq_handler, IRQF_SHARED, "myrb", cb) < 0) {
3544 		dev_err(&pdev->dev,
3545 			"Unable to acquire IRQ Channel %d\n", pdev->irq);
3546 		goto failure;
3547 	}
3548 	cb->irq = pdev->irq;
3549 	return cb;
3550 
3551 failure:
3552 	dev_err(&pdev->dev,
3553 		"Failed to initialize Controller\n");
3554 	myrb_cleanup(cb);
3555 	return NULL;
3556 }
3557 
3558 static int myrb_probe(struct pci_dev *dev, const struct pci_device_id *entry)
3559 {
3560 	struct myrb_hba *cb;
3561 	int ret;
3562 
3563 	cb = myrb_detect(dev, entry);
3564 	if (!cb)
3565 		return -ENODEV;
3566 
3567 	ret = myrb_get_hba_config(cb);
3568 	if (ret < 0) {
3569 		myrb_cleanup(cb);
3570 		return ret;
3571 	}
3572 
3573 	if (!myrb_create_mempools(dev, cb)) {
3574 		ret = -ENOMEM;
3575 		goto failed;
3576 	}
3577 
3578 	ret = scsi_add_host(cb->host, &dev->dev);
3579 	if (ret) {
3580 		dev_err(&dev->dev, "scsi_add_host failed with %d\n", ret);
3581 		myrb_destroy_mempools(cb);
3582 		goto failed;
3583 	}
3584 	scsi_scan_host(cb->host);
3585 	return 0;
3586 failed:
3587 	myrb_cleanup(cb);
3588 	return ret;
3589 }
3590 
3591 
3592 static void myrb_remove(struct pci_dev *pdev)
3593 {
3594 	struct myrb_hba *cb = pci_get_drvdata(pdev);
3595 
3596 	shost_printk(KERN_NOTICE, cb->host, "Flushing Cache...");
3597 	myrb_exec_type3(cb, MYRB_CMD_FLUSH, 0);
3598 	myrb_cleanup(cb);
3599 	myrb_destroy_mempools(cb);
3600 }
3601 
3602 
3603 static const struct pci_device_id myrb_id_table[] = {
3604 	{
3605 		PCI_DEVICE_SUB(PCI_VENDOR_ID_DEC,
3606 			       PCI_DEVICE_ID_DEC_21285,
3607 			       PCI_VENDOR_ID_MYLEX,
3608 			       PCI_DEVICE_ID_MYLEX_DAC960_LA),
3609 		.driver_data	= (unsigned long) &DAC960_LA_privdata,
3610 	},
3611 	{
3612 		PCI_DEVICE_DATA(MYLEX, DAC960_PG, &DAC960_PG_privdata),
3613 	},
3614 	{
3615 		PCI_DEVICE_DATA(MYLEX, DAC960_PD, &DAC960_PD_privdata),
3616 	},
3617 	{
3618 		PCI_DEVICE_DATA(MYLEX, DAC960_P, &DAC960_P_privdata),
3619 	},
3620 	{0, },
3621 };
3622 
3623 MODULE_DEVICE_TABLE(pci, myrb_id_table);
3624 
3625 static struct pci_driver myrb_pci_driver = {
3626 	.name		= "myrb",
3627 	.id_table	= myrb_id_table,
3628 	.probe		= myrb_probe,
3629 	.remove		= myrb_remove,
3630 };
3631 
3632 static int __init myrb_init_module(void)
3633 {
3634 	int ret;
3635 
3636 	myrb_raid_template = raid_class_attach(&myrb_raid_functions);
3637 	if (!myrb_raid_template)
3638 		return -ENODEV;
3639 
3640 	ret = pci_register_driver(&myrb_pci_driver);
3641 	if (ret)
3642 		raid_class_release(myrb_raid_template);
3643 
3644 	return ret;
3645 }
3646 
3647 static void __exit myrb_cleanup_module(void)
3648 {
3649 	pci_unregister_driver(&myrb_pci_driver);
3650 	raid_class_release(myrb_raid_template);
3651 }
3652 
3653 module_init(myrb_init_module);
3654 module_exit(myrb_cleanup_module);
3655 
3656 MODULE_DESCRIPTION("Mylex DAC960/AcceleRAID/eXtremeRAID driver (Block interface)");
3657 MODULE_AUTHOR("Hannes Reinecke <hare@suse.com>");
3658 MODULE_LICENSE("GPL");
3659