#include <linux/kernel.h>
#include <linux/mhi.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/wwan.h>
enum mhi_wwan_flags { … };
#define MHI_WWAN_MAX_MTU …
struct mhi_wwan_dev { … };
static void mhi_wwan_rx_budget_inc(struct mhi_wwan_dev *mhiwwan)
{ … }
static bool mhi_wwan_rx_budget_dec(struct mhi_wwan_dev *mhiwwan)
{ … }
static void __mhi_skb_destructor(struct sk_buff *skb)
{ … }
static void mhi_wwan_ctrl_refill_work(struct work_struct *work)
{ … }
static int mhi_wwan_ctrl_start(struct wwan_port *port)
{ … }
static void mhi_wwan_ctrl_stop(struct wwan_port *port)
{ … }
static int mhi_wwan_ctrl_tx(struct wwan_port *port, struct sk_buff *skb)
{ … }
static const struct wwan_port_ops wwan_pops = …;
static void mhi_ul_xfer_cb(struct mhi_device *mhi_dev,
struct mhi_result *mhi_result)
{ … }
static void mhi_dl_xfer_cb(struct mhi_device *mhi_dev,
struct mhi_result *mhi_result)
{ … }
static int mhi_wwan_ctrl_probe(struct mhi_device *mhi_dev,
const struct mhi_device_id *id)
{
struct mhi_controller *cntrl = mhi_dev->mhi_cntrl;
struct mhi_wwan_dev *mhiwwan;
struct wwan_port *port;
mhiwwan = kzalloc(sizeof(*mhiwwan), GFP_KERNEL);
if (!mhiwwan)
return -ENOMEM;
mhiwwan->mhi_dev = mhi_dev;
mhiwwan->mtu = MHI_WWAN_MAX_MTU;
INIT_WORK(&mhiwwan->rx_refill, mhi_wwan_ctrl_refill_work);
spin_lock_init(&mhiwwan->tx_lock);
spin_lock_init(&mhiwwan->rx_lock);
if (mhi_dev->dl_chan)
set_bit(MHI_WWAN_DL_CAP, &mhiwwan->flags);
if (mhi_dev->ul_chan)
set_bit(MHI_WWAN_UL_CAP, &mhiwwan->flags);
dev_set_drvdata(&mhi_dev->dev, mhiwwan);
port = wwan_create_port(&cntrl->mhi_dev->dev, id->driver_data,
&wwan_pops, NULL, mhiwwan);
if (IS_ERR(port)) {
kfree(mhiwwan);
return PTR_ERR(port);
}
mhiwwan->wwan_port = port;
return 0;
};
static void mhi_wwan_ctrl_remove(struct mhi_device *mhi_dev)
{ … }
static const struct mhi_device_id mhi_wwan_ctrl_match_table[] = …;
MODULE_DEVICE_TABLE(mhi, mhi_wwan_ctrl_match_table);
static struct mhi_driver mhi_wwan_ctrl_driver = …;
module_mhi_driver(…) …;
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;