Blame view

drivers/scsi/snic/cq_desc.h 2.39 KB
c8806b6c9   Narsimhulu Musini   snic: driver for ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  /*
   * Copyright 2014 Cisco Systems, Inc.  All rights reserved.
   *
   * This program is free software; you may redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; version 2 of the License.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
   * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
   * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
   * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
   * SOFTWARE.
   */
  
  #ifndef _CQ_DESC_H_
  #define _CQ_DESC_H_
  
  /*
   * Completion queue descriptor types
   */
  enum cq_desc_types {
  	CQ_DESC_TYPE_WQ_ENET = 0,
  	CQ_DESC_TYPE_DESC_COPY = 1,
  	CQ_DESC_TYPE_WQ_EXCH = 2,
  	CQ_DESC_TYPE_RQ_ENET = 3,
  	CQ_DESC_TYPE_RQ_FCP = 4,
  };
  
  /* Completion queue descriptor: 16B
   *
   * All completion queues have this basic layout.  The
   * type_specific area is unique for each completion
   * queue type.
   */
  struct cq_desc {
  	__le16 completed_index;
  	__le16 q_number;
  	u8 type_specific[11];
  	u8 type_color;
  };
  
  #define CQ_DESC_TYPE_BITS        4
  #define CQ_DESC_TYPE_MASK        ((1 << CQ_DESC_TYPE_BITS) - 1)
  #define CQ_DESC_COLOR_MASK       1
  #define CQ_DESC_COLOR_SHIFT      7
  #define CQ_DESC_Q_NUM_BITS       10
  #define CQ_DESC_Q_NUM_MASK       ((1 << CQ_DESC_Q_NUM_BITS) - 1)
  #define CQ_DESC_COMP_NDX_BITS    12
  #define CQ_DESC_COMP_NDX_MASK    ((1 << CQ_DESC_COMP_NDX_BITS) - 1)
  
  static inline void cq_desc_dec(const struct cq_desc *desc_arg,
  	u8 *type, u8 *color, u16 *q_number, u16 *completed_index)
  {
  	const struct cq_desc *desc = desc_arg;
  	const u8 type_color = desc->type_color;
  
  	*color = (type_color >> CQ_DESC_COLOR_SHIFT) & CQ_DESC_COLOR_MASK;
  
  	/*
  	 * Make sure color bit is read from desc *before* other fields
  	 * are read from desc.  Hardware guarantees color bit is last
  	 * bit (byte) written.  Adding the rmb() prevents the compiler
  	 * and/or CPU from reordering the reads which would potentially
  	 * result in reading stale values.
  	 */
  	rmb();
  
  	*type = type_color & CQ_DESC_TYPE_MASK;
  	*q_number = le16_to_cpu(desc->q_number) & CQ_DESC_Q_NUM_MASK;
  	*completed_index = le16_to_cpu(desc->completed_index) &
  		CQ_DESC_COMP_NDX_MASK;
  }
  
  #endif /* _CQ_DESC_H_ */