2 #define READ_BUF_DEBUG_MSG(x...)\
3 if (READ_BUF_DBG) DEBUG_MSG(x)
4 #define RD_DBG READ_BUF_DEBUG_MSG
6 int read_buf(int link
, rdma_ioc_parm_t
*parm
, unsigned int f_flags
)
8 rdma_state_link_t
*rdma_link
;
9 rdma_pool_buf_t
*r_pool_buf
;
10 dev_rdma_sem_t
*dev_sem
;
11 struct stat_rdma
*pst
;
14 unsigned long flags
, flags_r
;
15 signed long io_timeout
= 0;
16 int ret_time_dwait
= 0, int_ac
;
19 rdma_link
= &rdma_state
->rdma_link
[link
];
20 r_pool_buf
= &rdma_link
->read_pool
;
21 pd
= &rdma_link
->rw_states_d
[READER
];
22 pst
= &rdma_link
->stat_rdma
;
24 dev_sem
= &pd
->dev_rdma_sem
;
25 dev_sem
->time_broadcast
= 0;
27 RD_DBG("%s: link: %d size: 0x%016lx\n", __FUNCTION__
, link
, size
);
28 dev_sem
= &pd
->dev_rdma_sem
;
29 raw_spin_lock_irqsave(&dev_sem
->lock
, flags
);
30 event_read(link
, READ_1_EVENT
, size
, dev_sem
->num_obmen
);
35 if (size
> r_pool_buf
->buf_size
) {
36 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
37 fix_event(link
, READ_BADSIZE_EVENT
, size
, dev_sem
->num_obmen
);
38 fix_event(link
, READ_BADSIZE_EVENT
, r_pool_buf
->buf_size
,
40 ERROR_MSG("%s: link: %d RDMA_E_SIZE int_ac: %d "
41 "num_obmen: 0x%08x size(0x%016lx) > r_pool_buf->buf_size(0x%016lx)\n",
42 __FUNCTION__
, link
, pd
->int_ac
, dev_sem
->num_obmen
,
43 size
, r_pool_buf
->buf_size
);
44 parm
->err_no
= RDMA_E_SIZE
;
52 raw_spin_lock_irqsave(&pd
->lock_rd
, flags_r
);
53 if (list_empty(&r_pool_buf
->busy_list
)) {
54 raw_spin_unlock_irqrestore(&pd
->lock_rd
, flags_r
);
55 if ( f_flags
& O_NONBLOCK
) {
56 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
57 parm
->err_no
= RDMA_E_NULL_BUFFER
;
65 if (dev_sem
->timeout
== 0) {
66 io_timeout
= IO_TIMEOUT
;
68 io_timeout
= dev_sem
->timeout
* HZ
;
71 * Flag on sleep for rdma_cv_broadcast_rdma. Wait RDC.
74 event_read(link
, READ_1_EVENT
, pd
->int_ac
, raw_smp_processor_id());
75 ret_time_dwait
= wait_for_irq_rdma_sem(dev_sem
, io_timeout
, link
);
76 if (dev_sem
->irq_count_rdma
!= 1) {
79 ERROR_MSG("%s: link: %d MSG Bad irq dev_sem->irq_count_rdma: 0x%08x\n",
80 __FUNCTION__
, link
, dev_sem
->irq_count_rdma
);
81 dev_sem
->irq_count_rdma
= 0;
83 dev_sem
->irq_count_rdma
= 0;
85 RD_DBG("%s: link: %d ret_time_dwait: %d\n", __FUNCTION__
,
86 link
, ret_time_dwait
);
88 if (ret_time_dwait
< 0) {
90 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
91 event_read(link
, READ_BAD1_EVENT
, ret_time_dwait
,
93 switch (ret_time_dwait
) {
95 ERROR_MSG("%s: link: %d RDMA_E_READ_TIMEOUT: "
96 "int_ac: %d num_obmen: 0x%08x\n",
97 __FUNCTION__
, link
, int_ac
,
99 parm
->err_no
= RDMA_E_READ_TIMEOUT
;
103 ERROR_MSG("%s: link: %d RDMA_E_SIGNAL: "
104 "int_ac: %d num_obmen: 0x%08x\n",
105 __FUNCTION__
, link
, int_ac
,
107 parm
->err_no
= RDMA_E_SIGNAL
;
111 ERROR_MSG("%s: link: %d RDMA_E_RD_1_ERR: %d\n",
112 __FUNCTION__
, link
, -ret_time_dwait
);
113 parm
->err_no
= RDMA_E_RD_1_ERR
;
122 raw_spin_unlock_irqrestore(&pd
->lock_rd
, flags_r
);
124 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
125 RD_DBG("%s: link: %d size: 0x%016lx READ OK\n", __FUNCTION__
, link
, size
);
126 parm
->err_no
= RDMA_E_SUCCESS
;
129 event_read(link
, READ_00_EVENT
, ret
, dev_sem
->num_obmen
);