Lines Matching +full:emc +full:- +full:mode +full:- +full:4
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Target driver for EMC CLARiiON AX/CX-series hardware.
4 * Based on code from Lars Marowsky-Bree <lmb@suse.de>
5 * and Ed Goggin <egoggin@emc.com>.
17 #define CLARIION_NAME "emc"
23 #define CLARIION_UNBOUND_LU -1
32 #define CLARIION_LUN_UNINITIALIZED -1
40 0x09, /* Page length - 2 */
49 0x02, /* Page length - 2 */
65 * Use short trespass command (FC-series) or the long version
70 * initiating a switch-over.
86 * which SP (A=0,B=1,UNBOUND=-1) is the default SP for this
91 * which SP (A=0,B=1,UNBOUND=-1) is the active SP for this
107 "command.\n", CLARIION_NAME, sshdr->sense_key, in trespass_endio()
108 sshdr->asc, sshdr->ascq); in trespass_endio()
110 if (sshdr->sense_key == 0x05 && sshdr->asc == 0x04 && in trespass_endio()
111 sshdr->ascq == 0x00) { in trespass_endio()
113 * Array based copy in progress -- do not send in trespass_endio()
114 * mode_select or copy will be aborted mid-stream. in trespass_endio()
120 } else if (sshdr->sense_key == 0x02 && sshdr->asc == 0x04 && in trespass_endio()
121 sshdr->ascq == 0x03) { in trespass_endio()
123 * LUN Not Ready - Manual Intervention Required in trespass_endio()
124 * indicates in-progress ucode upgrade (NDU). in trespass_endio()
126 sdev_printk(KERN_INFO, sdev, "%s: Detected in-progress " in trespass_endio()
140 /* check for in-progress ucode upgrade (NDU) */ in parse_sp_info_reply()
141 if (csdev->buffer[48] != 0) { in parse_sp_info_reply()
142 sdev_printk(KERN_NOTICE, sdev, "%s: Detected in-progress " in parse_sp_info_reply()
148 if (csdev->buffer[4] > 2) { in parse_sp_info_reply()
156 switch (csdev->buffer[28] & 0x0f) { in parse_sp_info_reply()
159 "%s: ALUA failover mode detected\n", in parse_sp_info_reply()
162 case 4: in parse_sp_info_reply()
167 "%s: Invalid failover mode %d\n", in parse_sp_info_reply()
168 CLARIION_NAME, csdev->buffer[28] & 0x0f); in parse_sp_info_reply()
173 csdev->default_sp = csdev->buffer[5]; in parse_sp_info_reply()
174 csdev->lun_state = csdev->buffer[4]; in parse_sp_info_reply()
175 csdev->current_sp = csdev->buffer[8]; in parse_sp_info_reply()
176 csdev->port = csdev->buffer[7]; in parse_sp_info_reply()
177 if (csdev->lun_state == CLARIION_LUN_OWNED) in parse_sp_info_reply()
178 sdev->access_state = SCSI_ACCESS_STATE_OPTIMAL; in parse_sp_info_reply()
180 sdev->access_state = SCSI_ACCESS_STATE_STANDBY; in parse_sp_info_reply()
181 if (csdev->default_sp == csdev->current_sp) in parse_sp_info_reply()
182 sdev->access_state |= SCSI_ACCESS_STATE_PREFERRED; in parse_sp_info_reply()
191 unsigned char len = buffer[4] + 5; in parse_sp_model()
226 while (sp_len > 1 && sp_model[sp_len - 1] == ' ') in parse_sp_model()
227 sp_len--; in parse_sp_model()
245 if (csdev->flags & CLARIION_SHORT_TRESPASS) { in send_trespass_cmd()
247 if (!(csdev->flags & CLARIION_HONOR_RESERVATIONS)) in send_trespass_cmd()
253 cdb[4] = len; in send_trespass_cmd()
256 if (!(csdev->flags & CLARIION_HONOR_RESERVATIONS)) in send_trespass_cmd()
264 memcpy(csdev->buffer, page22, len); in send_trespass_cmd()
266 err = scsi_execute(sdev, cdb, DMA_TO_DEVICE, csdev->buffer, len, NULL, in send_trespass_cmd()
274 "%s: failed to send MODE SELECT: %x\n", in send_trespass_cmd()
286 switch (sense_hdr->sense_key) { in clariion_check_sense()
288 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x03) in clariion_check_sense()
290 * LUN Not Ready - Manual Intervention Required in clariion_check_sense()
305 if (sense_hdr->asc == 0x25 && sense_hdr->ascq == 0x01) in clariion_check_sense()
319 if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) in clariion_check_sense()
334 struct clariion_dh_data *h = sdev->handler_data; in clariion_prep_fn()
336 if (h->lun_state != CLARIION_LUN_OWNED) { in clariion_prep_fn()
337 req->rq_flags |= RQF_QUIET; in clariion_prep_fn()
350 sp_model = parse_sp_model(sdev, sdev->inquiry); in clariion_std_inquiry()
360 csdev->flags |= CLARIION_SHORT_TRESPASS; in clariion_std_inquiry()
364 CLARIION_NAME, sp_model, csdev->flags); in clariion_std_inquiry()
374 if (!scsi_get_vpd_page(sdev, 0xC0, csdev->buffer, in clariion_send_inquiry()
384 struct clariion_dh_data *csdev = sdev->handler_data; in clariion_activate()
391 if (csdev->lun_state == CLARIION_LUN_OWNED) in clariion_activate()
399 csdev->flags&CLARIION_SHORT_TRESPASS?"short":"long" ); in clariion_activate()
409 CLARIION_NAME, csdev->current_sp + 'A', in clariion_activate()
410 csdev->port, lun_state[csdev->lun_state], in clariion_activate()
411 csdev->default_sp + 'A'); in clariion_activate()
418 * params - parameters in the following format
425 struct clariion_dh_data *csdev = sdev->handler_data; in clariion_set_params()
431 return -EINVAL; in clariion_set_params()
436 return -EINVAL; in clariion_set_params()
441 return -EINVAL; in clariion_set_params()
444 csdev->flags |= CLARIION_SHORT_TRESPASS; in clariion_set_params()
446 csdev->flags &= ~CLARIION_SHORT_TRESPASS; in clariion_set_params()
449 csdev->flags |= CLARIION_HONOR_RESERVATIONS; in clariion_set_params()
451 csdev->flags &= ~CLARIION_HONOR_RESERVATIONS; in clariion_set_params()
458 if (csdev->lun_state != CLARIION_LUN_OWNED) in clariion_set_params()
461 csdev->lun_state = CLARIION_LUN_UNINITIALIZED; in clariion_set_params()
481 h->lun_state = CLARIION_LUN_UNINITIALIZED; in clariion_bus_attach()
482 h->default_sp = CLARIION_UNBOUND_LU; in clariion_bus_attach()
483 h->current_sp = CLARIION_UNBOUND_LU; in clariion_bus_attach()
495 CLARIION_NAME, h->current_sp + 'A', in clariion_bus_attach()
496 h->port, lun_state[h->lun_state], in clariion_bus_attach()
497 h->default_sp + 'A'); in clariion_bus_attach()
499 sdev->handler_data = h; in clariion_bus_attach()
509 kfree(sdev->handler_data); in clariion_bus_detach()
510 sdev->handler_data = NULL; in clariion_bus_detach()
543 MODULE_DESCRIPTION("EMC CX/AX/FC-family driver");