1 #define CLEAR_PD pd->dsf = 0; \
6 #define WRITE_BUF_DBG 0
7 #define WRITE_BUF_DEBUG_MSG(x...)\
8 if (WRITE_BUF_DBG) DEBUG_MSG(x)
9 #define WR_DBG WRITE_BUF_DEBUG_MSG
10 #define repeate_WRITE 10
12 int write_buf(int link
, rdma_ioc_parm_t
*parm
, unsigned int f_flags
)
14 rdma_state_link_t
*rdma_link
;
15 rdma_pool_buf_t
*w_pool_buf
;
16 dev_rdma_sem_t
*dev_sem
;
17 struct stat_rdma
*pst
;
22 signed long io_timeout
= 0;
23 unsigned int sending_msg
;
24 int ret_time_dwait
= 0;
31 rdma_link
= &rdma_state
->rdma_link
[link
];
32 w_pool_buf
= &rdma_link
->write_pool
;
33 w_buf
= &w_pool_buf
->buf
[num
];
34 pd
= &rdma_link
->rw_states_d
[WRITER
];
35 pst
= &rdma_link
->stat_rdma
;
36 dev_sem
= &pd
->dev_rdma_sem
;
37 dev_sem
->time_broadcast
= 0;
38 WR_DBG("%s: link: %d num buf: %d size: 0x%016lx\n", __FUNCTION__
, link
,
40 event_write(link
, WRITE_1_EVENT
, size
, dev_sem
->num_obmen
);
41 raw_spin_lock_irqsave(&dev_sem
->lock
, flags
);
44 * Receive's buffer busy
46 if ((!pd
->trwd_was
) && ( f_flags
& O_NONBLOCK
)) {
47 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
48 parm
->err_no
= RDMA_E_NULL_BUFFER
;
49 event_write(link
, WRITE_0_EVENT
, 0, dev_sem
->num_obmen
);
56 if (dev_sem
->timeout
== 0) {
57 io_timeout
= IO_TIMEOUT
;
59 io_timeout
= dev_sem
->timeout
* HZ
;
62 * Waiting for the release receive buffer.
63 * Wake up by MSG_READY_DMA.
66 ret_time_dwait
= wait_for_irq_rdma_sem(dev_sem
, io_timeout
, link
);
67 if (dev_sem
->irq_count_rdma
!= 1) {
68 ERROR_MSG("%s: link: %d MSG wait_1 bad irq "
69 "dev_sem->irq_count_rdma: 0x%08x\n",
70 __FUNCTION__
, link
, dev_sem
->irq_count_rdma
);
71 dev_sem
->irq_count_rdma
= 0;
75 dev_sem
->irq_count_rdma
= 0;
77 if (ret_time_dwait
< 0) {
79 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
80 WR_DBG("%s: link: %d ret_time_dwait: %d\n", __FUNCTION__
,
81 link
, ret_time_dwait
);
82 event_write(link
, WRITE_BAD1_EVENT
,
83 -ret_time_dwait
, dev_sem
->num_obmen
);
84 switch (ret_time_dwait
) {
86 ERROR_MSG("%s: link: %d MSG RDMA_E_WRITE_TIMEOUT num_obmen: 0x%08x\n",
87 __FUNCTION__
, link
, dev_sem
->num_obmen
);
88 parm
->err_no
= RDMA_E_WRITE_TIMEOUT
;
93 ERROR_MSG("%s: link: %d MSG RDMA_E_SIGNAL num_obmen: 0x%08x\n",
94 __FUNCTION__
, link
, dev_sem
->num_obmen
);
95 parm
->err_no
= RDMA_E_SIGNAL
;
99 ERROR_MSG("%s: link: %d MSG RDMA_E_SPIN num_obmen: 0x%08x\n",
100 __FUNCTION__
, link
, dev_sem
->num_obmen
);
101 parm
->err_no
= RDMA_E_SPIN
;
106 goto exit_err_wr_buf
;
110 * Programming dma (enable send TRWD)
112 if (size
> w_buf
->size
) {
113 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
114 ERROR_MSG("%s: link: %d RDMA_E_SIZE size(0x%016lx) > w_buf->size(0x%016lx)\n",
115 __FUNCTION__
, link
, size
, w_buf
->size
);
116 parm
->err_no
= RDMA_E_SIZE
;
118 goto exit_err_wr_buf
;
120 if (size
> SMALL_CHANGE
) {
121 pd
->size_trans
= (w_pool_buf
->tm_mode
?
122 ALIGN(size
, (rdma_link
->align_buf_tm
* PAGE_SIZE
)) : allign_dma(size
));
124 pd
->size_trans
= allign_dma(size
);
126 WR_DBG("%s: link: %d : pd->size_trans: 0x%08x\n", __FUNCTION__
, link
,
131 sending_msg
= MSG_TRWD
| size
;
133 * Send TRWD. ðÏÄÕÍÁÔØ ËÏÇÄÁ ÏÔÐÒÁ×ÌÅÎÏ, ÎÏ READY ÎÅ ÐÏÌÕÞÅÎÏ
136 if ((ret_smsg
= send_msg_check(sending_msg
, link
, 0, dev_sem
, 0)) > 0) {
137 event_write(link
, WRITE_SNDNGMSG_EVENT
, ret_smsg
, dev_sem
->num_obmen
);
140 event_write(link
, WRITE_SNDMSGBAD_EVENT
, ret_smsg
, dev_sem
->num_obmen
);
141 //raw_spin_unlock_irqrestore(&dev_sem->lock, flags);
145 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
146 ERROR_MSG("%s: link: %d RDMA_E_MSF_WRD error send TRWD: %d\n",
147 __FUNCTION__
, link
, ret_smsg
);
148 parm
->err_no
= RDMA_E_MSF_WRD
;
152 goto exit_err_wr_buf
;
156 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
157 ERROR_MSG("%s: link: %d RDMA_E_TIMER_MAX error send TRWD: %d\n",
158 __FUNCTION__
, link
, ret_smsg
);
159 parm
->err_no
= RDMA_E_TIMER_MAX
;
160 parm
->acclen
= count_read_sm_max
;
164 goto exit_err_wr_buf
;
167 dev_sem
->num_obmen
++;
171 * Wait end dma. Wake up TDC. ôÁÊÍÁÕÔ ÐÏÒÑÄËÁ ~2 ÓÅËÕÎÄ. ô.Ë. TRWD
172 * ÏÔÐÒÁ×ÌÑÅÔÓÑ ÔÏÌØËÏ ÐÒÉ ÎÁÌÉÞÉÉ Ó×ÏÂÏÄÎÏÇÏ ÂÕÆÅÒÁ ÎÁ ÐÒÉÅÍÎÏÊ
173 * ÓÔÏÒÏÎÅ É ÏÂÍÅÎ ÐÒÏÈÏÄÉÔ ÂÅÚ ÐÅÒÅÈÏÄÁ × ÐÏÌØÚÏ×ÁÔÅÌØÓËÉÊ ËÏÎÔÅËÓÔ,
174 * ÔÏ ×ÒÅÍÑ ÐÒÏÂÕÖÄÅÎÉÑ ÎÅ ÄÏÌÖÎÏ ÐÒÅ×ÙÛÁÔØ ÓÕÍÍÙ ×ÒÅÍÅÎ Ä×ÕÈ
175 * ÐÒÅÒÙ×ÁÎÉÊ, ×ÒÅÍÅÎÉ ÐÅÒÅÄÁÞÉ Ä×ÕÈ ÓÏÏÂÝÅÎÉÊ É ×ÒÅÍÅÎÉ ÎÁ ÐÅÒÅÄÁÞÕ
178 int timeout_wait_write_dma
;
179 //timeout_wait_write_dma = TIME_OUT_WAIT_WR + (pd->size_trans >> SHIFT_TO);
180 timeout_wait_write_dma
= TIME_OUT_WAIT_WR_SEC
* HZ
;
181 ret_time_dwait
= wait_for_irq_rdma_sem(dev_sem
, (signed long)timeout_wait_write_dma
,
183 if (dev_sem
->irq_count_rdma
!= 1) {
184 ERROR_MSG("%s: link: %d MSG wait_2 bad irq "
185 "dev_sem->irq_count_rdma: 0x%08x\n",
186 __FUNCTION__
, link
, dev_sem
->irq_count_rdma
);
187 dev_sem
->irq_count_rdma
= 0;
191 dev_sem
->irq_count_rdma
= 0;
193 if (ret_time_dwait
< 0) {
196 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
197 event_write(link
, WRITE_BAD2_EVENT
, -ret_time_dwait
,
199 switch (ret_time_dwait
) {
201 ERROR_MSG("%s: link: %d DMA RDMA_E_TIMER_IO num_obmen: 0x%08x\n",
202 __FUNCTION__
, link
, dev_sem
->num_obmen
);
203 parm
->err_no
= RDMA_E_TIMER_IO
;
207 ERROR_MSG("%s: link: %d DMA RDMA_E_SIGNAL num_obmen: 0x%08x\n",
208 __FUNCTION__
, link
, dev_sem
->num_obmen
);
209 parm
->err_no
= RDMA_E_SIGNAL
;
213 ERROR_MSG("%s: link: %d DMA RDMA_E_SPIN num_obmen: 0x%08x\n",
214 __FUNCTION__
, link
, dev_sem
->num_obmen
);
215 parm
->err_no
= RDMA_E_SPIN
;
220 goto exit_err_wr_buf
;
223 raw_spin_unlock_irqrestore(&dev_sem
->lock
, flags
);
225 WR_DBG("%s: link: %d size: 0x%016lx tdc OK\n", __FUNCTION__
, link
, size
);
226 parm
->err_no
= RDMA_E_SUCCESS
;
229 event_write(link
, WRITE_0_EVENT
, ret
, dev_sem
->num_obmen
);