diff options
Diffstat (limited to 'drivers/net/benet/be_cmds.c')
| -rw-r--r-- | drivers/net/benet/be_cmds.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 1b68bd98dc0c..fee6eee7ae5b 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
| @@ -286,7 +286,7 @@ static void be_wrb_hdr_prepare(struct be_mcc_wrb *wrb, int payload_len, | |||
| 286 | MCC_WRB_SGE_CNT_SHIFT; | 286 | MCC_WRB_SGE_CNT_SHIFT; |
| 287 | wrb->payload_length = payload_len; | 287 | wrb->payload_length = payload_len; |
| 288 | wrb->tag0 = opcode; | 288 | wrb->tag0 = opcode; |
| 289 | be_dws_cpu_to_le(wrb, 20); | 289 | be_dws_cpu_to_le(wrb, 8); |
| 290 | } | 290 | } |
| 291 | 291 | ||
| 292 | /* Don't touch the hdr after it's prepared */ | 292 | /* Don't touch the hdr after it's prepared */ |
| @@ -1479,6 +1479,41 @@ err: | |||
| 1479 | return status; | 1479 | return status; |
| 1480 | } | 1480 | } |
| 1481 | 1481 | ||
| 1482 | int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, | ||
| 1483 | u8 loopback_type, u8 enable) | ||
| 1484 | { | ||
| 1485 | struct be_mcc_wrb *wrb; | ||
| 1486 | struct be_cmd_req_set_lmode *req; | ||
| 1487 | int status; | ||
| 1488 | |||
| 1489 | spin_lock_bh(&adapter->mcc_lock); | ||
| 1490 | |||
| 1491 | wrb = wrb_from_mccq(adapter); | ||
| 1492 | if (!wrb) { | ||
| 1493 | status = -EBUSY; | ||
| 1494 | goto err; | ||
| 1495 | } | ||
| 1496 | |||
| 1497 | req = embedded_payload(wrb); | ||
| 1498 | |||
| 1499 | be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0, | ||
| 1500 | OPCODE_LOWLEVEL_SET_LOOPBACK_MODE); | ||
| 1501 | |||
| 1502 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, | ||
| 1503 | OPCODE_LOWLEVEL_SET_LOOPBACK_MODE, | ||
| 1504 | sizeof(*req)); | ||
| 1505 | |||
| 1506 | req->src_port = port_num; | ||
| 1507 | req->dest_port = port_num; | ||
| 1508 | req->loopback_type = loopback_type; | ||
| 1509 | req->loopback_state = enable; | ||
| 1510 | |||
| 1511 | status = be_mcc_notify_wait(adapter); | ||
| 1512 | err: | ||
| 1513 | spin_unlock_bh(&adapter->mcc_lock); | ||
| 1514 | return status; | ||
| 1515 | } | ||
| 1516 | |||
| 1482 | int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | 1517 | int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, |
| 1483 | u32 loopback_type, u32 pkt_size, u32 num_pkts, u64 pattern) | 1518 | u32 loopback_type, u32 pkt_size, u32 num_pkts, u64 pattern) |
| 1484 | { | 1519 | { |
| @@ -1501,6 +1536,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, | |||
| 1501 | 1536 | ||
| 1502 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, | 1537 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL, |
| 1503 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req)); | 1538 | OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req)); |
| 1539 | req->hdr.timeout = 4; | ||
| 1504 | 1540 | ||
| 1505 | req->pattern = cpu_to_le64(pattern); | 1541 | req->pattern = cpu_to_le64(pattern); |
| 1506 | req->src_port = cpu_to_le32(port_num); | 1542 | req->src_port = cpu_to_le32(port_num); |
