Skip to content

Commit

Permalink
Merge "msm: kernel: rndis_ipa: add Tx timeout detection"
Browse files Browse the repository at this point in the history
  • Loading branch information
Linux Build Service Account authored and Gerrit - the friendly Code Review server committed Jan 15, 2014
2 parents a79156a + f0e61e4 commit 0298388
Showing 1 changed file with 31 additions and 2 deletions.
33 changes: 31 additions & 2 deletions drivers/net/ethernet/msm/rndis_ipa.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
(ETH_FRAME_LEN + sizeof(struct rndis_pkt_hdr)))
#define BAM_DMA_DESC_FIFO_SIZE \
(BAM_DMA_MAX_PKT_NUMBER*(sizeof(struct sps_iovec)))
#define TX_TIMEOUT (5 * HZ)

#define RNDIS_IPA_ERROR(fmt, args...) \
pr_err(DRV_NAME "@%s@%d@ctx:%s: "\
Expand Down Expand Up @@ -226,6 +227,7 @@ static void rndis_ipa_packet_receive_notify(void *private,
enum ipa_dp_evt_type evt, unsigned long data);
static void rndis_ipa_tx_complete_notify(void *private,
enum ipa_dp_evt_type evt, unsigned long data);
static void rndis_ipa_tx_timeout(struct net_device *net);
static int rndis_ipa_stop(struct net_device *net);
static void rndis_encapsulate_skb(struct sk_buff *skb);
static void rndis_ipa_prepare_header_insertion(int eth_type,
Expand All @@ -234,6 +236,7 @@ static void rndis_ipa_prepare_header_insertion(int eth_type,
static int rndis_ipa_hdrs_cfg(struct rndis_ipa_dev *rndis_ipa_ctx,
const void *dst_mac, const void *src_mac);
static int rndis_ipa_hdrs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx);
static struct net_device_stats *rndis_ipa_get_stats(struct net_device *net);
static int rndis_ipa_register_properties(char *netdev_name);
static int rndis_ipa_deregister_properties(char *netdev_name);
static void rndis_ipa_rm_notify(void *user_data, enum ipa_rm_event event,
Expand Down Expand Up @@ -295,6 +298,8 @@ static const struct net_device_ops rndis_ipa_netdev_ops = {
.ndo_open = rndis_ipa_open,
.ndo_stop = rndis_ipa_stop,
.ndo_start_xmit = rndis_ipa_start_xmit,
.ndo_tx_timeout = rndis_ipa_tx_timeout,
.ndo_get_stats = rndis_ipa_get_stats,
.ndo_set_mac_address = eth_mac_addr,
};

Expand Down Expand Up @@ -494,6 +499,8 @@ int rndis_ipa_init(struct ipa_usb_init_params *params)
net->name);

net->netdev_ops = &rndis_ipa_netdev_ops;
net->watchdog_timeo = TX_TIMEOUT;

net->needed_headroom = sizeof(rndis_template_hdr);
RNDIS_IPA_DEBUG("Needed headroom for RNDIS header set to %d",
net->needed_headroom);
Expand Down Expand Up @@ -747,6 +754,8 @@ static netdev_tx_t rndis_ipa_start_xmit(struct sk_buff *skb,
netdev_tx_t status = NETDEV_TX_BUSY;
struct rndis_ipa_dev *rndis_ipa_ctx = netdev_priv(net);

net->trans_start = jiffies;

RNDIS_IPA_DEBUG("packet Tx, len=%d, skb->protocol=%d",
skb->len, skb->protocol);

Expand Down Expand Up @@ -796,8 +805,7 @@ static netdev_tx_t rndis_ipa_start_xmit(struct sk_buff *skb,
}

atomic_inc(&rndis_ipa_ctx->outstanding_pkts);
net->stats.tx_packets++;
net->stats.tx_bytes += skb->len;

status = NETDEV_TX_OK;
goto out;

Expand Down Expand Up @@ -839,6 +847,9 @@ static void rndis_ipa_tx_complete_notify(void *private,
return;
}

rndis_ipa_ctx->net->stats.tx_packets++;
rndis_ipa_ctx->net->stats.tx_bytes += skb->len;

atomic_dec(&rndis_ipa_ctx->outstanding_pkts);
if (netif_queue_stopped(rndis_ipa_ctx->net) &&
atomic_read(&rndis_ipa_ctx->outstanding_pkts) <
Expand All @@ -854,6 +865,18 @@ static void rndis_ipa_tx_complete_notify(void *private,
return;
}

static void rndis_ipa_tx_timeout(struct net_device *net)
{
struct rndis_ipa_dev *rndis_ipa_ctx = netdev_priv(net);
int outstanding = atomic_read(&rndis_ipa_ctx->outstanding_pkts);

RNDIS_IPA_ERROR("possible IPA stall was detected, %d outstanding",
outstanding);

net->stats.tx_errors++;
ipa_bam_reg_dump();
}

/**
* rndis_ipa_rm_notify() - callback supplied to IPA resource manager
* for grant/release events
Expand Down Expand Up @@ -1289,6 +1312,12 @@ static int rndis_ipa_hdrs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx)
return result;
}

static struct net_device_stats *rndis_ipa_get_stats(struct net_device *net)
{
return &net->stats;
}


/**
* rndis_ipa_register_properties() - set Tx/Rx properties needed
* by IPA configuration manager
Expand Down

0 comments on commit 0298388

Please sign in to comment.