101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/* 229046f9b1e36f6e3332ce2d8e366005fd177b37aVasanthy Kolluri * Copyright 2008-2010 Cisco Systems, Inc. All rights reserved. 301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * Copyright 2007 Nuova Systems, Inc. All rights reserved. 401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * 501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * This program is free software; you may redistribute it and/or modify 601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * it under the terms of the GNU General Public License as published by 701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * the Free Software Foundation; version 2 of the License. 801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * 901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 1001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 1201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 1301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 1401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * SOFTWARE. 1701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * 1801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */ 1901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 2001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#ifndef _CQ_DESC_H_ 2101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define _CQ_DESC_H_ 2201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 2301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/* 2401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * Completion queue descriptor types 2501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */ 2601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanenum cq_desc_types { 2701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_TYPE_WQ_ENET = 0, 2801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_TYPE_DESC_COPY = 1, 2901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_TYPE_WQ_EXCH = 2, 3001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_TYPE_RQ_ENET = 3, 3101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_TYPE_RQ_FCP = 4, 3201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}; 3301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 3401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman/* Completion queue descriptor: 16B 3501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * 3601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * All completion queues have this basic layout. The 3701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * type_specfic area is unique for each completion 3801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * queue type. 3901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */ 4001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanstruct cq_desc { 4101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman __le16 completed_index; 4201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman __le16 q_number; 4301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman u8 type_specfic[11]; 4401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman u8 type_color; 4501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman}; 4601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 47cb3c766975985885e64e20cc72c4a36d90da2b30Scott Feldman#define CQ_DESC_TYPE_BITS 4 4801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_TYPE_MASK ((1 << CQ_DESC_TYPE_BITS) - 1) 4901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_COLOR_MASK 1 50cb3c766975985885e64e20cc72c4a36d90da2b30Scott Feldman#define CQ_DESC_COLOR_SHIFT 7 5101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_Q_NUM_BITS 10 5201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_Q_NUM_MASK ((1 << CQ_DESC_Q_NUM_BITS) - 1) 5301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_COMP_NDX_BITS 12 5401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#define CQ_DESC_COMP_NDX_MASK ((1 << CQ_DESC_COMP_NDX_BITS) - 1) 5501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 5601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldmanstatic inline void cq_desc_dec(const struct cq_desc *desc_arg, 5701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman u8 *type, u8 *color, u16 *q_number, u16 *completed_index) 5801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman{ 5901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman const struct cq_desc *desc = desc_arg; 6001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman const u8 type_color = desc->type_color; 6101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 62cb3c766975985885e64e20cc72c4a36d90da2b30Scott Feldman *color = (type_color >> CQ_DESC_COLOR_SHIFT) & CQ_DESC_COLOR_MASK; 6301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 6401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman /* 6501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * Make sure color bit is read from desc *before* other fields 6601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * are read from desc. Hardware guarantees color bit is last 6701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * bit (byte) written. Adding the rmb() prevents the compiler 6801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * and/or CPU from reordering the reads which would potentially 6901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman * result in reading stale values. 7001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman */ 7101f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 7201f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman rmb(); 7301f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 7401f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *type = type_color & CQ_DESC_TYPE_MASK; 7501f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *q_number = le16_to_cpu(desc->q_number) & CQ_DESC_Q_NUM_MASK; 7601f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman *completed_index = le16_to_cpu(desc->completed_index) & 7701f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman CQ_DESC_COMP_NDX_MASK; 7801f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman} 7901f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman 8001f2e4ead2c51226ed1283ef6a8388ca6f4cff8fScott Feldman#endif /* _CQ_DESC_H_ */ 81