Date: | 2011-06-18 08:49:23 (12 years 9 months ago) |
---|---|
Author: | Werner Almesberger |
Commit: | 865150344f379e5bb5840f3f490f5b577d16c0e5 |
Message: | at86rf230.c: synchronized with latest changes from linux-zigbee |
Files: |
drivers/ieee802154/at86rf230.c (10 diffs) |
Change Details
drivers/ieee802154/at86rf230.c | ||
---|---|---|
208 | 208 | .len = 2, |
209 | 209 | .tx_buf = buf, |
210 | 210 | .rx_buf = buf, |
211 | ||
211 | }; | |
212 | struct spi_transfer xfer_head1 = { | |
213 | .len = 2, | |
214 | .tx_buf = buf, | |
215 | .rx_buf = buf, | |
212 | 216 | }; |
213 | 217 | struct spi_transfer xfer_buf = { |
214 | .len = *len, | |
218 | .len = 0, | |
215 | 219 | .rx_buf = data, |
216 | 220 | }; |
217 | 221 | |
218 | 222 | mutex_lock(&lp->bmux); |
223 | ||
219 | 224 | buf[0] = CMD_FB; |
220 | 225 | buf[1] = 0x00; |
221 | 226 | |
222 | dev_vdbg(&lp->spi->dev, "buf[0] = %02x\n", buf[0]); | |
223 | dev_vdbg(&lp->spi->dev, "buf[1] = %02x\n", buf[1]); | |
224 | ||
225 | 227 | spi_message_init(&msg); |
226 | 228 | spi_message_add_tail(&xfer_head, &msg); |
227 | spi_message_add_tail(&xfer_buf, &msg); | |
228 | 229 | |
229 | 230 | status = spi_sync(lp->spi, &msg); |
230 | 231 | dev_vdbg(&lp->spi->dev, "status = %d\n", status); |
232 | ||
233 | xfer_buf.len = *(buf + 1) + 1; | |
234 | *len = buf[1]; | |
235 | ||
236 | buf[0] = CMD_FB; | |
237 | buf[1] = 0x00; | |
238 | ||
239 | spi_message_init(&msg); | |
240 | spi_message_add_tail(&xfer_head1, &msg); | |
241 | spi_message_add_tail(&xfer_buf, &msg); | |
242 | ||
243 | status = spi_sync(lp->spi, &msg); | |
244 | ||
231 | 245 | if (msg.status) |
232 | 246 | status = msg.status; |
233 | 247 | dev_vdbg(&lp->spi->dev, "status = %d\n", status); |
... | ... | |
237 | 251 | if (!status) { |
238 | 252 | if (lqi && *len > lp->buf[1]) |
239 | 253 | *lqi = data[lp->buf[1]]; |
240 | ||
241 | *len = lp->buf[1]; | |
242 | 254 | } |
243 | 255 | |
244 | 256 | mutex_unlock(&lp->bmux); |
... | ... | |
257 | 269 | } |
258 | 270 | |
259 | 271 | static int |
260 | at86rf230_state(struct ieee802154_dev *dev, int cmd, int state) | |
272 | at86rf230_state(struct ieee802154_dev *dev, int state) | |
261 | 273 | { |
262 | 274 | struct at86rf230_local *lp = dev->priv; |
263 | 275 | int rc; |
264 | 276 | u8 val; |
277 | u8 desired_status; | |
265 | 278 | |
266 | 279 | pr_debug("%s %d\n", __func__/*, priv->cur_state*/, state); |
267 | 280 | might_sleep(); |
268 | 281 | |
282 | if (state == STATE_FORCE_TX_ON) | |
283 | desired_status = STATE_TX_ON; | |
284 | else if (state == STATE_FORCE_TRX_OFF) | |
285 | desired_status = STATE_TRX_OFF; | |
286 | else | |
287 | desired_status = state; | |
288 | ||
269 | 289 | do { |
270 | 290 | rc = at86rf230_read_subreg(lp, SR_TRX_STATUS, &val); |
271 | 291 | if (rc) |
... | ... | |
273 | 293 | pr_debug("%s val1 = %x\n", __func__, val); |
274 | 294 | } while (val == STATE_TRANSITION_IN_PROGRESS); |
275 | 295 | |
276 | if (val == state) | |
296 | if (val == desired_status) | |
277 | 297 | return 0; |
278 | 298 | |
279 | /* state is equal to phy states, except for "forced" transitions */ | |
280 | rc = at86rf230_write_subreg(lp, SR_TRX_CMD, cmd); | |
299 | /* state is equal to phy states */ | |
300 | rc = at86rf230_write_subreg(lp, SR_TRX_CMD, state); | |
281 | 301 | if (rc) |
282 | 302 | goto err; |
283 | 303 | |
... | ... | |
288 | 308 | pr_debug("%s val2 = %x\n", __func__, val); |
289 | 309 | } while (val == STATE_TRANSITION_IN_PROGRESS); |
290 | 310 | |
291 | if (val == state) | |
311 | ||
312 | if (val == desired_status) | |
292 | 313 | return 0; |
293 | 314 | |
315 | pr_err("%s unexpected state change: %d, asked for %d\n", __func__, | |
316 | val, state); | |
294 | 317 | return -EBUSY; |
295 | 318 | |
296 | 319 | err: |
... | ... | |
301 | 324 | static int |
302 | 325 | at86rf230_start(struct ieee802154_dev *dev) |
303 | 326 | { |
304 | return at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON); | |
327 | struct at86rf230_local *lp = dev->priv; | |
328 | u8 rc; | |
329 | ||
330 | rc = at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1); | |
331 | if (rc) | |
332 | return rc; | |
333 | return at86rf230_state(dev, STATE_RX_ON); | |
305 | 334 | } |
306 | 335 | |
307 | 336 | static void |
308 | 337 | at86rf230_stop(struct ieee802154_dev *dev) |
309 | 338 | { |
310 | at86rf230_state(dev, STATE_FORCE_TRX_OFF, STATE_TRX_OFF); | |
339 | at86rf230_state(dev, STATE_FORCE_TRX_OFF); | |
311 | 340 | } |
312 | 341 | |
313 | 342 | static int |
... | ... | |
334 | 363 | at86rf230_xmit(struct ieee802154_dev *dev, struct sk_buff *skb) |
335 | 364 | { |
336 | 365 | struct at86rf230_local *lp = dev->priv; |
337 | int rc; | |
366 | int rc, rc2; | |
338 | 367 | |
339 | 368 | pr_debug("%s\n", __func__); |
340 | 369 | |
341 | 370 | might_sleep(); |
342 | 371 | |
343 | 372 | BUG_ON(lp->is_tx); |
344 | ||
345 | 373 | INIT_COMPLETION(lp->tx_complete); |
346 | 374 | |
347 | rc = at86rf230_state(dev, STATE_FORCE_TX_ON, STATE_TX_ON); | |
375 | rc = at86rf230_state(dev, STATE_FORCE_TX_ON); | |
348 | 376 | if (rc) |
349 | 377 | goto err; |
350 | 378 | |
... | ... | |
369 | 397 | |
370 | 398 | rc = wait_for_completion_interruptible(&lp->tx_complete); |
371 | 399 | if (rc < 0) |
372 | at86rf230_state(dev, STATE_FORCE_TX_ON, STATE_TX_ON); | |
400 | at86rf230_state(dev, STATE_FORCE_TX_ON); | |
373 | 401 | |
374 | 402 | err_rx: |
375 | at86rf230_state(dev, STATE_RX_ON, STATE_RX_ON); | |
403 | rc2 = at86rf230_start(dev); | |
404 | if (!rc) | |
405 | rc = rc2; | |
376 | 406 | err: |
407 | if (rc) | |
408 | pr_err("%s error: %d\n", __func__, rc); | |
377 | 409 | lp->is_tx = 0; |
378 | 410 | |
379 | 411 | return rc; |
... | ... | |
381 | 413 | |
382 | 414 | static int at86rf230_rx(struct at86rf230_local *lp) |
383 | 415 | { |
384 | u8 len = 128; | |
385 | u8 lqi = 0; | |
416 | u8 len = 128, lqi = 0; | |
386 | 417 | int rc; |
387 | 418 | struct sk_buff *skb; |
388 | 419 | |
... | ... | |
390 | 421 | if (!skb) |
391 | 422 | return -ENOMEM; |
392 | 423 | |
424 | /* FIXME: process return status */ | |
425 | rc = at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 1); | |
393 | 426 | rc = at86rf230_read_fbuf(lp, skb_put(skb, len), &len, &lqi); |
394 | if (len < 2) { | |
395 | kfree_skb(skb); | |
396 | return -EINVAL; | |
397 | } | |
427 | rc = at86rf230_write_subreg(lp, SR_RX_SAFE_MODE, 1); | |
428 | rc = at86rf230_write_subreg(lp, SR_RX_PDT_DIS, 0); | |
429 | ||
430 | if (len < 2) | |
431 | goto err; | |
398 | 432 | |
399 | 433 | skb_trim(skb, len-2); /* We do not put CRC into the frame */ |
400 | 434 | |
401 | if (len < 2) { | |
402 | kfree_skb(skb); | |
403 | return -EINVAL; | |
404 | } | |
405 | 435 | |
406 | 436 | ieee802154_rx_irqsafe(lp->dev, skb, lqi); |
407 | 437 | |
408 | 438 | dev_dbg(&lp->spi->dev, "READ_FBUF: %d %d %x\n", rc, len, lqi); |
409 | 439 | |
410 | 440 | return 0; |
441 | err: | |
442 | pr_debug("%s: received frame is too small\n", __func__); | |
443 | ||
444 | kfree_skb(skb); | |
445 | return -EINVAL; | |
411 | 446 | } |
412 | 447 | |
413 | 448 | static struct ieee802154_ops at86rf230_ops = { |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9