ispvar.h (171159) | ispvar.h (196008) |
---|---|
1/* $FreeBSD: head/sys/dev/isp/ispvar.h 171159 2007-07-02 20:08:20Z mjacob $ */ | 1/* $FreeBSD: head/sys/dev/isp/ispvar.h 196008 2009-08-01 01:04:26Z mjacob $ */ |
2/*- | 2/*- |
3 * Copyright (c) 1997-2007 by Matthew Jacob | 3 * Copyright (c) 1997-2009 by Matthew Jacob |
4 * All rights reserved. | 4 * All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: | 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. | 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. |
15 * | 15 * |
16 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. | 16 * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. |
27 * |
|
27 */ 28/* 29 * Soft Definitions for for Qlogic ISP SCSI adapters. 30 */ 31 32#ifndef _ISPVAR_H 33#define _ISPVAR_H 34 --- 9 unchanged lines hidden (view full) --- 44#include "isp_stds.h" 45#include "ispmbox.h" 46#endif 47#ifdef __svr4__ 48#include "isp_stds.h" 49#include "ispmbox.h" 50#endif 51 | 28 */ 29/* 30 * Soft Definitions for for Qlogic ISP SCSI adapters. 31 */ 32 33#ifndef _ISPVAR_H 34#define _ISPVAR_H 35 --- 9 unchanged lines hidden (view full) --- 45#include "isp_stds.h" 46#include "ispmbox.h" 47#endif 48#ifdef __svr4__ 49#include "isp_stds.h" 50#include "ispmbox.h" 51#endif 52 |
52#define ISP_CORE_VERSION_MAJOR 3 | 53#define ISP_CORE_VERSION_MAJOR 6 |
53#define ISP_CORE_VERSION_MINOR 0 54 55/* 56 * Vector for bus specific code to provide specific services. 57 */ 58typedef struct ispsoftc ispsoftc_t; 59struct ispmdvec { | 54#define ISP_CORE_VERSION_MINOR 0 55 56/* 57 * Vector for bus specific code to provide specific services. 58 */ 59typedef struct ispsoftc ispsoftc_t; 60struct ispmdvec { |
60 int (*dv_rd_isr) 61 (ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *); | 61 int (*dv_rd_isr) (ispsoftc_t *, uint32_t *, uint16_t *, uint16_t *); |
62 uint32_t (*dv_rd_reg) (ispsoftc_t *, int); 63 void (*dv_wr_reg) (ispsoftc_t *, int, uint32_t); 64 int (*dv_mbxdma) (ispsoftc_t *); | 62 uint32_t (*dv_rd_reg) (ispsoftc_t *, int); 63 void (*dv_wr_reg) (ispsoftc_t *, int, uint32_t); 64 int (*dv_mbxdma) (ispsoftc_t *); |
65 int (*dv_dmaset) 66 (ispsoftc_t *, XS_T *, ispreq_t *, uint32_t *, uint32_t); | 65 int (*dv_dmaset) (ispsoftc_t *, XS_T *, void *); |
67 void (*dv_dmaclr) (ispsoftc_t *, XS_T *, uint32_t); 68 void (*dv_reset0) (ispsoftc_t *); 69 void (*dv_reset1) (ispsoftc_t *); 70 void (*dv_dregs) (ispsoftc_t *, const char *); 71 const void * dv_ispfw; /* ptr to f/w */ 72 uint16_t dv_conf1; 73 uint16_t dv_clock; /* clock frequency */ 74}; 75 76/* 77 * Overall parameters 78 */ 79#define MAX_TARGETS 16 | 66 void (*dv_dmaclr) (ispsoftc_t *, XS_T *, uint32_t); 67 void (*dv_reset0) (ispsoftc_t *); 68 void (*dv_reset1) (ispsoftc_t *); 69 void (*dv_dregs) (ispsoftc_t *, const char *); 70 const void * dv_ispfw; /* ptr to f/w */ 71 uint16_t dv_conf1; 72 uint16_t dv_clock; /* clock frequency */ 73}; 74 75/* 76 * Overall parameters 77 */ 78#define MAX_TARGETS 16 |
79#ifndef MAX_FC_TARG |
|
80#define MAX_FC_TARG 512 | 80#define MAX_FC_TARG 512 |
81#endif |
|
81#define ISP_MAX_TARGETS(isp) (IS_FC(isp)? MAX_FC_TARG : MAX_TARGETS) 82#define ISP_MAX_LUNS(isp) (isp)->isp_maxluns 83 84/* 85 * Macros to access ISP registers through bus specific layers- 86 * mostly wrappers to vector through the mdvec structure. 87 */ 88#define ISP_READ_ISR(isp, isrp, semap, mbox0p) \ 89 (*(isp)->isp_mdvec->dv_rd_isr)(isp, isrp, semap, mbox0p) 90 91#define ISP_READ(isp, reg) \ 92 (*(isp)->isp_mdvec->dv_rd_reg)((isp), (reg)) 93 94#define ISP_WRITE(isp, reg, val) \ 95 (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), (val)) 96 97#define ISP_MBOXDMASETUP(isp) \ 98 (*(isp)->isp_mdvec->dv_mbxdma)((isp)) 99 | 82#define ISP_MAX_TARGETS(isp) (IS_FC(isp)? MAX_FC_TARG : MAX_TARGETS) 83#define ISP_MAX_LUNS(isp) (isp)->isp_maxluns 84 85/* 86 * Macros to access ISP registers through bus specific layers- 87 * mostly wrappers to vector through the mdvec structure. 88 */ 89#define ISP_READ_ISR(isp, isrp, semap, mbox0p) \ 90 (*(isp)->isp_mdvec->dv_rd_isr)(isp, isrp, semap, mbox0p) 91 92#define ISP_READ(isp, reg) \ 93 (*(isp)->isp_mdvec->dv_rd_reg)((isp), (reg)) 94 95#define ISP_WRITE(isp, reg, val) \ 96 (*(isp)->isp_mdvec->dv_wr_reg)((isp), (reg), (val)) 97 98#define ISP_MBOXDMASETUP(isp) \ 99 (*(isp)->isp_mdvec->dv_mbxdma)((isp)) 100 |
100#define ISP_DMASETUP(isp, xs, req, iptrp, optr) \ 101 (*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req), (iptrp), (optr)) | 101#define ISP_DMASETUP(isp, xs, req) \ 102 (*(isp)->isp_mdvec->dv_dmaset)((isp), (xs), (req)) |
102 103#define ISP_DMAFREE(isp, xs, hndl) \ 104 if ((isp)->isp_mdvec->dv_dmaclr) \ 105 (*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl)) 106 107#define ISP_RESET0(isp) \ 108 if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp)) 109#define ISP_RESET1(isp) \ --- 43 unchanged lines hidden (view full) --- 153#define ISP_QAVAIL(isp) \ 154 ISP_QFREE(isp->isp_reqidx, isp->isp_reqodx, RQUEST_QUEUE_LEN(isp)) 155 156#define ISP_ADD_REQUEST(isp, nxti) \ 157 MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN); \ 158 ISP_WRITE(isp, isp->isp_rqstinrp, nxti); \ 159 isp->isp_reqidx = nxti 160 | 103 104#define ISP_DMAFREE(isp, xs, hndl) \ 105 if ((isp)->isp_mdvec->dv_dmaclr) \ 106 (*(isp)->isp_mdvec->dv_dmaclr)((isp), (xs), (hndl)) 107 108#define ISP_RESET0(isp) \ 109 if ((isp)->isp_mdvec->dv_reset0) (*(isp)->isp_mdvec->dv_reset0)((isp)) 110#define ISP_RESET1(isp) \ --- 43 unchanged lines hidden (view full) --- 154#define ISP_QAVAIL(isp) \ 155 ISP_QFREE(isp->isp_reqidx, isp->isp_reqodx, RQUEST_QUEUE_LEN(isp)) 156 157#define ISP_ADD_REQUEST(isp, nxti) \ 158 MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN); \ 159 ISP_WRITE(isp, isp->isp_rqstinrp, nxti); \ 160 isp->isp_reqidx = nxti 161 |
162#define ISP_SYNC_REQUEST(isp) \ 163 MEMORYBARRIER(isp, SYNC_REQUEST, isp->isp_reqidx, QENTRY_LEN); \ 164 isp->isp_reqidx = ISP_NXT_QENTRY(isp->isp_reqidx, RQUEST_QUEUE_LEN(isp)); \ 165 ISP_WRITE(isp, isp->isp_rqstinrp, isp->isp_reqidx) 166 |
|
161/* 162 * SCSI Specific Host Adapter Parameters- per bus, per target 163 */ 164typedef struct { | 167/* 168 * SCSI Specific Host Adapter Parameters- per bus, per target 169 */ 170typedef struct { |
165 uint32_t : 10, 166 isp_bad_nvram : 1, 167 isp_gotdparms : 1, | 171 uint32_t : 8, 172 update : 1, 173 sendmarker : 1, 174 role : 2, |
168 isp_req_ack_active_neg : 1, 169 isp_data_line_active_neg: 1, 170 isp_cmd_dma_burst_enable: 1, 171 isp_data_dma_burst_enabl: 1, 172 isp_fifo_threshold : 3, 173 isp_ptisp : 1, 174 isp_ultramode : 1, 175 isp_diffmode : 1, 176 isp_lvdmode : 1, 177 isp_fast_mttr : 1, /* fast sram */ 178 isp_initiator_id : 4, 179 isp_async_data_setup : 4; 180 uint16_t isp_selection_timeout; 181 uint16_t isp_max_queue_depth; 182 uint8_t isp_tag_aging; 183 uint8_t isp_bus_reset_delay; 184 uint8_t isp_retry_count; 185 uint8_t isp_retry_delay; 186 struct { | 175 isp_req_ack_active_neg : 1, 176 isp_data_line_active_neg: 1, 177 isp_cmd_dma_burst_enable: 1, 178 isp_data_dma_burst_enabl: 1, 179 isp_fifo_threshold : 3, 180 isp_ptisp : 1, 181 isp_ultramode : 1, 182 isp_diffmode : 1, 183 isp_lvdmode : 1, 184 isp_fast_mttr : 1, /* fast sram */ 185 isp_initiator_id : 4, 186 isp_async_data_setup : 4; 187 uint16_t isp_selection_timeout; 188 uint16_t isp_max_queue_depth; 189 uint8_t isp_tag_aging; 190 uint8_t isp_bus_reset_delay; 191 uint8_t isp_retry_count; 192 uint8_t isp_retry_delay; 193 struct { |
187 uint32_t | 194 uint32_t |
188 exc_throttle : 8, 189 : 1, 190 dev_enable : 1, /* ignored */ 191 dev_update : 1, 192 dev_refresh : 1, 193 actv_offset : 4, 194 goal_offset : 4, 195 nvrm_offset : 4; --- 36 unchanged lines hidden (view full) --- 232/* 233 * Fibre Channel Specifics 234 */ 235/* These are for non-2K Login Firmware cards */ 236#define FL_ID 0x7e /* FL_Port Special ID */ 237#define SNS_ID 0x80 /* SNS Server Special ID */ 238#define NPH_MAX 0xfe 239 | 195 exc_throttle : 8, 196 : 1, 197 dev_enable : 1, /* ignored */ 198 dev_update : 1, 199 dev_refresh : 1, 200 actv_offset : 4, 201 goal_offset : 4, 202 nvrm_offset : 4; --- 36 unchanged lines hidden (view full) --- 239/* 240 * Fibre Channel Specifics 241 */ 242/* These are for non-2K Login Firmware cards */ 243#define FL_ID 0x7e /* FL_Port Special ID */ 244#define SNS_ID 0x80 /* SNS Server Special ID */ 245#define NPH_MAX 0xfe 246 |
247/* Use this handle for the base for multi-id firmware SNS logins */ 248#define NPH_SNS_HDLBASE 0x400 249 |
|
240/* These are for 2K Login Firmware cards */ 241#define NPH_RESERVED 0x7F0 /* begin of reserved N-port handles */ 242#define NPH_MGT_ID 0x7FA /* Management Server Special ID */ 243#define NPH_SNS_ID 0x7FC /* SNS Server Special ID */ | 250/* These are for 2K Login Firmware cards */ 251#define NPH_RESERVED 0x7F0 /* begin of reserved N-port handles */ 252#define NPH_MGT_ID 0x7FA /* Management Server Special ID */ 253#define NPH_SNS_ID 0x7FC /* SNS Server Special ID */ |
244#define NPH_FL_ID 0x7FE /* FL Port Special ID */ | 254#define NPH_FABRIC_CTLR 0x7FD /* Fabric Controller (0xFFFFFD) */ 255#define NPH_FL_ID 0x7FE /* F Port Special ID (0xFFFFFE) */ 256#define NPH_IP_BCST 0x7ff /* IP Broadcast Special ID (0xFFFFFF) */ |
245#define NPH_MAX_2K 0x800 246 247/* 248 * "Unassigned" handle to be used internally 249 */ 250#define NIL_HANDLE 0xffff 251 252/* 253 * Limit for devices on an arbitrated loop. 254 */ 255#define LOCAL_LOOP_LIM 126 256 257/* | 257#define NPH_MAX_2K 0x800 258 259/* 260 * "Unassigned" handle to be used internally 261 */ 262#define NIL_HANDLE 0xffff 263 264/* 265 * Limit for devices on an arbitrated loop. 266 */ 267#define LOCAL_LOOP_LIM 126 268 269/* |
270 * Limit for (2K login) N-port handle amounts 271 */ 272#define MAX_NPORT_HANDLE 2048 273 274/* 275 * Special Constants 276 */ 277#define INI_NONE ((uint64_t) 0) 278#define ISP_NOCHAN 0xff 279 280/* |
|
258 * Special Port IDs 259 */ 260#define MANAGEMENT_PORT_ID 0xFFFFFA 261#define SNS_PORT_ID 0xFFFFFC 262#define FABRIC_PORT_ID 0xFFFFFE | 281 * Special Port IDs 282 */ 283#define MANAGEMENT_PORT_ID 0xFFFFFA 284#define SNS_PORT_ID 0xFFFFFC 285#define FABRIC_PORT_ID 0xFFFFFE |
286#define PORT_ANY 0xFFFFFF 287#define PORT_NONE 0 288#define DOMAIN_CONTROLLER_BASE 0xFFFC00 289#define DOMAIN_CONTROLLER_END 0xFFFCFF |
|
263 264 265/* 266 * FC Port Database entry. 267 * 268 * It has a handle that the f/w uses to address commands to a device. 269 * This handle's value may be assigned by the firmware (e.g., for local loop 270 * devices) or by the driver (e.g., for fabric devices). 271 * 272 * It has a state. If the state if VALID, that means that we've logged into 273 * the device. We also *may* have a initiator map index entry. This is a value | 290 291 292/* 293 * FC Port Database entry. 294 * 295 * It has a handle that the f/w uses to address commands to a device. 296 * This handle's value may be assigned by the firmware (e.g., for local loop 297 * devices) or by the driver (e.g., for fabric devices). 298 * 299 * It has a state. If the state if VALID, that means that we've logged into 300 * the device. We also *may* have a initiator map index entry. This is a value |
274 * from 0..MAX_FC_TARG that is used to index into the isp_ini_map array. If | 301 * from 0..MAX_FC_TARG that is used to index into the isp_dev_map array. If |
275 * the value therein is non-zero, then that value minus one is used to index 276 * into the Port Database to find the handle for forming commands. There is | 302 * the value therein is non-zero, then that value minus one is used to index 303 * into the Port Database to find the handle for forming commands. There is |
277 * back-index minus one value within to Port Database entry that tells us 278 * which entry in isp_ini_map points to us (to avoid searching). | 304 * back-index minus one value within to Port Database entry that tells us 305 * which entry in isp_dev_map points to us (to avoid searching). |
279 * 280 * Local loop devices the firmware automatically performs PLOGI on for us 281 * (which is why that handle is imposed upon us). Fabric devices we assign 282 * a handle to and perform the PLOGI on. 283 * 284 * When a PORT DATABASE CHANGED asynchronous event occurs, we mark all VALID 285 * entries as PROBATIONAL. This allows us, if policy says to, just keep track 286 * of devices whose handles change but are otherwise the same device (and --- 16 unchanged lines hidden (view full) --- 303 * 304 * Negative invariants that we try and test for are: 305 * 306 * + There can never be two non-NIL entries with the same { Port, Node } WWN 307 * duples. 308 * 309 * + There can never be two non-NIL entries with the same handle. 310 * | 306 * 307 * Local loop devices the firmware automatically performs PLOGI on for us 308 * (which is why that handle is imposed upon us). Fabric devices we assign 309 * a handle to and perform the PLOGI on. 310 * 311 * When a PORT DATABASE CHANGED asynchronous event occurs, we mark all VALID 312 * entries as PROBATIONAL. This allows us, if policy says to, just keep track 313 * of devices whose handles change but are otherwise the same device (and --- 16 unchanged lines hidden (view full) --- 330 * 331 * Negative invariants that we try and test for are: 332 * 333 * + There can never be two non-NIL entries with the same { Port, Node } WWN 334 * duples. 335 * 336 * + There can never be two non-NIL entries with the same handle. 337 * |
311 * + There can never be two non-NIL entries which have the same ini_map_idx | 338 * + There can never be two non-NIL entries which have the same dev_map_idx |
312 * value. 313 */ 314typedef struct { 315 /* 316 * This is the handle that the firmware needs in order for us to 317 * send commands to the device. For pre-24XX cards, this would be 318 * the 'loopid'. 319 */ 320 uint16_t handle; | 339 * value. 340 */ 341typedef struct { 342 /* 343 * This is the handle that the firmware needs in order for us to 344 * send commands to the device. For pre-24XX cards, this would be 345 * the 'loopid'. 346 */ 347 uint16_t handle; |
348 |
|
321 /* | 349 /* |
322 * The ini_map_idx, if nonzero, is the system virtual target ID (+1) 323 * as a cross-reference with the isp_ini_map. | 350 * The dev_map_idx, if nonzero, is the system virtual target ID (+1) 351 * as a cross-reference with the isp_dev_map. |
324 * 325 * A device is 'autologin' if the firmware automatically logs into 326 * it (re-logins as needed). Basically, local private loop devices. 327 * | 352 * 353 * A device is 'autologin' if the firmware automatically logs into 354 * it (re-logins as needed). Basically, local private loop devices. 355 * |
328 * The state is the current state of thsi entry. | 356 * The state is the current state of this entry. |
329 * 330 * Role is Initiator, Target, Both 331 * | 357 * 358 * Role is Initiator, Target, Both 359 * |
332 * Portid is obvious, as or node && port WWNs. The new_role and | 360 * Portid is obvious, as are node && port WWNs. The new_role and |
333 * new_portid is for when we are pending a change. | 361 * new_portid is for when we are pending a change. |
362 * 363 * The 'target_mode' tag means that this entry arrived via a 364 * target mode command and is immune from normal flushing rules. 365 * You should also never see anything with an initiator role 366 * with this set. |
|
334 */ | 367 */ |
335 uint16_t ini_map_idx : 12, | 368 uint16_t dev_map_idx : 12, |
336 autologin : 1, /* F/W does PLOGI/PLOGO */ 337 state : 3; | 369 autologin : 1, /* F/W does PLOGI/PLOGO */ 370 state : 3; |
338 uint32_t reserved : 6, | 371 uint32_t reserved : 5, 372 target_mode : 1, |
339 roles : 2, 340 portid : 24; | 373 roles : 2, 374 portid : 24; |
341 uint32_t new_reserved : 6, | 375 uint32_t 376 dirty : 1, /* commands have been run */ 377 new_reserved : 5, |
342 new_roles : 2, 343 new_portid : 24; 344 uint64_t node_wwn; 345 uint64_t port_wwn; 346} fcportdb_t; 347 348#define FC_PORTDB_STATE_NIL 0 349#define FC_PORTDB_STATE_PROBATIONAL 1 350#define FC_PORTDB_STATE_DEAD 2 351#define FC_PORTDB_STATE_CHANGED 3 352#define FC_PORTDB_STATE_NEW 4 353#define FC_PORTDB_STATE_PENDING_VALID 5 354#define FC_PORTDB_STATE_ZOMBIE 6 355#define FC_PORTDB_STATE_VALID 7 356 357/* 358 * FC card specific information | 378 new_roles : 2, 379 new_portid : 24; 380 uint64_t node_wwn; 381 uint64_t port_wwn; 382} fcportdb_t; 383 384#define FC_PORTDB_STATE_NIL 0 385#define FC_PORTDB_STATE_PROBATIONAL 1 386#define FC_PORTDB_STATE_DEAD 2 387#define FC_PORTDB_STATE_CHANGED 3 388#define FC_PORTDB_STATE_NEW 4 389#define FC_PORTDB_STATE_PENDING_VALID 5 390#define FC_PORTDB_STATE_ZOMBIE 6 391#define FC_PORTDB_STATE_VALID 7 392 393/* 394 * FC card specific information |
395 * 396 * This structure is replicated across multiple channels for multi-id 397 * capapble chipsets, with some entities different on a per-channel basis. |
|
359 */ | 398 */ |
399 |
|
360typedef struct { | 400typedef struct { |
361 uint32_t : 10, 362 isp_tmode : 1, 363 isp_2klogin : 1, 364 isp_sccfw : 1, 365 isp_gbspeed : 3, 366 : 1, 367 : 1, 368 isp_gotdparms : 1, 369 isp_bad_nvram : 1, | 401 uint32_t 402 link_active : 1, 403 npiv_fabric : 1, 404 inorder : 1, 405 sendmarker : 1, 406 role : 2, 407 isp_gbspeed : 4, |
370 isp_loopstate : 4, /* Current Loop State */ 371 isp_fwstate : 4, /* ISP F/W state */ | 408 isp_loopstate : 4, /* Current Loop State */ 409 isp_fwstate : 4, /* ISP F/W state */ |
372 isp_topo : 3, | 410 isp_topo : 3, /* Connection Type */ |
373 loop_seen_once : 1; | 411 loop_seen_once : 1; |
412 |
|
374 uint32_t : 8, 375 isp_portid : 24; /* S_ID */ | 413 uint32_t : 8, 414 isp_portid : 24; /* S_ID */ |
415 416 |
|
376 uint16_t isp_fwoptions; 377 uint16_t isp_xfwoptions; 378 uint16_t isp_zfwoptions; | 417 uint16_t isp_fwoptions; 418 uint16_t isp_xfwoptions; 419 uint16_t isp_zfwoptions; |
379 uint16_t isp_loopid; /* hard loop id */ 380 uint16_t isp_fwattr; /* firmware attributes */ 381 uint16_t isp_execthrottle; | 420 uint16_t isp_loopid; /* hard loop id */ 421 uint16_t isp_sns_hdl; /* N-port handle for SNS */ 422 uint16_t isp_lasthdl; /* only valid for channel 0 */ 423 uint16_t isp_maxalloc; |
382 uint8_t isp_retry_delay; 383 uint8_t isp_retry_count; | 424 uint8_t isp_retry_delay; 425 uint8_t isp_retry_count; |
384 uint8_t isp_reserved; 385 uint16_t isp_maxalloc; 386 uint16_t isp_maxfrmlen; | 426 427 /* 428 * Current active WWNN/WWPN 429 */ 430 uint64_t isp_wwnn; 431 uint64_t isp_wwpn; 432 433 /* 434 * NVRAM WWNN/WWPN 435 */ |
387 uint64_t isp_wwnn_nvram; 388 uint64_t isp_wwpn_nvram; 389 390 /* 391 * Our Port Data Base 392 */ 393 fcportdb_t portdb[MAX_FC_TARG]; 394 395 /* 396 * This maps system virtual 'target' id to a portdb entry. 397 * 398 * The mapping function is to take any non-zero entry and 399 * subtract one to get the portdb index. This means that 400 * entries which are zero are unmapped (i.e., don't exist). 401 */ | 436 uint64_t isp_wwnn_nvram; 437 uint64_t isp_wwpn_nvram; 438 439 /* 440 * Our Port Data Base 441 */ 442 fcportdb_t portdb[MAX_FC_TARG]; 443 444 /* 445 * This maps system virtual 'target' id to a portdb entry. 446 * 447 * The mapping function is to take any non-zero entry and 448 * subtract one to get the portdb index. This means that 449 * entries which are zero are unmapped (i.e., don't exist). 450 */ |
402 uint16_t isp_ini_map[MAX_FC_TARG]; | 451 uint16_t isp_dev_map[MAX_FC_TARG]; |
403 | 452 |
453#ifdef ISP_TARGET_MODE |
|
404 /* | 454 /* |
455 * This maps N-Port Handle to portdb entry so we 456 * don't have to search for every incoming command. 457 * 458 * The mapping function is to take any non-zero entry and 459 * subtract one to get the portdb index. This means that 460 * entries which are zero are unmapped (i.e., don't exist). 461 */ 462 uint16_t isp_tgt_map[MAX_NPORT_HANDLE]; 463#endif 464 465 /* |
|
405 * Scratch DMA mapped in area to fetch Port Database stuff, etc. 406 */ 407 void * isp_scratch; 408 XS_DMA_ADDR_T isp_scdma; | 466 * Scratch DMA mapped in area to fetch Port Database stuff, etc. 467 */ 468 void * isp_scratch; 469 XS_DMA_ADDR_T isp_scdma; |
409#ifdef ISP_FW_CRASH_DUMP 410 uint16_t * isp_dump_data; 411#endif | |
412} fcparam; 413 414#define FW_CONFIG_WAIT 0 415#define FW_WAIT_AL_PA 1 416#define FW_WAIT_LOGIN 2 417#define FW_READY 3 418#define FW_LOSS_OF_SYNC 4 419#define FW_ERROR 5 --- 32 unchanged lines hidden (view full) --- 452 453 /* 454 * (Mostly) nonvolatile state. Board specific parameters 455 * may contain some volatile state (e.g., current loop state). 456 */ 457 458 void * isp_param; /* type specific */ 459 uint16_t isp_fwrev[3]; /* Loaded F/W revision */ | 470} fcparam; 471 472#define FW_CONFIG_WAIT 0 473#define FW_WAIT_AL_PA 1 474#define FW_WAIT_LOGIN 2 475#define FW_READY 3 476#define FW_LOSS_OF_SYNC 4 477#define FW_ERROR 5 --- 32 unchanged lines hidden (view full) --- 510 511 /* 512 * (Mostly) nonvolatile state. Board specific parameters 513 * may contain some volatile state (e.g., current loop state). 514 */ 515 516 void * isp_param; /* type specific */ 517 uint16_t isp_fwrev[3]; /* Loaded F/W revision */ |
460 uint16_t isp_romfw_rev[3]; /* PROM F/W revision */ | |
461 uint16_t isp_maxcmds; /* max possible I/O cmds */ 462 uint8_t isp_type; /* HBA Chip Type */ 463 uint8_t isp_revision; /* HBA Chip H/W Revision */ 464 uint32_t isp_maxluns; /* maximum luns supported */ 465 466 uint32_t isp_clock : 8, /* input clock */ 467 : 4, 468 isp_port : 1, /* 23XX/24XX only */ | 518 uint16_t isp_maxcmds; /* max possible I/O cmds */ 519 uint8_t isp_type; /* HBA Chip Type */ 520 uint8_t isp_revision; /* HBA Chip H/W Revision */ 521 uint32_t isp_maxluns; /* maximum luns supported */ 522 523 uint32_t isp_clock : 8, /* input clock */ 524 : 4, 525 isp_port : 1, /* 23XX/24XX only */ |
469 isp_failed : 1, /* board failed */ | |
470 isp_open : 1, /* opened (ioctl) */ | 526 isp_open : 1, /* opened (ioctl) */ |
471 isp_touched : 1, /* board ever seen? */ | |
472 isp_bustype : 1, /* SBus or PCI */ 473 isp_loaded_fw : 1, /* loaded firmware */ | 527 isp_bustype : 1, /* SBus or PCI */ 528 isp_loaded_fw : 1, /* loaded firmware */ |
474 isp_role : 2, /* roles supported */ 475 isp_dblev : 12; /* debug log mask */ | 529 isp_dblev : 16; /* debug log mask */ |
476 | 530 |
477 uint32_t isp_confopts; /* config options */ | 531 uint16_t isp_fwattr; /* firmware attributes */ 532 uint16_t isp_nchan; /* number of channels */ |
478 | 533 |
534 uint32_t isp_confopts; /* config options */ 535 |
|
479 uint32_t isp_rqstinrp; /* register for REQINP */ 480 uint32_t isp_rqstoutrp; /* register for REQOUTP */ 481 uint32_t isp_respinrp; /* register for RESINP */ 482 uint32_t isp_respoutrp; /* register for RESOUTP */ | 536 uint32_t isp_rqstinrp; /* register for REQINP */ 537 uint32_t isp_rqstoutrp; /* register for REQOUTP */ 538 uint32_t isp_respinrp; /* register for RESINP */ 539 uint32_t isp_respoutrp; /* register for RESOUTP */ |
483 uint32_t isp_atioinrp; /* register for ATIOINP */ 484 uint32_t isp_atiooutrp; /* register for ATIOOUTP */ | |
485 486 /* 487 * Instrumentation 488 */ 489 uint64_t isp_intcnt; /* total int count */ 490 uint64_t isp_intbogus; /* spurious int count */ 491 uint64_t isp_intmboxc; /* mbox completions */ 492 uint64_t isp_intoasync; /* other async */ 493 uint64_t isp_rsltccmplt; /* CMDs on result q */ 494 uint64_t isp_fphccmplt; /* CMDs via fastpost */ 495 uint16_t isp_rscchiwater; 496 uint16_t isp_fpcchiwater; | 540 541 /* 542 * Instrumentation 543 */ 544 uint64_t isp_intcnt; /* total int count */ 545 uint64_t isp_intbogus; /* spurious int count */ 546 uint64_t isp_intmboxc; /* mbox completions */ 547 uint64_t isp_intoasync; /* other async */ 548 uint64_t isp_rsltccmplt; /* CMDs on result q */ 549 uint64_t isp_fphccmplt; /* CMDs via fastpost */ 550 uint16_t isp_rscchiwater; 551 uint16_t isp_fpcchiwater; |
552 NANOTIME_T isp_init_time; /* time were last initialized */ |
|
497 498 /* 499 * Volatile state 500 */ 501 502 volatile uint32_t : 8, | 553 554 /* 555 * Volatile state 556 */ 557 558 volatile uint32_t : 8, |
559 : 2, 560 isp_dead : 1, 561 : 1, |
|
503 isp_mboxbsy : 1, /* mailbox command active */ 504 isp_state : 3, | 562 isp_mboxbsy : 1, /* mailbox command active */ 563 isp_state : 3, |
505 isp_sendmarker : 2, /* send a marker entry */ 506 isp_update : 2, /* update parameters */ | |
507 isp_nactive : 16; /* how many commands active */ 508 volatile uint32_t isp_reqodx; /* index of last ISP pickup */ 509 volatile uint32_t isp_reqidx; /* index of next request */ 510 volatile uint32_t isp_residx; /* index of next result */ 511 volatile uint32_t isp_resodx; /* index of next result */ | 564 isp_nactive : 16; /* how many commands active */ 565 volatile uint32_t isp_reqodx; /* index of last ISP pickup */ 566 volatile uint32_t isp_reqidx; /* index of next request */ 567 volatile uint32_t isp_residx; /* index of next result */ 568 volatile uint32_t isp_resodx; /* index of next result */ |
512 volatile uint32_t isp_rspbsy; | |
513 volatile uint32_t isp_lasthdls; /* last handle seed */ 514 volatile uint32_t isp_obits; /* mailbox command output */ | 569 volatile uint32_t isp_lasthdls; /* last handle seed */ 570 volatile uint32_t isp_obits; /* mailbox command output */ |
571 volatile uint32_t isp_serno; /* rolling serial number */ |
|
515 volatile uint16_t isp_mboxtmp[MAILBOX_STORAGE]; 516 volatile uint16_t isp_lastmbxcmd; /* last mbox command sent */ 517 volatile uint16_t isp_mbxwrk0; 518 volatile uint16_t isp_mbxwrk1; 519 volatile uint16_t isp_mbxwrk2; 520 volatile uint16_t isp_mbxwrk8; 521 void * isp_mbxworkp; 522 523 /* 524 * Active commands are stored here, indexed by handle functions. 525 */ 526 XS_T **isp_xflist; 527 528#ifdef ISP_TARGET_MODE 529 /* | 572 volatile uint16_t isp_mboxtmp[MAILBOX_STORAGE]; 573 volatile uint16_t isp_lastmbxcmd; /* last mbox command sent */ 574 volatile uint16_t isp_mbxwrk0; 575 volatile uint16_t isp_mbxwrk1; 576 volatile uint16_t isp_mbxwrk2; 577 volatile uint16_t isp_mbxwrk8; 578 void * isp_mbxworkp; 579 580 /* 581 * Active commands are stored here, indexed by handle functions. 582 */ 583 XS_T **isp_xflist; 584 585#ifdef ISP_TARGET_MODE 586 /* |
530 * Active target commands are stored here, indexed by handle function. | 587 * Active target commands are stored here, indexed by handle functions. |
531 */ 532 void **isp_tgtlist; 533#endif 534 535 /* 536 * request/result queue pointers and DMA handles for them. 537 */ 538 void * isp_rquest; 539 void * isp_result; 540 XS_DMA_ADDR_T isp_rquest_dma; 541 XS_DMA_ADDR_T isp_result_dma; 542#ifdef ISP_TARGET_MODE 543 /* for 24XX only */ 544 void * isp_atioq; 545 XS_DMA_ADDR_T isp_atioq_dma; 546#endif 547}; 548 | 588 */ 589 void **isp_tgtlist; 590#endif 591 592 /* 593 * request/result queue pointers and DMA handles for them. 594 */ 595 void * isp_rquest; 596 void * isp_result; 597 XS_DMA_ADDR_T isp_rquest_dma; 598 XS_DMA_ADDR_T isp_result_dma; 599#ifdef ISP_TARGET_MODE 600 /* for 24XX only */ 601 void * isp_atioq; 602 XS_DMA_ADDR_T isp_atioq_dma; 603#endif 604}; 605 |
549#define SDPARAM(isp) ((sdparam *) (isp)->isp_param) 550#define FCPARAM(isp) ((fcparam *) (isp)->isp_param) | 606#define SDPARAM(isp, chan) (&((sdparam *)(isp)->isp_param)[(chan)]) 607#define FCPARAM(isp, chan) (&((fcparam *)(isp)->isp_param)[(chan)]) |
551 | 608 |
609#define ISP_SET_SENDMARKER(isp, chan, val) \ 610 if (IS_FC(isp)) { \ 611 FCPARAM(isp, chan)->sendmarker = val; \ 612 } else { \ 613 SDPARAM(isp, chan)->sendmarker = val; \ 614 } 615 616#define ISP_TST_SENDMARKER(isp, chan) \ 617 (IS_FC(isp)? \ 618 FCPARAM(isp, chan)->sendmarker != 0 : \ 619 SDPARAM(isp, chan)->sendmarker != 0) 620 |
|
552/* 553 * ISP Driver Run States 554 */ 555#define ISP_NILSTATE 0 556#define ISP_CRASHED 1 557#define ISP_RESETSTATE 2 558#define ISP_INITSTATE 3 559#define ISP_RUNSTATE 4 --- 6 unchanged lines hidden (view full) --- 566#define ISP_CFG_TWOGB 0x20 /* force 2GB connection (23XX only) */ 567#define ISP_CFG_ONEGB 0x10 /* force 1GB connection (23XX only) */ 568#define ISP_CFG_FULL_DUPLEX 0x01 /* Full Duplex (Fibre Channel only) */ 569#define ISP_CFG_PORT_PREF 0x0C /* Mask for Port Prefs (2200 only) */ 570#define ISP_CFG_LPORT 0x00 /* prefer {N/F}L-Port connection */ 571#define ISP_CFG_NPORT 0x04 /* prefer {N/F}-Port connection */ 572#define ISP_CFG_NPORT_ONLY 0x08 /* insist on {N/F}-Port connection */ 573#define ISP_CFG_LPORT_ONLY 0x0C /* insist on {N/F}L-Port connection */ | 621/* 622 * ISP Driver Run States 623 */ 624#define ISP_NILSTATE 0 625#define ISP_CRASHED 1 626#define ISP_RESETSTATE 2 627#define ISP_INITSTATE 3 628#define ISP_RUNSTATE 4 --- 6 unchanged lines hidden (view full) --- 635#define ISP_CFG_TWOGB 0x20 /* force 2GB connection (23XX only) */ 636#define ISP_CFG_ONEGB 0x10 /* force 1GB connection (23XX only) */ 637#define ISP_CFG_FULL_DUPLEX 0x01 /* Full Duplex (Fibre Channel only) */ 638#define ISP_CFG_PORT_PREF 0x0C /* Mask for Port Prefs (2200 only) */ 639#define ISP_CFG_LPORT 0x00 /* prefer {N/F}L-Port connection */ 640#define ISP_CFG_NPORT 0x04 /* prefer {N/F}-Port connection */ 641#define ISP_CFG_NPORT_ONLY 0x08 /* insist on {N/F}-Port connection */ 642#define ISP_CFG_LPORT_ONLY 0x0C /* insist on {N/F}L-Port connection */ |
574#define ISP_CFG_OWNWWPN 0x100 /* override NVRAM wwpn */ 575#define ISP_CFG_OWNWWNN 0x200 /* override NVRAM wwnn */ | |
576#define ISP_CFG_OWNFSZ 0x400 /* override NVRAM frame size */ 577#define ISP_CFG_OWNLOOPID 0x800 /* override NVRAM loopid */ 578#define ISP_CFG_OWNEXCTHROTTLE 0x1000 /* override NVRAM execution throttle */ 579#define ISP_CFG_FOURGB 0x2000 /* force 4GB connection (24XX only) */ 580 581/* | 643#define ISP_CFG_OWNFSZ 0x400 /* override NVRAM frame size */ 644#define ISP_CFG_OWNLOOPID 0x800 /* override NVRAM loopid */ 645#define ISP_CFG_OWNEXCTHROTTLE 0x1000 /* override NVRAM execution throttle */ 646#define ISP_CFG_FOURGB 0x2000 /* force 4GB connection (24XX only) */ 647 648/* |
582 * Prior to calling isp_reset for the first time, the outer layer 583 * should set isp_role to one of NONE, INITIATOR, TARGET, BOTH. | 649 * For each channel, the outer layers should know what role that channel 650 * will take: ISP_ROLE_NONE, ISP_ROLE_INITIATOR, ISP_ROLE_TARGET, 651 * ISP_ROLE_BOTH. |
584 * 585 * If you set ISP_ROLE_NONE, the cards will be reset, new firmware loaded, 586 * NVRAM read, and defaults set, but any further initialization (e.g. 587 * INITIALIZE CONTROL BLOCK commands for 2X00 cards) won't be done. 588 * 589 * If INITIATOR MODE isn't set, attempts to run commands will be stopped | 652 * 653 * If you set ISP_ROLE_NONE, the cards will be reset, new firmware loaded, 654 * NVRAM read, and defaults set, but any further initialization (e.g. 655 * INITIALIZE CONTROL BLOCK commands for 2X00 cards) won't be done. 656 * 657 * If INITIATOR MODE isn't set, attempts to run commands will be stopped |
590 * at isp_start and completed with the moral equivalent of SELECTION TIMEOUT. | 658 * at isp_start and completed with the equivalent of SELECTION TIMEOUT. |
591 * 592 * If TARGET MODE is set, it doesn't mean that the rest of target mode support 593 * needs to be enabled, or will even work. What happens with the 2X00 cards 594 * here is that if you have enabled it with TARGET MODE as part of the ICB 595 * options, but you haven't given the f/w any ram resources for ATIOs or 596 * Immediate Notifies, the f/w just handles what it can and you never see 597 * anything. Basically, it sends a single byte of data (the first byte, 598 * which you can set as part of the INITIALIZE CONTROL BLOCK command) for --- 61 unchanged lines hidden (view full) --- 660#define ISP_HA_SCSI_12160 0xc 661#define ISP_HA_FC 0xf0 662#define ISP_HA_FC_2100 0x10 663#define ISP_HA_FC_2200 0x20 664#define ISP_HA_FC_2300 0x30 665#define ISP_HA_FC_2312 0x40 666#define ISP_HA_FC_2322 0x50 667#define ISP_HA_FC_2400 0x60 | 659 * 660 * If TARGET MODE is set, it doesn't mean that the rest of target mode support 661 * needs to be enabled, or will even work. What happens with the 2X00 cards 662 * here is that if you have enabled it with TARGET MODE as part of the ICB 663 * options, but you haven't given the f/w any ram resources for ATIOs or 664 * Immediate Notifies, the f/w just handles what it can and you never see 665 * anything. Basically, it sends a single byte of data (the first byte, 666 * which you can set as part of the INITIALIZE CONTROL BLOCK command) for --- 61 unchanged lines hidden (view full) --- 728#define ISP_HA_SCSI_12160 0xc 729#define ISP_HA_FC 0xf0 730#define ISP_HA_FC_2100 0x10 731#define ISP_HA_FC_2200 0x20 732#define ISP_HA_FC_2300 0x30 733#define ISP_HA_FC_2312 0x40 734#define ISP_HA_FC_2322 0x50 735#define ISP_HA_FC_2400 0x60 |
736#define ISP_HA_FC_2500 0x70 |
|
668 669#define IS_SCSI(isp) (isp->isp_type & ISP_HA_SCSI) | 737 738#define IS_SCSI(isp) (isp->isp_type & ISP_HA_SCSI) |
739#define IS_1020(isp) (isp->isp_type < ISP_HA_SCSI_1240) |
|
670#define IS_1240(isp) (isp->isp_type == ISP_HA_SCSI_1240) 671#define IS_1080(isp) (isp->isp_type == ISP_HA_SCSI_1080) 672#define IS_1280(isp) (isp->isp_type == ISP_HA_SCSI_1280) 673#define IS_10160(isp) (isp->isp_type == ISP_HA_SCSI_10160) 674#define IS_12160(isp) (isp->isp_type == ISP_HA_SCSI_12160) 675 676#define IS_12X0(isp) (IS_1240(isp) || IS_1280(isp)) 677#define IS_1X160(isp) (IS_10160(isp) || IS_12160(isp)) --- 5 unchanged lines hidden (view full) --- 683#define IS_2100(isp) ((isp)->isp_type == ISP_HA_FC_2100) 684#define IS_2200(isp) ((isp)->isp_type == ISP_HA_FC_2200) 685#define IS_23XX(isp) ((isp)->isp_type >= ISP_HA_FC_2300 && \ 686 (isp)->isp_type < ISP_HA_FC_2400) 687#define IS_2300(isp) ((isp)->isp_type == ISP_HA_FC_2300) 688#define IS_2312(isp) ((isp)->isp_type == ISP_HA_FC_2312) 689#define IS_2322(isp) ((isp)->isp_type == ISP_HA_FC_2322) 690#define IS_24XX(isp) ((isp)->isp_type >= ISP_HA_FC_2400) | 740#define IS_1240(isp) (isp->isp_type == ISP_HA_SCSI_1240) 741#define IS_1080(isp) (isp->isp_type == ISP_HA_SCSI_1080) 742#define IS_1280(isp) (isp->isp_type == ISP_HA_SCSI_1280) 743#define IS_10160(isp) (isp->isp_type == ISP_HA_SCSI_10160) 744#define IS_12160(isp) (isp->isp_type == ISP_HA_SCSI_12160) 745 746#define IS_12X0(isp) (IS_1240(isp) || IS_1280(isp)) 747#define IS_1X160(isp) (IS_10160(isp) || IS_12160(isp)) --- 5 unchanged lines hidden (view full) --- 753#define IS_2100(isp) ((isp)->isp_type == ISP_HA_FC_2100) 754#define IS_2200(isp) ((isp)->isp_type == ISP_HA_FC_2200) 755#define IS_23XX(isp) ((isp)->isp_type >= ISP_HA_FC_2300 && \ 756 (isp)->isp_type < ISP_HA_FC_2400) 757#define IS_2300(isp) ((isp)->isp_type == ISP_HA_FC_2300) 758#define IS_2312(isp) ((isp)->isp_type == ISP_HA_FC_2312) 759#define IS_2322(isp) ((isp)->isp_type == ISP_HA_FC_2322) 760#define IS_24XX(isp) ((isp)->isp_type >= ISP_HA_FC_2400) |
761#define IS_25XX(isp) ((isp)->isp_type >= ISP_HA_FC_2500) |
|
691 692/* 693 * DMA related macros 694 */ 695#define DMA_WD3(x) (((uint16_t)(((uint64_t)x) >> 48)) & 0xffff) 696#define DMA_WD2(x) (((uint16_t)(((uint64_t)x) >> 32)) & 0xffff) 697#define DMA_WD1(x) ((uint16_t)((x) >> 16) & 0xffff) 698#define DMA_WD0(x) ((uint16_t)((x) & 0xffff)) 699 700#define DMA_LO32(x) ((uint32_t) (x)) 701#define DMA_HI32(x) ((uint32_t)(((uint64_t)x) >> 32)) 702 703/* 704 * Core System Function Prototypes 705 */ 706 707/* | 762 763/* 764 * DMA related macros 765 */ 766#define DMA_WD3(x) (((uint16_t)(((uint64_t)x) >> 48)) & 0xffff) 767#define DMA_WD2(x) (((uint16_t)(((uint64_t)x) >> 32)) & 0xffff) 768#define DMA_WD1(x) ((uint16_t)((x) >> 16) & 0xffff) 769#define DMA_WD0(x) ((uint16_t)((x) & 0xffff)) 770 771#define DMA_LO32(x) ((uint32_t) (x)) 772#define DMA_HI32(x) ((uint32_t)(((uint64_t)x) >> 32)) 773 774/* 775 * Core System Function Prototypes 776 */ 777 778/* |
708 * Reset Hardware. Totally. Assumes that you'll follow this with 709 * a call to isp_init. | 779 * Reset Hardware. Totally. Assumes that you'll follow this with a call to isp_init. |
710 */ | 780 */ |
711void isp_reset(ispsoftc_t *); | 781void isp_reset(ispsoftc_t *, int); |
712 713/* 714 * Initialize Hardware to known state 715 */ 716void isp_init(ispsoftc_t *); 717 718/* 719 * Reset the ISP and call completion for any orphaned commands. 720 */ | 782 783/* 784 * Initialize Hardware to known state 785 */ 786void isp_init(ispsoftc_t *); 787 788/* 789 * Reset the ISP and call completion for any orphaned commands. 790 */ |
721void isp_reinit(ispsoftc_t *); | 791void isp_reinit(ispsoftc_t *, int); |
722 | 792 |
723#ifdef ISP_FW_CRASH_DUMP | |
724/* | 793/* |
725 * Dump firmware entry point. 726 */ 727void isp_fw_dump(ispsoftc_t *isp); 728#endif 729 730/* | |
731 * Internal Interrupt Service Routine 732 * 733 * The outer layers do the spade work to get the appropriate status register, 734 * semaphore register and first mailbox register (if appropriate). This also 735 * means that most spurious/bogus interrupts not for us can be filtered first. 736 */ 737void isp_intr(ispsoftc_t *, uint32_t, uint16_t, uint16_t); 738 --- 13 unchanged lines hidden (view full) --- 752 * Command Completion Point- Core layers call out from this with completed cmds 753 */ 754void isp_done(XS_T *); 755 756/* 757 * Platform Dependent to External to Internal Control Function 758 * 759 * Assumes locks are held on entry. You should note that with many of | 794 * Internal Interrupt Service Routine 795 * 796 * The outer layers do the spade work to get the appropriate status register, 797 * semaphore register and first mailbox register (if appropriate). This also 798 * means that most spurious/bogus interrupts not for us can be filtered first. 799 */ 800void isp_intr(ispsoftc_t *, uint32_t, uint16_t, uint16_t); 801 --- 13 unchanged lines hidden (view full) --- 815 * Command Completion Point- Core layers call out from this with completed cmds 816 */ 817void isp_done(XS_T *); 818 819/* 820 * Platform Dependent to External to Internal Control Function 821 * 822 * Assumes locks are held on entry. You should note that with many of |
760 * these commands and locks may be released while this is occurring. | 823 * these commands locks may be released while this function is called. |
761 * | 824 * |
762 * A few notes about some of these functions: | 825 * ... ISPCTL_RESET_BUS, int channel); 826 * Reset BUS on this channel 827 * ... ISPCTL_RESET_DEV, int channel, int target); 828 * Reset Device on this channel at this target. 829 * ... ISPCTL_ABORT_CMD, XS_T *xs); 830 * Abort active transaction described by xs. 831 * ... IPCTL_UPDATE_PARAMS); 832 * Update any operating parameters (speed, etc.) 833 * ... ISPCTL_FCLINK_TEST, int channel); 834 * Test FC link status on this channel 835 * ... ISPCTL_SCAN_FABRIC, int channel); 836 * Scan fabric on this channel 837 * ... ISPCTL_SCAN_LOOP, int channel); 838 * Scan local loop on this channel 839 * ... ISPCTL_PDB_SYNC, int channel); 840 * Synchronize port database on this channel 841 * ... ISPCTL_SEND_LIP, int channel); 842 * Send a LIP on this channel 843 * ... ISPCTL_GET_NAMES, int channel, int np, uint64_t *wwnn, uint64_t *wwpn) 844 * Get a WWNN/WWPN for this N-port handle on this channel 845 * ... ISPCTL_RUN_MBOXCMD, mbreg_t *mbp) 846 * Run this mailbox command 847 * ... ISPCTL_GET_PDB, int channel, int nphandle, isp_pdb_t *pdb) 848 * Get PDB on this channel for this N-port handle 849 * ... ISPCTL_PLOGX, isp_plcmd_t *) 850 * Performa a port login/logout |
763 * | 851 * |
764 * ISPCTL_FCLINK_TEST tests to make sure we have good fibre channel link. 765 * The argument is a pointer to an integer which is the time, in microseconds, 766 * we should wait to see whether we have good link. This test, if successful, 767 * lets us know our connection topology and our Loop ID/AL_PA and so on. 768 * You can't get anywhere without this. 769 * 770 * ISPCTL_SCAN_FABRIC queries the name server (if we're on a fabric) for 771 * all entities using the FC Generic Services subcommand GET ALL NEXT. 772 * For each found entity, an ISPASYNC_FABRICDEV event is generated (see 773 * below). 774 * 775 * ISPCTL_SCAN_LOOP does a local loop scan. This is only done if the connection 776 * topology is NL or FL port (private or public loop). Since the Qlogic f/w 777 * 'automatically' manages local loop connections, this function essentially 778 * notes the arrival, departure, and possible shuffling around of local loop 779 * entities. Thus for each arrival and departure this generates an isp_async 780 * event of ISPASYNC_PROMENADE (see below). 781 * | |
782 * ISPCTL_PDB_SYNC is somewhat misnamed. It actually is the final step, in 783 * order, of ISPCTL_FCLINK_TEST, ISPCTL_SCAN_FABRIC, and ISPCTL_SCAN_LOOP. 784 * The main purpose of ISPCTL_PDB_SYNC is to complete management of logging 785 * and logging out of fabric devices (if one is on a fabric) and then marking 786 * the 'loop state' as being ready to now be used for sending commands to 787 * devices. Originally fabric name server and local loop scanning were 788 * part of this function. It's now been separated to allow for finer control. 789 */ 790typedef enum { | 852 * ISPCTL_PDB_SYNC is somewhat misnamed. It actually is the final step, in 853 * order, of ISPCTL_FCLINK_TEST, ISPCTL_SCAN_FABRIC, and ISPCTL_SCAN_LOOP. 854 * The main purpose of ISPCTL_PDB_SYNC is to complete management of logging 855 * and logging out of fabric devices (if one is on a fabric) and then marking 856 * the 'loop state' as being ready to now be used for sending commands to 857 * devices. Originally fabric name server and local loop scanning were 858 * part of this function. It's now been separated to allow for finer control. 859 */ 860typedef enum { |
791 ISPCTL_RESET_BUS, /* Reset Bus */ 792 ISPCTL_RESET_DEV, /* Reset Device */ 793 ISPCTL_ABORT_CMD, /* Abort Command */ 794 ISPCTL_UPDATE_PARAMS, /* Update Operating Parameters (SCSI) */ 795 ISPCTL_FCLINK_TEST, /* Test FC Link Status */ 796 ISPCTL_SCAN_FABRIC, /* (Re)scan Fabric Name Server */ 797 ISPCTL_SCAN_LOOP, /* (Re)scan Local Loop */ 798 ISPCTL_PDB_SYNC, /* Synchronize Port Database */ 799 ISPCTL_SEND_LIP, /* Send a LIP */ 800 ISPCTL_GET_PORTNAME, /* get portname from an N-port handle */ 801 ISPCTL_RUN_MBOXCMD, /* run a mailbox command */ 802 ISPCTL_TOGGLE_TMODE, /* toggle target mode */ 803 ISPCTL_GET_PDB, /* get a single port database entry */ 804 ISPCTL_PLOGX /* do a port login/logout */ | 861 ISPCTL_RESET_BUS, 862 ISPCTL_RESET_DEV, 863 ISPCTL_ABORT_CMD, 864 ISPCTL_UPDATE_PARAMS, 865 ISPCTL_FCLINK_TEST, 866 ISPCTL_SCAN_FABRIC, 867 ISPCTL_SCAN_LOOP, 868 ISPCTL_PDB_SYNC, 869 ISPCTL_SEND_LIP, 870 ISPCTL_GET_NAMES, 871 ISPCTL_RUN_MBOXCMD, 872 ISPCTL_GET_PDB, 873 ISPCTL_PLOGX |
805} ispctl_t; | 874} ispctl_t; |
806int isp_control(ispsoftc_t *, ispctl_t, void *); | 875int isp_control(ispsoftc_t *, ispctl_t, ...); |
807 | 876 |
808 | |
809/* 810 * Platform Dependent to Internal to External Control Function | 877/* 878 * Platform Dependent to Internal to External Control Function |
811 * (each platform must provide such a function) 812 * 813 * Assumes locks are held. 814 * 815 * A few notes about some of these functions: 816 * 817 * ISPASYNC_CHANGE_NOTIFY notifies the outer layer that a change has 818 * occurred that invalidates the list of fabric devices known and/or 819 * the list of known loop devices. The argument passed is a pointer 820 * whose values are defined below (local loop change, name server 821 * change, other). 'Other' may simply be a LIP, or a change in 822 * connection topology. 823 * 824 * ISPASYNC_FABRIC_DEV announces the next element in a list of 825 * fabric device names we're getting out of the name server. The 826 * argument points to a GET ALL NEXT response structure. The list 827 * is known to terminate with an entry that refers to ourselves. 828 * One of the main purposes of this function is to allow outer 829 * layers, which are OS dependent, to set policy as to which fabric 830 * devices might actually be logged into (and made visible) later 831 * at ISPCTL_PDB_SYNC time. Since there's a finite number of fabric 832 * devices that we can log into (256 less 3 'reserved' for F-port 833 * topologies), and fabrics can grow up to 8 million or so entries 834 * (24 bits of Port Address, less a wad of reserved spaces), clearly 835 * we had better let the OS determine login policy. 836 * 837 * ISPASYNC_PROMENADE has an argument that is a pointer to an integer which 838 * is an index into the portdb in the softc ('target'). Whether that entry's 839 * valid tag is set or not says whether something has arrived or departed. 840 * The name refers to a favorite pastime of many city dwellers- watching 841 * people come and go, talking of Michaelangelo, and so on.. 842 * 843 * ISPASYNC_UNHANDLED_RESPONSE gives outer layers a chance to parse a 844 * response queue entry not otherwise handled. The outer layer should 845 * return non-zero if it handled it. The 'arg' points to an unmassaged 846 * response queue entry. | |
847 */ 848 849typedef enum { | 879 */ 880 881typedef enum { |
850 ISPASYNC_NEW_TGT_PARAMS, /* New Target Parameters Negotiated */ 851 ISPASYNC_BUS_RESET, /* Bus Was Reset */ | 882 ISPASYNC_NEW_TGT_PARAMS, /* SPI New Target Parameters */ 883 ISPASYNC_BUS_RESET, /* All Bus Was Reset */ |
852 ISPASYNC_LOOP_DOWN, /* FC Loop Down */ 853 ISPASYNC_LOOP_UP, /* FC Loop Up */ | 884 ISPASYNC_LOOP_DOWN, /* FC Loop Down */ 885 ISPASYNC_LOOP_UP, /* FC Loop Up */ |
854 ISPASYNC_LIP, /* LIP Received */ 855 ISPASYNC_LOOP_RESET, /* Loop Reset Received */ | 886 ISPASYNC_LIP, /* FC LIP Received */ 887 ISPASYNC_LOOP_RESET, /* FC Loop Reset Received */ |
856 ISPASYNC_CHANGE_NOTIFY, /* FC Change Notification */ | 888 ISPASYNC_CHANGE_NOTIFY, /* FC Change Notification */ |
857 ISPASYNC_DEV_ARRIVED, /* FC Device Arrival */ 858 ISPASYNC_DEV_CHANGED, /* FC Device Change */ 859 ISPASYNC_DEV_STAYED, /* FC Device Stayed the Same */ 860 ISPASYNC_DEV_GONE, /* FC Device Depart */ 861 ISPASYNC_TARGET_NOTIFY, /* target asynchronous notification event */ 862 ISPASYNC_TARGET_ACTION, /* target action requested */ 863 ISPASYNC_CONF_CHANGE, /* Platform Configuration Change */ 864 ISPASYNC_UNHANDLED_RESPONSE, /* Unhandled Response Entry */ 865 ISPASYNC_FW_CRASH, /* Firmware has crashed */ 866 ISPASYNC_FW_DUMPED, /* Firmware crashdump taken */ 867 ISPASYNC_FW_RESTARTED /* Firmware has been restarted */ | 889 ISPASYNC_DEV_ARRIVED, /* FC Device Arrived */ 890 ISPASYNC_DEV_CHANGED, /* FC Device Changed */ 891 ISPASYNC_DEV_STAYED, /* FC Device Stayed */ 892 ISPASYNC_DEV_GONE, /* FC Device Departure */ 893 ISPASYNC_TARGET_NOTIFY, /* All target async notification */ 894 ISPASYNC_TARGET_ACTION, /* All target action requested */ 895 ISPASYNC_FW_CRASH, /* All Firmware has crashed */ 896 ISPASYNC_FW_RESTARTED /* All Firmware has been restarted */ |
868} ispasync_t; | 897} ispasync_t; |
869int isp_async(ispsoftc_t *, ispasync_t, void *); | 898void isp_async(ispsoftc_t *, ispasync_t, ...); |
870 | 899 |
871#define ISPASYNC_CHANGE_PDB ((void *) 0) 872#define ISPASYNC_CHANGE_SNS ((void *) 1) 873#define ISPASYNC_CHANGE_OTHER ((void *) 2) | 900#define ISPASYNC_CHANGE_PDB 0 901#define ISPASYNC_CHANGE_SNS 1 902#define ISPASYNC_CHANGE_OTHER 2 |
874 875/* 876 * Platform Dependent Error and Debug Printout 877 * 878 * Generally this is: 879 * 880 * void isp_prt(ispsoftc_t *, int level, const char *, ...) 881 * --- 6 unchanged lines hidden (view full) --- 888#define ISP_LOGINFO 0x2 /* log informational messages */ 889#define ISP_LOGWARN 0x4 /* log warning messages */ 890#define ISP_LOGERR 0x8 /* log error messages */ 891#define ISP_LOGDEBUG0 0x10 /* log simple debug messages */ 892#define ISP_LOGDEBUG1 0x20 /* log intermediate debug messages */ 893#define ISP_LOGDEBUG2 0x40 /* log most debug messages */ 894#define ISP_LOGDEBUG3 0x80 /* log high frequency debug messages */ 895#define ISP_LOGSANCFG 0x100 /* log SAN configuration */ | 903 904/* 905 * Platform Dependent Error and Debug Printout 906 * 907 * Generally this is: 908 * 909 * void isp_prt(ispsoftc_t *, int level, const char *, ...) 910 * --- 6 unchanged lines hidden (view full) --- 917#define ISP_LOGINFO 0x2 /* log informational messages */ 918#define ISP_LOGWARN 0x4 /* log warning messages */ 919#define ISP_LOGERR 0x8 /* log error messages */ 920#define ISP_LOGDEBUG0 0x10 /* log simple debug messages */ 921#define ISP_LOGDEBUG1 0x20 /* log intermediate debug messages */ 922#define ISP_LOGDEBUG2 0x40 /* log most debug messages */ 923#define ISP_LOGDEBUG3 0x80 /* log high frequency debug messages */ 924#define ISP_LOGSANCFG 0x100 /* log SAN configuration */ |
896#define ISP_LOGTDEBUG0 0x200 /* log simple debug messages (target mode) */ 897#define ISP_LOGTDEBUG1 0x400 /* log intermediate debug messages (target) */ 898#define ISP_LOGTDEBUG2 0x800 /* log all debug messages (target) */ | 925#define ISP_LOGTINFO 0x1000 /* log informational messages (target mode) */ 926#define ISP_LOGTDEBUG0 0x2000 /* log simple debug messages (target mode) */ 927#define ISP_LOGTDEBUG1 0x4000 /* log intermediate debug messages (target) */ 928#define ISP_LOGTDEBUG2 0x8000 /* log all debug messages (target) */ |
899 900/* 901 * Each Platform provides it's own isposinfo substructure of the ispsoftc 902 * defined above. 903 * 904 * Each platform must also provide the following macros/defines: 905 * 906 * | 929 930/* 931 * Each Platform provides it's own isposinfo substructure of the ispsoftc 932 * defined above. 933 * 934 * Each platform must also provide the following macros/defines: 935 * 936 * |
907 * ISP2100_SCRLEN - length for the Fibre Channel scratch DMA area | 937 * ISP_FC_SCRLEN FC scratch area DMA length |
908 * | 938 * |
909 * MEMZERO(dst, src) platform zeroing function 910 * MEMCPY(dst, src, count) platform copying function 911 * SNPRINTF(buf, bufsize, fmt, ...) snprintf 912 * USEC_DELAY(usecs) microsecond spindelay function 913 * USEC_SLEEP(isp, usecs) microsecond sleep function | 939 * ISP_MEMZERO(dst, src) platform zeroing function 940 * ISP_MEMCPY(dst, src, count) platform copying function 941 * ISP_SNPRINTF(buf, bufsize, fmt, ...) snprintf 942 * ISP_DELAY(usecs) microsecond spindelay function 943 * ISP_SLEEP(isp, usecs) microsecond sleep function |
914 * | 944 * |
945 * ISP_INLINE ___inline or not- depending on how 946 * good your debugger is 947 * |
|
915 * NANOTIME_T nanosecond time type 916 * 917 * GET_NANOTIME(NANOTIME_T *) get current nanotime. 918 * 919 * GET_NANOSEC(NANOTIME_T *) get uint64_t from NANOTIME_T 920 * 921 * NANOTIME_SUB(NANOTIME_T *, NANOTIME_T *) 922 * subtract two NANOTIME_T values 923 * | 948 * NANOTIME_T nanosecond time type 949 * 950 * GET_NANOTIME(NANOTIME_T *) get current nanotime. 951 * 952 * GET_NANOSEC(NANOTIME_T *) get uint64_t from NANOTIME_T 953 * 954 * NANOTIME_SUB(NANOTIME_T *, NANOTIME_T *) 955 * subtract two NANOTIME_T values 956 * |
924 * 925 * MAXISPREQUEST(ispsoftc_t *) maximum request queue size | 957 * MAXISPREQUEST(ispsoftc_t *) maximum request queue size |
926 * for this particular board type 927 * 928 * MEMORYBARRIER(ispsoftc_t *, barrier_type, offset, size) 929 * 930 * Function/Macro the provides memory synchronization on 931 * various objects so that the ISP's and the system's view 932 * of the same object is consistent. 933 * 934 * MBOX_ACQUIRE(ispsoftc_t *) acquire lock on mailbox regs 935 * MBOX_WAIT_COMPLETE(ispsoftc_t *, mbreg_t *) wait for cmd to be done 936 * MBOX_NOTIFY_COMPLETE(ispsoftc_t *) notification of mbox cmd donee 937 * MBOX_RELEASE(ispsoftc_t *) release lock on mailbox regs 938 * | 958 * for this particular board type 959 * 960 * MEMORYBARRIER(ispsoftc_t *, barrier_type, offset, size) 961 * 962 * Function/Macro the provides memory synchronization on 963 * various objects so that the ISP's and the system's view 964 * of the same object is consistent. 965 * 966 * MBOX_ACQUIRE(ispsoftc_t *) acquire lock on mailbox regs 967 * MBOX_WAIT_COMPLETE(ispsoftc_t *, mbreg_t *) wait for cmd to be done 968 * MBOX_NOTIFY_COMPLETE(ispsoftc_t *) notification of mbox cmd donee 969 * MBOX_RELEASE(ispsoftc_t *) release lock on mailbox regs 970 * |
939 * FC_SCRATCH_ACQUIRE(ispsoftc_t *) acquire lock on FC scratch area 940 * FC_SCRATCH_RELEASE(ispsoftc_t *) acquire lock on FC scratch area | 971 * FC_SCRATCH_ACQUIRE(ispsoftc_t *, chan) acquire lock on FC scratch area 972 * return -1 if you cannot 973 * FC_SCRATCH_RELEASE(ispsoftc_t *, chan) acquire lock on FC scratch area |
941 * 942 * SCSI_GOOD SCSI 'Good' Status 943 * SCSI_CHECK SCSI 'Check Condition' Status 944 * SCSI_BUSY SCSI 'Busy' Status 945 * SCSI_QFULL SCSI 'Queue Full' Status 946 * | 974 * 975 * SCSI_GOOD SCSI 'Good' Status 976 * SCSI_CHECK SCSI 'Check Condition' Status 977 * SCSI_BUSY SCSI 'Busy' Status 978 * SCSI_QFULL SCSI 'Queue Full' Status 979 * |
947 * XS_T Platform SCSI transaction type (i.e., command for HBA) 948 * XS_DMA_ADDR_T Platform PCI DMA Address Type 949 * XS_ISP(xs) gets an instance out of an XS_T 950 * XS_CHANNEL(xs) gets the channel (bus # for DUALBUS cards) "" 951 * XS_TGT(xs) gets the target "" 952 * XS_LUN(xs) gets the lun "" 953 * XS_CDBP(xs) gets a pointer to the scsi CDB "" 954 * XS_CDBLEN(xs) gets the CDB's length "" 955 * XS_XFRLEN(xs) gets the associated data transfer length "" 956 * XS_TIME(xs) gets the time (in milliseconds) for this command 957 * XS_RESID(xs) gets the current residual count 958 * XS_STSP(xs) gets a pointer to the SCSI status byte "" 959 * XS_SNSP(xs) gets a pointer to the associate sense data 960 * XS_SNSLEN(xs) gets the length of sense data storage 961 * XS_SNSKEY(xs) dereferences XS_SNSP to get the current stored Sense Key 962 * XS_TAG_P(xs) predicate of whether this command should be tagged 963 * XS_TAG_TYPE(xs) which type of tag to use 964 * XS_SETERR(xs) set error state | 980 * XS_T Platform SCSI transaction type (i.e., command for HBA) 981 * XS_DMA_ADDR_T Platform PCI DMA Address Type 982 * XS_GET_DMA_SEG(..) Get 32 bit dma segment list value 983 * XS_GET_DMA64_SEG(..) Get 64 bit dma segment list value 984 * XS_ISP(xs) gets an instance out of an XS_T 985 * XS_CHANNEL(xs) gets the channel (bus # for DUALBUS cards) "" 986 * XS_TGT(xs) gets the target "" 987 * XS_LUN(xs) gets the lun "" 988 * XS_CDBP(xs) gets a pointer to the scsi CDB "" 989 * XS_CDBLEN(xs) gets the CDB's length "" 990 * XS_XFRLEN(xs) gets the associated data transfer length "" 991 * XS_TIME(xs) gets the time (in milliseconds) for this command 992 * XS_GET_RESID(xs) gets the current residual count 993 * XS_GET_RESID(xs, resid) sets the current residual count 994 * XS_STSP(xs) gets a pointer to the SCSI status byte "" 995 * XS_SNSP(xs) gets a pointer to the associate sense data 996 * XS_SNSLEN(xs) gets the length of sense data storage 997 * XS_SNSKEY(xs) dereferences XS_SNSP to get the current stored Sense Key 998 * XS_TAG_P(xs) predicate of whether this command should be tagged 999 * XS_TAG_TYPE(xs) which type of tag to use 1000 * XS_SETERR(xs) set error state |
965 * 966 * HBA_NOERROR command has no erros 967 * HBA_BOTCH hba botched something 968 * HBA_CMDTIMEOUT command timed out 969 * HBA_SELTIMEOUT selection timed out (also port logouts for FC) 970 * HBA_TGTBSY target returned a BUSY status 971 * HBA_BUSRESET bus reset destroyed command 972 * HBA_ABORTED command was aborted (by request) 973 * HBA_DATAOVR a data overrun was detected 974 * HBA_ARQFAIL Automatic Request Sense failed 975 * 976 * XS_ERR(xs) return current error state 977 * XS_NOERR(xs) there is no error currently set 978 * XS_INITERR(xs) initialize error state 979 * 980 * XS_SAVE_SENSE(xs, sp, len) save sense data 981 * | 1001 * 1002 * HBA_NOERROR command has no erros 1003 * HBA_BOTCH hba botched something 1004 * HBA_CMDTIMEOUT command timed out 1005 * HBA_SELTIMEOUT selection timed out (also port logouts for FC) 1006 * HBA_TGTBSY target returned a BUSY status 1007 * HBA_BUSRESET bus reset destroyed command 1008 * HBA_ABORTED command was aborted (by request) 1009 * HBA_DATAOVR a data overrun was detected 1010 * HBA_ARQFAIL Automatic Request Sense failed 1011 * 1012 * XS_ERR(xs) return current error state 1013 * XS_NOERR(xs) there is no error currently set 1014 * XS_INITERR(xs) initialize error state 1015 * 1016 * XS_SAVE_SENSE(xs, sp, len) save sense data 1017 * |
982 * XS_SET_STATE_STAT(isp, sp, xs) platform dependent interpreter of 983 * response queue entry status bits | 1018 * DEFAULT_FRAMESIZE(ispsoftc_t *) Default Frame Size 1019 * DEFAULT_EXEC_THROTTLE(ispsoftc_t *) Default Execution Throttle |
984 * | 1020 * |
1021 * GET_DEFAULT_ROLE(ispsoftc_t *, int) Get Default Role for a channel 1022 * SET_DEFAULT_ROLE(ispsoftc_t *, int, int) Set Default Role for a channel 1023 * DEFAULT_IID(ispsoftc_t *, int) Default SCSI initiator ID 1024 * DEFAULT_LOOPID(ispsoftc_t *, int) Default FC Loop ID |
|
985 * | 1025 * |
986 * DEFAULT_IID(ispsoftc_t *) Default SCSI initiator ID 987 * DEFAULT_LOOPID(ispsoftc_t *) Default FC Loop ID 988 * DEFAULT_NODEWWN(ispsoftc_t *) Default Node WWN 989 * DEFAULT_PORTWWN(ispsoftc_t *) Default Port WWN 990 * DEFAULT_FRAMESIZE(ispsoftc_t *) Default Frame Size 991 * DEFAULT_EXEC_THROTTLE(ispsoftc_t *) Default Execution Throttle | |
992 * These establish reasonable defaults for each platform. 993 * These must be available independent of card NVRAM and are 994 * to be used should NVRAM not be readable. 995 * | 1026 * These establish reasonable defaults for each platform. 1027 * These must be available independent of card NVRAM and are 1028 * to be used should NVRAM not be readable. 1029 * |
996 * ISP_NODEWWN(ispsoftc_t *) FC Node WWN to use 997 * ISP_PORTWWN(ispsoftc_t *) FC Port WWN to use | 1030 * DEFAULT_NODEWWN(ispsoftc_t *, chan) Default FC Node WWN to use 1031 * DEFAULT_PORTWWN(ispsoftc_t *, chan) Default FC Port WWN to use |
998 * | 1032 * |
999 * These are to be used after NVRAM is read. The tags 1000 * in fcparam.isp_ww{n,p}n_nvram reflect the values 1001 * read from NVRAM (possibly corrected for card botches). 1002 * Each platform can take that information and override 1003 * it or ignore and return the Node and Port WWNs to be 1004 * used when sending the Qlogic f/w the Initialization 1005 * Control Block. | 1033 * These defines are hooks to allow the setting of node and 1034 * port WWNs when NVRAM cannot be read or is to be overriden. |
1006 * | 1035 * |
1007 * (XXX these do endian specific transformations- in transition XXX) | 1036 * ACTIVE_NODEWWN(ispsoftc_t *, chan) FC Node WWN to use 1037 * ACTIVE_PORTWWN(ispsoftc_t *, chan) FC Port WWN to use |
1008 * | 1038 * |
1039 * After NVRAM is read, these will be invoked to get the 1040 * node and port WWNs that will actually be used for this 1041 * channel. 1042 * 1043 * |
|
1009 * ISP_IOXPUT_8(ispsoftc_t *, uint8_t srcval, uint8_t *dstptr) 1010 * ISP_IOXPUT_16(ispsoftc_t *, uint16_t srcval, uint16_t *dstptr) 1011 * ISP_IOXPUT_32(ispsoftc_t *, uint32_t srcval, uint32_t *dstptr) 1012 * 1013 * ISP_IOXGET_8(ispsoftc_t *, uint8_t *srcptr, uint8_t dstrval) 1014 * ISP_IOXGET_16(ispsoftc_t *, uint16_t *srcptr, uint16_t dstrval) 1015 * ISP_IOXGET_32(ispsoftc_t *, uint32_t *srcptr, uint32_t dstrval) 1016 * 1017 * ISP_SWIZZLE_NVRAM_WORD(ispsoftc_t *, uint16_t *) 1018 * ISP_SWIZZLE_NVRAM_LONG(ispsoftc_t *, uint32_t *) 1019 * ISP_SWAP16(ispsoftc_t *, uint16_t srcval) 1020 * ISP_SWAP32(ispsoftc_t *, uint32_t srcval) 1021 */ 1022 | 1044 * ISP_IOXPUT_8(ispsoftc_t *, uint8_t srcval, uint8_t *dstptr) 1045 * ISP_IOXPUT_16(ispsoftc_t *, uint16_t srcval, uint16_t *dstptr) 1046 * ISP_IOXPUT_32(ispsoftc_t *, uint32_t srcval, uint32_t *dstptr) 1047 * 1048 * ISP_IOXGET_8(ispsoftc_t *, uint8_t *srcptr, uint8_t dstrval) 1049 * ISP_IOXGET_16(ispsoftc_t *, uint16_t *srcptr, uint16_t dstrval) 1050 * ISP_IOXGET_32(ispsoftc_t *, uint32_t *srcptr, uint32_t dstrval) 1051 * 1052 * ISP_SWIZZLE_NVRAM_WORD(ispsoftc_t *, uint16_t *) 1053 * ISP_SWIZZLE_NVRAM_LONG(ispsoftc_t *, uint32_t *) 1054 * ISP_SWAP16(ispsoftc_t *, uint16_t srcval) 1055 * ISP_SWAP32(ispsoftc_t *, uint32_t srcval) 1056 */ 1057 |
1058#ifdef ISP_TARGET_MODE 1059/* 1060 * The functions below are for the publicly available 1061 * target mode functions that are internal to the Qlogic driver. 1062 */ 1063 1064/* 1065 * This function handles new response queue entry appropriate for target mode. 1066 */ 1067int isp_target_notify(ispsoftc_t *, void *, uint32_t *); 1068 1069/* 1070 * This function externalizes the ability to acknowledge an Immediate Notify request. 1071 */ 1072int isp_notify_ack(ispsoftc_t *, void *); 1073 1074/* 1075 * This function externalized acknowledging (success/fail) an ABTS frame 1076 */ 1077int isp_acknak_abts(ispsoftc_t *, void *, int); 1078 1079/* 1080 * Enable/Disable/Modify a logical unit. 1081 * (softc, cmd, bus, tgt, lun, cmd_cnt, inotify_cnt) 1082 */ 1083#define DFLT_CMND_CNT 0xfe /* unmonitored */ 1084#define DFLT_INOT_CNT 0xfe /* unmonitored */ 1085int isp_lun_cmd(ispsoftc_t *, int, int, int, int, int); 1086 1087/* 1088 * General request queue 'put' routine for target mode entries. 1089 */ 1090int isp_target_put_entry(ispsoftc_t *isp, void *); 1091 1092/* 1093 * General routine to put back an ATIO entry- 1094 * used for replenishing f/w resource counts. 1095 * The argument is a pointer to a source ATIO 1096 * or ATIO2. 1097 */ 1098int isp_target_put_atio(ispsoftc_t *, void *); 1099 1100/* 1101 * General routine to send a final CTIO for a command- used mostly for 1102 * local responses. 1103 */ 1104int isp_endcmd(ispsoftc_t *, ...); 1105#define ECMD_SVALID 0x100 1106#define ECMD_TERMINATE 0x200 1107 1108/* 1109 * Handle an asynchronous event 1110 * 1111 * Return nonzero if the interrupt that generated this event has been dismissed. 1112 */ 1113int isp_target_async(ispsoftc_t *, int, int); 1114#endif |
|
1023#endif /* _ISPVAR_H */ | 1115#endif /* _ISPVAR_H */ |