mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 13:14:07 +08:00
[S390] qdio: Split SBAL entry flags
The qdio SBAL entry flag is made-up of four different values that are independent of one another. Some of the bits are reserved by the hardware and should not be changed by qdio. Currently all four values are overwritten since the SBAL entry flag is defined as an u32. Split the SBAL entry flag into four u8's as defined by the hardware and don't touch the reserved bits. Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
9950f8be3f
commit
3ec90878ba
@ -139,110 +139,47 @@ struct slib {
|
||||
struct slibe slibe[QDIO_MAX_BUFFERS_PER_Q];
|
||||
} __attribute__ ((packed, aligned(2048)));
|
||||
|
||||
/**
|
||||
* struct sbal_flags - storage block address list flags
|
||||
* @last: last entry
|
||||
* @cont: contiguous storage
|
||||
* @frag: fragmentation
|
||||
*/
|
||||
struct sbal_flags {
|
||||
u8 : 1;
|
||||
u8 last : 1;
|
||||
u8 cont : 1;
|
||||
u8 : 1;
|
||||
u8 frag : 2;
|
||||
u8 : 2;
|
||||
} __attribute__ ((packed));
|
||||
#define SBAL_EFLAGS_LAST_ENTRY 0x40
|
||||
#define SBAL_EFLAGS_CONTIGUOUS 0x20
|
||||
#define SBAL_EFLAGS_FIRST_FRAG 0x04
|
||||
#define SBAL_EFLAGS_MIDDLE_FRAG 0x08
|
||||
#define SBAL_EFLAGS_LAST_FRAG 0x0c
|
||||
#define SBAL_EFLAGS_MASK 0x6f
|
||||
|
||||
#define SBAL_FLAGS_FIRST_FRAG 0x04000000UL
|
||||
#define SBAL_FLAGS_MIDDLE_FRAG 0x08000000UL
|
||||
#define SBAL_FLAGS_LAST_FRAG 0x0c000000UL
|
||||
#define SBAL_FLAGS_LAST_ENTRY 0x40000000UL
|
||||
#define SBAL_FLAGS_CONTIGUOUS 0x20000000UL
|
||||
|
||||
#define SBAL_FLAGS0_DATA_CONTINUATION 0x20UL
|
||||
#define SBAL_SFLAGS0_PCI_REQ 0x40
|
||||
#define SBAL_SFLAGS0_DATA_CONTINUATION 0x20
|
||||
|
||||
/* Awesome OpenFCP extensions */
|
||||
#define SBAL_FLAGS0_TYPE_STATUS 0x00UL
|
||||
#define SBAL_FLAGS0_TYPE_WRITE 0x08UL
|
||||
#define SBAL_FLAGS0_TYPE_READ 0x10UL
|
||||
#define SBAL_FLAGS0_TYPE_WRITE_READ 0x18UL
|
||||
#define SBAL_FLAGS0_MORE_SBALS 0x04UL
|
||||
#define SBAL_FLAGS0_COMMAND 0x02UL
|
||||
#define SBAL_FLAGS0_LAST_SBAL 0x00UL
|
||||
#define SBAL_FLAGS0_ONLY_SBAL SBAL_FLAGS0_COMMAND
|
||||
#define SBAL_FLAGS0_MIDDLE_SBAL SBAL_FLAGS0_MORE_SBALS
|
||||
#define SBAL_FLAGS0_FIRST_SBAL SBAL_FLAGS0_MORE_SBALS | SBAL_FLAGS0_COMMAND
|
||||
#define SBAL_FLAGS0_PCI 0x40
|
||||
|
||||
/**
|
||||
* struct sbal_sbalf_0 - sbal flags for sbale 0
|
||||
* @pci: PCI indicator
|
||||
* @cont: data continuation
|
||||
* @sbtype: storage-block type (FCP)
|
||||
*/
|
||||
struct sbal_sbalf_0 {
|
||||
u8 : 1;
|
||||
u8 pci : 1;
|
||||
u8 cont : 1;
|
||||
u8 sbtype : 2;
|
||||
u8 : 3;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct sbal_sbalf_1 - sbal flags for sbale 1
|
||||
* @key: storage key
|
||||
*/
|
||||
struct sbal_sbalf_1 {
|
||||
u8 : 4;
|
||||
u8 key : 4;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct sbal_sbalf_14 - sbal flags for sbale 14
|
||||
* @erridx: error index
|
||||
*/
|
||||
struct sbal_sbalf_14 {
|
||||
u8 : 4;
|
||||
u8 erridx : 4;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* struct sbal_sbalf_15 - sbal flags for sbale 15
|
||||
* @reason: reason for error state
|
||||
*/
|
||||
struct sbal_sbalf_15 {
|
||||
u8 reason;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/**
|
||||
* union sbal_sbalf - storage block address list flags
|
||||
* @i0: sbalf0
|
||||
* @i1: sbalf1
|
||||
* @i14: sbalf14
|
||||
* @i15: sblaf15
|
||||
* @value: raw value
|
||||
*/
|
||||
union sbal_sbalf {
|
||||
struct sbal_sbalf_0 i0;
|
||||
struct sbal_sbalf_1 i1;
|
||||
struct sbal_sbalf_14 i14;
|
||||
struct sbal_sbalf_15 i15;
|
||||
u8 value;
|
||||
};
|
||||
#define SBAL_SFLAGS0_TYPE_STATUS 0x00
|
||||
#define SBAL_SFLAGS0_TYPE_WRITE 0x08
|
||||
#define SBAL_SFLAGS0_TYPE_READ 0x10
|
||||
#define SBAL_SFLAGS0_TYPE_WRITE_READ 0x18
|
||||
#define SBAL_SFLAGS0_MORE_SBALS 0x04
|
||||
#define SBAL_SFLAGS0_COMMAND 0x02
|
||||
#define SBAL_SFLAGS0_LAST_SBAL 0x00
|
||||
#define SBAL_SFLAGS0_ONLY_SBAL SBAL_SFLAGS0_COMMAND
|
||||
#define SBAL_SFLAGS0_MIDDLE_SBAL SBAL_SFLAGS0_MORE_SBALS
|
||||
#define SBAL_SFLAGS0_FIRST_SBAL (SBAL_SFLAGS0_MORE_SBALS | SBAL_SFLAGS0_COMMAND)
|
||||
|
||||
/**
|
||||
* struct qdio_buffer_element - SBAL entry
|
||||
* @flags: flags
|
||||
* @eflags: SBAL entry flags
|
||||
* @scount: SBAL count
|
||||
* @sflags: whole SBAL flags
|
||||
* @length: length
|
||||
* @addr: address
|
||||
*/
|
||||
struct qdio_buffer_element {
|
||||
u32 flags;
|
||||
u8 eflags;
|
||||
/* private: */
|
||||
u8 res1;
|
||||
/* public: */
|
||||
u8 scount;
|
||||
u8 sflags;
|
||||
u32 length;
|
||||
#ifdef CONFIG_32BIT
|
||||
/* private: */
|
||||
void *reserved;
|
||||
void *res2;
|
||||
/* public: */
|
||||
#endif
|
||||
void *addr;
|
||||
|
@ -416,7 +416,7 @@ static void process_buffer_error(struct qdio_q *q, int count)
|
||||
|
||||
/* special handling for no target buffer empty */
|
||||
if ((!q->is_input_q &&
|
||||
(q->sbal[q->first_to_check]->element[15].flags & 0xff) == 0x10)) {
|
||||
(q->sbal[q->first_to_check]->element[15].sflags) == 0x10)) {
|
||||
qperf_inc(q, target_full);
|
||||
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, "OUTFULL FTC:%02x",
|
||||
q->first_to_check);
|
||||
@ -427,8 +427,8 @@ static void process_buffer_error(struct qdio_q *q, int count)
|
||||
DBF_ERROR((q->is_input_q) ? "IN:%2d" : "OUT:%2d", q->nr);
|
||||
DBF_ERROR("FTC:%3d C:%3d", q->first_to_check, count);
|
||||
DBF_ERROR("F14:%2x F15:%2x",
|
||||
q->sbal[q->first_to_check]->element[14].flags & 0xff,
|
||||
q->sbal[q->first_to_check]->element[15].flags & 0xff);
|
||||
q->sbal[q->first_to_check]->element[14].sflags,
|
||||
q->sbal[q->first_to_check]->element[15].sflags);
|
||||
|
||||
/*
|
||||
* Interrupts may be avoided as long as the error is present
|
||||
|
@ -361,7 +361,7 @@ enum qeth_header_ids {
|
||||
|
||||
static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
|
||||
{
|
||||
return (sbale->flags & SBAL_FLAGS_LAST_ENTRY);
|
||||
return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);
|
||||
}
|
||||
|
||||
enum qeth_qdio_buffer_states {
|
||||
|
@ -890,7 +890,7 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
|
||||
struct sk_buff *skb;
|
||||
|
||||
/* is PCI flag set on buffer? */
|
||||
if (buf->buffer->element[0].flags & 0x40)
|
||||
if (buf->buffer->element[0].sflags & SBAL_SFLAGS0_PCI_REQ)
|
||||
atomic_dec(&queue->set_pci_flags_count);
|
||||
|
||||
skb = skb_dequeue(&buf->skb_list);
|
||||
@ -906,9 +906,11 @@ static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue,
|
||||
buf->is_header[i] = 0;
|
||||
buf->buffer->element[i].length = 0;
|
||||
buf->buffer->element[i].addr = NULL;
|
||||
buf->buffer->element[i].flags = 0;
|
||||
buf->buffer->element[i].eflags = 0;
|
||||
buf->buffer->element[i].sflags = 0;
|
||||
}
|
||||
buf->buffer->element[15].flags = 0;
|
||||
buf->buffer->element[15].eflags = 0;
|
||||
buf->buffer->element[15].sflags = 0;
|
||||
buf->next_element_to_fill = 0;
|
||||
atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY);
|
||||
}
|
||||
@ -2368,9 +2370,10 @@ static int qeth_init_input_buffer(struct qeth_card *card,
|
||||
buf->buffer->element[i].length = PAGE_SIZE;
|
||||
buf->buffer->element[i].addr = pool_entry->elements[i];
|
||||
if (i == QETH_MAX_BUFFER_ELEMENTS(card) - 1)
|
||||
buf->buffer->element[i].flags = SBAL_FLAGS_LAST_ENTRY;
|
||||
buf->buffer->element[i].eflags = SBAL_EFLAGS_LAST_ENTRY;
|
||||
else
|
||||
buf->buffer->element[i].flags = 0;
|
||||
buf->buffer->element[i].eflags = 0;
|
||||
buf->buffer->element[i].sflags = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -2718,11 +2721,11 @@ int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
|
||||
if (qdio_error) {
|
||||
QETH_CARD_TEXT(card, 2, dbftext);
|
||||
QETH_CARD_TEXT_(card, 2, " F15=%02X",
|
||||
buf->element[15].flags & 0xff);
|
||||
buf->element[15].sflags);
|
||||
QETH_CARD_TEXT_(card, 2, " F14=%02X",
|
||||
buf->element[14].flags & 0xff);
|
||||
buf->element[14].sflags);
|
||||
QETH_CARD_TEXT_(card, 2, " qerr=%X", qdio_error);
|
||||
if ((buf->element[15].flags & 0xff) == 0x12) {
|
||||
if ((buf->element[15].sflags) == 0x12) {
|
||||
card->stats.rx_dropped++;
|
||||
return 0;
|
||||
} else
|
||||
@ -2798,7 +2801,7 @@ EXPORT_SYMBOL_GPL(qeth_queue_input_buffer);
|
||||
static int qeth_handle_send_error(struct qeth_card *card,
|
||||
struct qeth_qdio_out_buffer *buffer, unsigned int qdio_err)
|
||||
{
|
||||
int sbalf15 = buffer->buffer->element[15].flags & 0xff;
|
||||
int sbalf15 = buffer->buffer->element[15].sflags;
|
||||
|
||||
QETH_CARD_TEXT(card, 6, "hdsnderr");
|
||||
if (card->info.type == QETH_CARD_TYPE_IQD) {
|
||||
@ -2907,8 +2910,8 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
|
||||
|
||||
for (i = index; i < index + count; ++i) {
|
||||
buf = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q];
|
||||
buf->buffer->element[buf->next_element_to_fill - 1].flags |=
|
||||
SBAL_FLAGS_LAST_ENTRY;
|
||||
buf->buffer->element[buf->next_element_to_fill - 1].eflags |=
|
||||
SBAL_EFLAGS_LAST_ENTRY;
|
||||
|
||||
if (queue->card->info.type == QETH_CARD_TYPE_IQD)
|
||||
continue;
|
||||
@ -2921,7 +2924,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
|
||||
/* it's likely that we'll go to packing
|
||||
* mode soon */
|
||||
atomic_inc(&queue->set_pci_flags_count);
|
||||
buf->buffer->element[0].flags |= 0x40;
|
||||
buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
|
||||
}
|
||||
} else {
|
||||
if (!atomic_read(&queue->set_pci_flags_count)) {
|
||||
@ -2934,7 +2937,7 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index,
|
||||
* further send was requested by the stack
|
||||
*/
|
||||
atomic_inc(&queue->set_pci_flags_count);
|
||||
buf->buffer->element[0].flags |= 0x40;
|
||||
buf->buffer->element[0].sflags |= SBAL_SFLAGS0_PCI_REQ;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3180,20 +3183,20 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
|
||||
if (!length) {
|
||||
if (first_lap)
|
||||
if (skb_shinfo(skb)->nr_frags)
|
||||
buffer->element[element].flags =
|
||||
SBAL_FLAGS_FIRST_FRAG;
|
||||
buffer->element[element].eflags =
|
||||
SBAL_EFLAGS_FIRST_FRAG;
|
||||
else
|
||||
buffer->element[element].flags = 0;
|
||||
buffer->element[element].eflags = 0;
|
||||
else
|
||||
buffer->element[element].flags =
|
||||
SBAL_FLAGS_MIDDLE_FRAG;
|
||||
buffer->element[element].eflags =
|
||||
SBAL_EFLAGS_MIDDLE_FRAG;
|
||||
} else {
|
||||
if (first_lap)
|
||||
buffer->element[element].flags =
|
||||
SBAL_FLAGS_FIRST_FRAG;
|
||||
buffer->element[element].eflags =
|
||||
SBAL_EFLAGS_FIRST_FRAG;
|
||||
else
|
||||
buffer->element[element].flags =
|
||||
SBAL_FLAGS_MIDDLE_FRAG;
|
||||
buffer->element[element].eflags =
|
||||
SBAL_EFLAGS_MIDDLE_FRAG;
|
||||
}
|
||||
data += length_here;
|
||||
element++;
|
||||
@ -3205,12 +3208,12 @@ static inline void __qeth_fill_buffer(struct sk_buff *skb,
|
||||
buffer->element[element].addr = (char *)page_to_phys(frag->page)
|
||||
+ frag->page_offset;
|
||||
buffer->element[element].length = frag->size;
|
||||
buffer->element[element].flags = SBAL_FLAGS_MIDDLE_FRAG;
|
||||
buffer->element[element].eflags = SBAL_EFLAGS_MIDDLE_FRAG;
|
||||
element++;
|
||||
}
|
||||
|
||||
if (buffer->element[element - 1].flags)
|
||||
buffer->element[element - 1].flags = SBAL_FLAGS_LAST_FRAG;
|
||||
if (buffer->element[element - 1].eflags)
|
||||
buffer->element[element - 1].eflags = SBAL_EFLAGS_LAST_FRAG;
|
||||
*next_element_to_fill = element;
|
||||
}
|
||||
|
||||
@ -3234,7 +3237,7 @@ static inline int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
|
||||
/*fill first buffer entry only with header information */
|
||||
buffer->element[element].addr = skb->data;
|
||||
buffer->element[element].length = hdr_len;
|
||||
buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG;
|
||||
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
|
||||
buf->next_element_to_fill++;
|
||||
skb->data += hdr_len;
|
||||
skb->len -= hdr_len;
|
||||
@ -3246,7 +3249,7 @@ static inline int qeth_fill_buffer(struct qeth_qdio_out_q *queue,
|
||||
buffer->element[element].addr = hdr;
|
||||
buffer->element[element].length = sizeof(struct qeth_hdr) +
|
||||
hd_len;
|
||||
buffer->element[element].flags = SBAL_FLAGS_FIRST_FRAG;
|
||||
buffer->element[element].eflags = SBAL_EFLAGS_FIRST_FRAG;
|
||||
buf->is_header[element] = 1;
|
||||
buf->next_element_to_fill++;
|
||||
}
|
||||
|
@ -640,7 +640,7 @@ static struct fsf_qtcb *zfcp_qtcb_alloc(mempool_t *pool)
|
||||
}
|
||||
|
||||
static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio,
|
||||
u32 fsf_cmd, u32 sbtype,
|
||||
u32 fsf_cmd, u8 sbtype,
|
||||
mempool_t *pool)
|
||||
{
|
||||
struct zfcp_adapter *adapter = qdio->adapter;
|
||||
@ -841,7 +841,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd)
|
||||
if (zfcp_qdio_sbal_get(qdio))
|
||||
goto out;
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.scsi_abort);
|
||||
if (IS_ERR(req)) {
|
||||
req = NULL;
|
||||
@ -1012,7 +1012,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port,
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC,
|
||||
SBAL_FLAGS0_TYPE_WRITE_READ, pool);
|
||||
SBAL_SFLAGS0_TYPE_WRITE_READ, pool);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
ret = PTR_ERR(req);
|
||||
@ -1110,7 +1110,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id,
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS,
|
||||
SBAL_FLAGS0_TYPE_WRITE_READ, NULL);
|
||||
SBAL_SFLAGS0_TYPE_WRITE_READ, NULL);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
ret = PTR_ERR(req);
|
||||
@ -1156,7 +1156,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1198,7 +1198,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
|
||||
goto out_unlock;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
SBAL_FLAGS0_TYPE_READ, NULL);
|
||||
SBAL_SFLAGS0_TYPE_READ, NULL);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
retval = PTR_ERR(req);
|
||||
@ -1250,7 +1250,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1296,7 +1296,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio,
|
||||
goto out_unlock;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA,
|
||||
SBAL_FLAGS0_TYPE_READ, NULL);
|
||||
SBAL_SFLAGS0_TYPE_READ, NULL);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
retval = PTR_ERR(req);
|
||||
@ -1412,7 +1412,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1478,7 +1478,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1553,7 +1553,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1606,7 +1606,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1698,7 +1698,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1812,7 +1812,7 @@ int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -1901,7 +1901,7 @@ int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action)
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN,
|
||||
SBAL_FLAGS0_TYPE_READ,
|
||||
SBAL_SFLAGS0_TYPE_READ,
|
||||
qdio->adapter->pool.erp_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -2161,7 +2161,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
|
||||
{
|
||||
struct zfcp_fsf_req *req;
|
||||
struct fcp_cmnd *fcp_cmnd;
|
||||
unsigned int sbtype = SBAL_FLAGS0_TYPE_READ;
|
||||
u8 sbtype = SBAL_SFLAGS0_TYPE_READ;
|
||||
int real_bytes, retval = -EIO, dix_bytes = 0;
|
||||
struct scsi_device *sdev = scsi_cmnd->device;
|
||||
struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
|
||||
@ -2181,7 +2181,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd)
|
||||
}
|
||||
|
||||
if (scsi_cmnd->sc_data_direction == DMA_TO_DEVICE)
|
||||
sbtype = SBAL_FLAGS0_TYPE_WRITE;
|
||||
sbtype = SBAL_SFLAGS0_TYPE_WRITE;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
|
||||
sbtype, adapter->pool.scsi_req);
|
||||
@ -2280,7 +2280,7 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_cmnd *scmnd,
|
||||
goto out;
|
||||
|
||||
req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND,
|
||||
SBAL_FLAGS0_TYPE_WRITE,
|
||||
SBAL_SFLAGS0_TYPE_WRITE,
|
||||
qdio->adapter->pool.scsi_req);
|
||||
|
||||
if (IS_ERR(req)) {
|
||||
@ -2328,17 +2328,18 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
|
||||
struct zfcp_qdio *qdio = adapter->qdio;
|
||||
struct zfcp_fsf_req *req = NULL;
|
||||
struct fsf_qtcb_bottom_support *bottom;
|
||||
int direction, retval = -EIO, bytes;
|
||||
int retval = -EIO, bytes;
|
||||
u8 direction;
|
||||
|
||||
if (!(adapter->adapter_features & FSF_FEATURE_CFDC))
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
switch (fsf_cfdc->command) {
|
||||
case FSF_QTCB_DOWNLOAD_CONTROL_FILE:
|
||||
direction = SBAL_FLAGS0_TYPE_WRITE;
|
||||
direction = SBAL_SFLAGS0_TYPE_WRITE;
|
||||
break;
|
||||
case FSF_QTCB_UPLOAD_CONTROL_FILE:
|
||||
direction = SBAL_FLAGS0_TYPE_READ;
|
||||
direction = SBAL_SFLAGS0_TYPE_READ;
|
||||
break;
|
||||
default:
|
||||
return ERR_PTR(-EINVAL);
|
||||
@ -2413,7 +2414,7 @@ void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx)
|
||||
fsf_req->qdio_req.sbal_response = sbal_idx;
|
||||
zfcp_fsf_req_complete(fsf_req);
|
||||
|
||||
if (likely(sbale->flags & SBAL_FLAGS_LAST_ENTRY))
|
||||
if (likely(sbale->eflags & SBAL_EFLAGS_LAST_ENTRY))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -124,7 +124,7 @@ zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
|
||||
|
||||
/* set last entry flag in current SBALE of current SBAL */
|
||||
sbale = zfcp_qdio_sbale_curr(qdio, q_req);
|
||||
sbale->flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
sbale->eflags |= SBAL_EFLAGS_LAST_ENTRY;
|
||||
|
||||
/* don't exceed last allowed SBAL */
|
||||
if (q_req->sbal_last == q_req->sbal_limit)
|
||||
@ -132,7 +132,7 @@ zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
|
||||
|
||||
/* set chaining flag in first SBALE of current SBAL */
|
||||
sbale = zfcp_qdio_sbale_req(qdio, q_req);
|
||||
sbale->flags |= SBAL_FLAGS0_MORE_SBALS;
|
||||
sbale->sflags |= SBAL_SFLAGS0_MORE_SBALS;
|
||||
|
||||
/* calculate index of next SBAL */
|
||||
q_req->sbal_last++;
|
||||
@ -147,7 +147,7 @@ zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
|
||||
|
||||
/* set storage-block type for new SBAL */
|
||||
sbale = zfcp_qdio_sbale_curr(qdio, q_req);
|
||||
sbale->flags |= q_req->sbtype;
|
||||
sbale->sflags |= q_req->sbtype;
|
||||
|
||||
return sbale;
|
||||
}
|
||||
@ -177,7 +177,7 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
|
||||
|
||||
/* set storage-block type for this request */
|
||||
sbale = zfcp_qdio_sbale_req(qdio, q_req);
|
||||
sbale->flags |= q_req->sbtype;
|
||||
sbale->sflags |= q_req->sbtype;
|
||||
|
||||
for (; sg; sg = sg_next(sg)) {
|
||||
sbale = zfcp_qdio_sbale_next(qdio, q_req);
|
||||
@ -384,7 +384,8 @@ int zfcp_qdio_open(struct zfcp_qdio *qdio)
|
||||
for (cc = 0; cc < QDIO_MAX_BUFFERS_PER_Q; cc++) {
|
||||
sbale = &(qdio->res_q[cc]->element[0]);
|
||||
sbale->length = 0;
|
||||
sbale->flags = SBAL_FLAGS_LAST_ENTRY;
|
||||
sbale->eflags = SBAL_EFLAGS_LAST_ENTRY;
|
||||
sbale->sflags = 0;
|
||||
sbale->addr = NULL;
|
||||
}
|
||||
|
||||
|
@ -67,7 +67,7 @@ struct zfcp_qdio {
|
||||
* @qdio_outb_usage: usage of outbound queue
|
||||
*/
|
||||
struct zfcp_qdio_req {
|
||||
u32 sbtype;
|
||||
u8 sbtype;
|
||||
u8 sbal_number;
|
||||
u8 sbal_first;
|
||||
u8 sbal_last;
|
||||
@ -116,7 +116,7 @@ zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req)
|
||||
*/
|
||||
static inline
|
||||
void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
|
||||
unsigned long req_id, u32 sbtype, void *data, u32 len)
|
||||
unsigned long req_id, u8 sbtype, void *data, u32 len)
|
||||
{
|
||||
struct qdio_buffer_element *sbale;
|
||||
int count = min(atomic_read(&qdio->req_q_free),
|
||||
@ -131,7 +131,8 @@ void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
|
||||
|
||||
sbale = zfcp_qdio_sbale_req(qdio, q_req);
|
||||
sbale->addr = (void *) req_id;
|
||||
sbale->flags = SBAL_FLAGS0_COMMAND | sbtype;
|
||||
sbale->eflags = 0;
|
||||
sbale->sflags = SBAL_SFLAGS0_COMMAND | sbtype;
|
||||
|
||||
if (unlikely(!data))
|
||||
return;
|
||||
@ -173,7 +174,7 @@ void zfcp_qdio_set_sbale_last(struct zfcp_qdio *qdio,
|
||||
struct qdio_buffer_element *sbale;
|
||||
|
||||
sbale = zfcp_qdio_sbale_curr(qdio, q_req);
|
||||
sbale->flags |= SBAL_FLAGS_LAST_ENTRY;
|
||||
sbale->eflags |= SBAL_EFLAGS_LAST_ENTRY;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user