aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc/llcp
diff options
context:
space:
mode:
authorThierry Escande <thierry.escande@linux.intel.com>2012-10-17 08:43:39 -0400
committerSamuel Ortiz <sameo@linux.intel.com>2012-10-28 19:25:11 -0400
commit52feb444a90304eb13c03115bb9758101dbb9254 (patch)
tree6cf939501bc6c51d46649a51d8cd45c3e9dea015 /net/nfc/llcp
parentf31652a58bee6ef145c066c8d0ae6d0b11dca1e8 (diff)
NFC: Extend netlink interface for LTO, RW, and MIUX parameters support
NFC_CMD_LLC_GET_PARAMS: request LTO, RW, and MIUX parameters for a device NFC_CMD_LLC_SET_PARAMS: set one or more of LTO, RW, and MIUX parameters for a device. LTO must be set before the link is up otherwise -EINPROGRESS is returned. RW and MIUX can be set at anytime and will be passed in subsequent CONNECT and CC messages. If one of the passed parameters is wrong none is set and -EINVAL is returned. Signed-off-by: Thierry Escande <thierry.escande@linux.intel.com> Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc/llcp')
-rw-r--r--net/nfc/llcp/commands.c18
-rw-r--r--net/nfc/llcp/llcp.c14
-rw-r--r--net/nfc/llcp/llcp.h3
3 files changed, 16 insertions, 19 deletions
diff --git a/net/nfc/llcp/commands.c b/net/nfc/llcp/commands.c
index 79415353cc28..ed2d17312d61 100644
--- a/net/nfc/llcp/commands.c
+++ b/net/nfc/llcp/commands.c
@@ -316,8 +316,7 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
316 struct sk_buff *skb; 316 struct sk_buff *skb;
317 u8 *service_name_tlv = NULL, service_name_tlv_length; 317 u8 *service_name_tlv = NULL, service_name_tlv_length;
318 u8 *miux_tlv = NULL, miux_tlv_length; 318 u8 *miux_tlv = NULL, miux_tlv_length;
319 u8 *rw_tlv = NULL, rw_tlv_length, rw; 319 u8 *rw_tlv = NULL, rw_tlv_length;
320 __be16 miux;
321 int err; 320 int err;
322 u16 size = 0; 321 u16 size = 0;
323 322
@@ -335,13 +334,11 @@ int nfc_llcp_send_connect(struct nfc_llcp_sock *sock)
335 size += service_name_tlv_length; 334 size += service_name_tlv_length;
336 } 335 }
337 336
338 miux = cpu_to_be16(LLCP_MAX_MIUX); 337 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
339 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
340 &miux_tlv_length); 338 &miux_tlv_length);
341 size += miux_tlv_length; 339 size += miux_tlv_length;
342 340
343 rw = LLCP_MAX_RW; 341 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &local->rw, 0, &rw_tlv_length);
344 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
345 size += rw_tlv_length; 342 size += rw_tlv_length;
346 343
347 pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len); 344 pr_debug("SKB size %d SN length %zu\n", size, sock->service_name_len);
@@ -378,8 +375,7 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
378 struct nfc_llcp_local *local; 375 struct nfc_llcp_local *local;
379 struct sk_buff *skb; 376 struct sk_buff *skb;
380 u8 *miux_tlv = NULL, miux_tlv_length; 377 u8 *miux_tlv = NULL, miux_tlv_length;
381 u8 *rw_tlv = NULL, rw_tlv_length, rw; 378 u8 *rw_tlv = NULL, rw_tlv_length;
382 __be16 miux;
383 int err; 379 int err;
384 u16 size = 0; 380 u16 size = 0;
385 381
@@ -389,13 +385,11 @@ int nfc_llcp_send_cc(struct nfc_llcp_sock *sock)
389 if (local == NULL) 385 if (local == NULL)
390 return -ENODEV; 386 return -ENODEV;
391 387
392 miux = cpu_to_be16(LLCP_MAX_MIUX); 388 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
393 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
394 &miux_tlv_length); 389 &miux_tlv_length);
395 size += miux_tlv_length; 390 size += miux_tlv_length;
396 391
397 rw = LLCP_MAX_RW; 392 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &local->rw, 0, &rw_tlv_length);
398 rw_tlv = nfc_llcp_build_tlv(LLCP_TLV_RW, &rw, 0, &rw_tlv_length);
399 size += rw_tlv_length; 393 size += rw_tlv_length;
400 394
401 skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size); 395 skb = llcp_allocate_pdu(sock, LLCP_PDU_CC, size);
diff --git a/net/nfc/llcp/llcp.c b/net/nfc/llcp/llcp.c
index 2e23bd348ebd..f6804532047a 100644
--- a/net/nfc/llcp/llcp.c
+++ b/net/nfc/llcp/llcp.c
@@ -467,10 +467,9 @@ static u8 nfc_llcp_reserve_sdp_ssap(struct nfc_llcp_local *local)
467static int nfc_llcp_build_gb(struct nfc_llcp_local *local) 467static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
468{ 468{
469 u8 *gb_cur, *version_tlv, version, version_length; 469 u8 *gb_cur, *version_tlv, version, version_length;
470 u8 *lto_tlv, lto, lto_length; 470 u8 *lto_tlv, lto_length;
471 u8 *wks_tlv, wks_length; 471 u8 *wks_tlv, wks_length;
472 u8 *miux_tlv, miux_length; 472 u8 *miux_tlv, miux_length;
473 __be16 miux;
474 u8 gb_len = 0; 473 u8 gb_len = 0;
475 int ret = 0; 474 int ret = 0;
476 475
@@ -479,9 +478,7 @@ static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
479 1, &version_length); 478 1, &version_length);
480 gb_len += version_length; 479 gb_len += version_length;
481 480
482 /* 1500 ms */ 481 lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &local->lto, 1, &lto_length);
483 lto = 150;
484 lto_tlv = nfc_llcp_build_tlv(LLCP_TLV_LTO, &lto, 1, &lto_length);
485 gb_len += lto_length; 482 gb_len += lto_length;
486 483
487 pr_debug("Local wks 0x%lx\n", local->local_wks); 484 pr_debug("Local wks 0x%lx\n", local->local_wks);
@@ -489,8 +486,7 @@ static int nfc_llcp_build_gb(struct nfc_llcp_local *local)
489 &wks_length); 486 &wks_length);
490 gb_len += wks_length; 487 gb_len += wks_length;
491 488
492 miux = cpu_to_be16(LLCP_MAX_MIUX); 489 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&local->miux, 0,
493 miux_tlv = nfc_llcp_build_tlv(LLCP_TLV_MIUX, (u8 *)&miux, 0,
494 &miux_length); 490 &miux_length);
495 gb_len += miux_length; 491 gb_len += miux_length;
496 492
@@ -1383,6 +1379,10 @@ int nfc_llcp_register_device(struct nfc_dev *ndev)
1383 rwlock_init(&local->connecting_sockets.lock); 1379 rwlock_init(&local->connecting_sockets.lock);
1384 rwlock_init(&local->raw_sockets.lock); 1380 rwlock_init(&local->raw_sockets.lock);
1385 1381
1382 local->lto = 150; /* 1500 ms */
1383 local->rw = LLCP_MAX_RW;
1384 local->miux = cpu_to_be16(LLCP_MAX_MIUX);
1385
1386 nfc_llcp_build_gb(local); 1386 nfc_llcp_build_gb(local);
1387 1387
1388 local->remote_miu = LLCP_DEFAULT_MIU; 1388 local->remote_miu = LLCP_DEFAULT_MIU;
diff --git a/net/nfc/llcp/llcp.h b/net/nfc/llcp/llcp.h
index 276da3a6a589..0d62366f8cc3 100644
--- a/net/nfc/llcp/llcp.h
+++ b/net/nfc/llcp/llcp.h
@@ -64,6 +64,9 @@ struct nfc_llcp_local {
64 u32 target_idx; 64 u32 target_idx;
65 u8 rf_mode; 65 u8 rf_mode;
66 u8 comm_mode; 66 u8 comm_mode;
67 u8 lto;
68 u8 rw;
69 __be16 miux;
67 unsigned long local_wks; /* Well known services */ 70 unsigned long local_wks; /* Well known services */
68 unsigned long local_sdp; /* Local services */ 71 unsigned long local_sdp; /* Local services */
69 unsigned long local_sap; /* Local SAPs, not available for discovery */ 72 unsigned long local_sap; /* Local SAPs, not available for discovery */