Commit 3ec90878 authored by Jan Glauber's avatar Jan Glauber Committed by Martin Schwidefsky

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