Home | History | Annotate | Download | only in block

Lines Matching refs:srp

40 #include <gpxe/srp.h>
49 FEATURE ( FEATURE_PROTOCOL, "SRP", DHCP_EB_FEATURE_SRP, 1 );
51 /** Tag to be used for next SRP IU */
54 static void srp_login ( struct srp_device *srp );
55 static void srp_cmd ( struct srp_device *srp );
58 * Mark SRP SCSI command as complete
60 * @v srp SRP device
63 static void srp_scsi_done ( struct srp_device *srp, int rc ) {
64 if ( srp->command )
65 srp->command->rc = rc;
66 srp->command = NULL;
70 * Handle SRP session failure
72 * @v srp SRP device
75 static void srp_fail ( struct srp_device *srp, int rc ) {
78 xfer_close ( &srp->socket, rc );
81 srp->state = 0;
84 if ( srp->retry_count >= SRP_MAX_RETRIES ) {
85 srp_scsi_done ( srp, rc );
92 srp->retry_count++;
93 srp_login ( srp );
97 * Initiate SRP login
99 * @v srp SRP device
101 static void srp_login ( struct srp_device *srp ) {
106 assert ( ! ( srp->state & SRP_STATE_SOCKET_OPEN ) );
109 if ( ( rc = srp->transport->connect ( srp ) ) != 0 ) {
110 DBGC ( srp, "SRP %p could not open socket: %s\n",
111 srp, strerror ( rc ) );
114 srp->state |= SRP_STATE_SOCKET_OPEN;
117 iobuf = xfer_alloc_iob ( &srp->socket, sizeof ( *login_req ) );
130 memcpy ( &login_req->port_ids, &srp->port_ids,
133 DBGC2 ( srp, "SRP %p TX login request tag %08x%08x\n",
134 srp, ntohl ( login_req->tag.dwords[0] ),
136 DBGC2_HDA ( srp, 0, iobuf->data, iob_len ( iobuf ) );
139 if ( ( rc = xfer_deliver_iob ( &srp->socket, iobuf ) ) != 0 ) {
140 DBGC ( srp, "SRP %p could not send login request: %s\n",
141 srp, strerror ( rc ) );
148 srp_fail ( srp, rc );
152 * Handle SRP login response
154 * @v srp SRP device
158 static int srp_login_rsp ( struct srp_device *srp, struct io_buffer *iobuf ) {
162 DBGC2 ( srp, "SRP %p RX login response tag %08x%08x\n",
163 srp, ntohl ( login_rsp->tag.dwords[0] ),
168 DBGC ( srp, "SRP %p RX login response too short (%zd bytes)\n",
169 srp, iob_len ( iobuf ) );
174 DBGC ( srp, "SRP %p logged in\n", srp );
177 srp->state |= SRP_STATE_LOGGED_IN;
180 srp->retry_count = 0;
183 srp_cmd ( srp );
192 * Handle SRP login rejection
194 * @v srp SRP device
198 static int srp_login_rej ( struct srp_device *srp, struct io_buffer *iobuf ) {
202 DBGC2 ( srp, "SRP %p RX login rejection tag %08x%08x\n",
203 srp, ntohl ( login_rej->tag.dwords[0] ),
208 DBGC ( srp, "SRP %p RX login rejection too short (%zd "
209 "bytes)\n", srp, iob_len ( iobuf ) );
215 DBGC ( srp, "SRP %p login rejected (reason %08x)\n",
216 srp, ntohl ( login_rej->reason ) );
225 * Transmit SRP SCSI command
227 * @v srp SRP device
229 static void srp_cmd ( struct srp_device *srp ) {
236 assert ( srp->state & SRP_STATE_LOGGED_IN );
239 iobuf = xfer_alloc_iob ( &srp->socket, SRP_MAX_I_T_IU_LEN );
250 cmd->lun = srp->lun;
251 memcpy ( &cmd->cdb, &srp->command->cdb, sizeof ( cmd->cdb ) );
254 if ( srp->command->data_out ) {
258 cpu_to_be64 ( user_to_phys ( srp->command->data_out, 0 ) );
259 data_out->handle = ntohl ( srp->memory_handle );
260 data_out->len = ntohl ( srp->command->data_out_len );
264 if ( srp->command->data_in ) {
268 cpu_to_be64 ( user_to_phys ( srp->command->data_in, 0 ) );
269 data_in->handle = ntohl ( srp->memory_handle );
270 data_in->len = ntohl ( srp->command->data_in_len );
273 DBGC2 ( srp, "SRP %p TX SCSI command tag %08x%08x\n", srp,
275 DBGC2_HDA ( srp, 0, iobuf->data, iob_len ( iobuf ) );
278 if ( ( rc = xfer_deliver_iob ( &srp->socket, iobuf ) ) != 0 ) {
279 DBGC ( srp, "SRP %p could not send command: %s\n",
280 srp, strerror ( rc ) );
287 srp_fail ( srp, rc );
291 * Handle SRP SCSI response
293 * @v srp SRP device
297 static int srp_rsp ( struct srp_device *srp, struct io_buffer *iobuf ) {
301 DBGC2 ( srp, "SRP %p RX SCSI response tag %08x%08x\n", srp,
306 DBGC ( srp, "SRP %p RX SCSI response too short (%zd bytes)\n",
307 srp, iob_len ( iobuf ) );
314 DBGC ( srp, "SRP %p response status %02x\n",
315 srp, rsp->status );
317 DBGC ( srp, "SRP %p sense data:\n", srp );
318 DBGC_HDA ( srp, 0, srp_rsp_sense_data ( rsp ),
323 DBGC ( srp, "SRP %p response data-out %srun by %#x bytes\n",
324 srp, ( ( rsp->valid & SRP_RSP_VALID_DOUNDER )
329 DBGC ( srp, "SRP %p response data-in %srun by %#x bytes\n",
330 srp, ( ( rsp->valid & SRP_RSP_VALID_DIUNDER )
334 srp->command->status = rsp->status;
337 srp_scsi_done ( srp, 0 );
346 * Handle SRP unrecognised response
348 * @v srp SRP device
352 static int srp_unrecognised ( struct srp_device *srp,
356 DBGC ( srp, "SRP %p RX unrecognised IU tag %08x%08x type %02x\n",
357 srp, ntohl ( common->tag.dwords[0] ),
375 struct srp_device *srp =
378 int ( * type ) ( struct srp_device *srp, struct io_buffer *iobuf );
398 if ( ( rc = type ( srp, iobuf ) ) != 0 )
404 srp_fail ( srp, rc );
415 struct srp_device *srp =
418 DBGC ( srp, "SRP %p socket closed: %s\n", srp, strerror ( rc ) );
420 srp_fail ( srp, rc );
423 /** SRP data transfer interface operations */
434 * Issue SCSI command via SRP
442 struct srp_device *srp =
446 if ( srp->command ) {
447 DBGC ( srp, "SRP %p cannot handle concurrent SCSI commands\n",
448 srp );
451 srp->command = command;
454 if ( ! ( srp->state & SRP_STATE_SOCKET_OPEN ) ) {
455 srp_login ( srp );
456 } else if ( srp->state & SRP_STATE_LOGGED_IN ) {
457 srp_cmd ( srp );
466 * Attach SRP device
473 struct srp_device *srp;
476 /* Hard-code an IB SRP back-end for now */
480 srp = zalloc ( sizeof ( *srp ) + transport->priv_len );
481 if ( ! srp ) {
485 xfer_init ( &srp->socket, &srp_xfer_operations, &srp->refcnt );
486 srp->transport = transport;
487 DBGC ( srp, "SRP %p using %s\n", srp, root_path );
490 if ( ( rc = transport->parse_root_path ( srp, root_path ) ) != 0 ) {
491 DBGC ( srp, "SRP %p could not parse root path: %s\n",
492 srp, strerror ( rc ) );
497 scsi->backend = ref_get ( &srp->refcnt );
499 ref_put ( &srp->refcnt );
503 ref_put ( &srp->refcnt );
509 * Detach SRP device
514 struct srp_device *srp =
518 xfer_nullify ( &srp->socket );
519 xfer_close ( &srp->socket, 0 );