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