]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/s390/scsi/zfcp_fc.c
[S390] qdio: new qdio driver.
[linux-2.6-omap-h63xx.git] / drivers / s390 / scsi / zfcp_fc.c
index 5d9367d9a12d729527bef7b4bcdcf085498a23aa..e984469bb98bb04f6d0abc6652f3c435fc2f0c7e 100644 (file)
@@ -39,6 +39,18 @@ struct zfcp_gpn_ft {
        struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS];
 };
 
+static struct zfcp_port *zfcp_get_port_by_did(struct zfcp_adapter *adapter,
+                                             u32 d_id)
+{
+       struct zfcp_port *port;
+
+       list_for_each_entry(port, &adapter->port_list_head, list)
+               if ((port->d_id == d_id) &&
+                   !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status))
+                       return port;
+       return NULL;
+}
+
 static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
                                   struct fcp_rscn_element *elem)
 {
@@ -71,8 +83,8 @@ static void zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req)
        u16 no_entries;
        u32 range_mask;
 
-       fcp_rscn_head = (struct fcp_rscn_head *) status_buffer->payload;
-       fcp_rscn_element = (struct fcp_rscn_element *) status_buffer->payload;
+       fcp_rscn_head = (struct fcp_rscn_head *) status_buffer->payload.data;
+       fcp_rscn_element = (struct fcp_rscn_element *) fcp_rscn_head;
 
        /* see FC-FS */
        no_entries = fcp_rscn_head->payload_len /
@@ -123,7 +135,7 @@ static void zfcp_fc_incoming_plogi(struct zfcp_fsf_req *req)
        struct fsf_status_read_buffer *status_buffer =
                (struct fsf_status_read_buffer *)req->data;
        struct fsf_plogi *els_plogi =
-               (struct fsf_plogi *) status_buffer->payload;
+               (struct fsf_plogi *) status_buffer->payload.data;
 
        zfcp_fc_incoming_wwpn(req, els_plogi->serv_param.wwpn);
 }
@@ -132,7 +144,8 @@ static void zfcp_fc_incoming_logo(struct zfcp_fsf_req *req)
 {
        struct fsf_status_read_buffer *status_buffer =
                (struct fsf_status_read_buffer *)req->data;
-       struct fcp_logo *els_logo = (struct fcp_logo *) status_buffer->payload;
+       struct fcp_logo *els_logo =
+               (struct fcp_logo *) status_buffer->payload.data;
 
        zfcp_fc_incoming_wwpn(req, els_logo->nport_wwpn);
 }
@@ -145,7 +158,7 @@ void zfcp_fc_incoming_els(struct zfcp_fsf_req *fsf_req)
 {
        struct fsf_status_read_buffer *status_buffer =
                (struct fsf_status_read_buffer *) fsf_req->data;
-       unsigned int els_type = status_buffer->payload[0];
+       unsigned int els_type = status_buffer->payload.data[0];
 
        zfcp_san_dbf_event_incoming_els(fsf_req);
        if (els_type == LS_PLOGI)
@@ -496,10 +509,10 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft)
                port = zfcp_port_enqueue(adapter, acc->wwpn,
                                         ZFCP_STATUS_PORT_DID_DID |
                                         ZFCP_STATUS_COMMON_NOESC, d_id);
-               if (port)
-                       zfcp_erp_port_reopen(port, 0, 149, NULL);
+               if (IS_ERR(port))
+                       ret = PTR_ERR(port);
                else
-                       ret = -ENOMEM;
+                       zfcp_erp_port_reopen(port, 0, 149, NULL);
                if (acc->control & 0x80) /* last entry */
                        break;
        }