Skip to content

Commit

Permalink
caif: Bugfix not all services uses flow-ctrl.
Browse files Browse the repository at this point in the history
Flow control is not used by all CAIF services.
The usage of flow control is now part of the gerneal
initialization function for CAIF Services.

Signed-off-by: Sjur [email protected]
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Sjur Braendeland authored and davem330 committed Jun 21, 2010
1 parent c14c643 commit b1c7424
Show file tree
Hide file tree
Showing 9 changed files with 26 additions and 18 deletions.
6 changes: 4 additions & 2 deletions include/net/caif/cfsrvl.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ struct cfsrvl {
bool open;
bool phy_flow_on;
bool modem_flow_on;
bool supports_flowctrl;
struct dev_info dev_info;
struct kref ref;
};
Expand All @@ -30,8 +31,9 @@ struct cflayer *cfdbgl_create(u8 linkid, struct dev_info *dev_info);
bool cfsrvl_phyid_match(struct cflayer *layer, int phyid);
void cfservl_destroy(struct cflayer *layer);
void cfsrvl_init(struct cfsrvl *service,
u8 channel_id,
struct dev_info *dev_info);
u8 channel_id,
struct dev_info *dev_info,
bool supports_flowctrl);
bool cfsrvl_ready(struct cfsrvl *service, int *err);
u8 cfsrvl_getphyid(struct cflayer *layer);

Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ struct cflayer *cfctrl_create(void)
memset(&dev_info, 0, sizeof(dev_info));
dev_info.id = 0xff;
memset(this, 0, sizeof(*this));
cfsrvl_init(&this->serv, 0, &dev_info);
cfsrvl_init(&this->serv, 0, &dev_info, false);
atomic_set(&this->req_seq_no, 1);
atomic_set(&this->rsp_seq_no, 1);
this->serv.layer.receive = cfctrl_recv;
Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfdbgl.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ struct cflayer *cfdbgl_create(u8 channel_id, struct dev_info *dev_info)
}
caif_assert(offsetof(struct cfsrvl, layer) == 0);
memset(dbg, 0, sizeof(struct cfsrvl));
cfsrvl_init(dbg, channel_id, dev_info);
cfsrvl_init(dbg, channel_id, dev_info, false);
dbg->layer.receive = cfdbgl_receive;
dbg->layer.transmit = cfdbgl_transmit;
snprintf(dbg->layer.name, CAIF_LAYER_NAME_SZ - 1, "dbg%d", channel_id);
Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfdgml.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct cflayer *cfdgml_create(u8 channel_id, struct dev_info *dev_info)
}
caif_assert(offsetof(struct cfsrvl, layer) == 0);
memset(dgm, 0, sizeof(struct cfsrvl));
cfsrvl_init(dgm, channel_id, dev_info);
cfsrvl_init(dgm, channel_id, dev_info, true);
dgm->layer.receive = cfdgml_receive;
dgm->layer.transmit = cfdgml_transmit;
snprintf(dgm->layer.name, CAIF_LAYER_NAME_SZ - 1, "dgm%d", channel_id);
Expand Down
12 changes: 4 additions & 8 deletions net/caif/cfrfml.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,30 +23,26 @@

static int cfrfml_receive(struct cflayer *layr, struct cfpkt *pkt);
static int cfrfml_transmit(struct cflayer *layr, struct cfpkt *pkt);
static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl);

struct cflayer *cfrfml_create(u8 channel_id, struct dev_info *dev_info)
{
struct cfsrvl *rfm = kmalloc(sizeof(struct cfsrvl), GFP_ATOMIC);

if (!rfm) {
pr_warning("CAIF: %s(): Out of memory\n", __func__);
return NULL;
}

caif_assert(offsetof(struct cfsrvl, layer) == 0);

memset(rfm, 0, sizeof(struct cfsrvl));
cfsrvl_init(rfm, channel_id, dev_info);
rfm->layer.modemcmd = cfservl_modemcmd;
cfsrvl_init(rfm, channel_id, dev_info, false);
rfm->layer.receive = cfrfml_receive;
rfm->layer.transmit = cfrfml_transmit;
snprintf(rfm->layer.name, CAIF_LAYER_NAME_SZ, "rfm%d", channel_id);
return &rfm->layer;
}

static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
{
return -EPROTO;
}

static int cfrfml_receive(struct cflayer *layr, struct cfpkt *pkt)
{
u8 tmp;
Expand Down
14 changes: 12 additions & 2 deletions net/caif/cfsrvl.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
int phyid)
{
struct cfsrvl *service = container_obj(layr);

caif_assert(layr->up != NULL);
caif_assert(layr->up->ctrlcmd != NULL);

switch (ctrl) {
case CAIF_CTRLCMD_INIT_RSP:
service->open = true;
Expand Down Expand Up @@ -89,9 +91,14 @@ static void cfservl_ctrlcmd(struct cflayer *layr, enum caif_ctrlcmd ctrl,
static int cfservl_modemcmd(struct cflayer *layr, enum caif_modemcmd ctrl)
{
struct cfsrvl *service = container_obj(layr);

caif_assert(layr != NULL);
caif_assert(layr->dn != NULL);
caif_assert(layr->dn->transmit != NULL);

if (!service->supports_flowctrl)
return 0;

switch (ctrl) {
case CAIF_MODEMCMD_FLOW_ON_REQ:
{
Expand Down Expand Up @@ -153,8 +160,10 @@ void cfservl_destroy(struct cflayer *layer)
}

void cfsrvl_init(struct cfsrvl *service,
u8 channel_id,
struct dev_info *dev_info)
u8 channel_id,
struct dev_info *dev_info,
bool supports_flowctrl
)
{
caif_assert(offsetof(struct cfsrvl, layer) == 0);
service->open = false;
Expand All @@ -164,6 +173,7 @@ void cfsrvl_init(struct cfsrvl *service,
service->layer.ctrlcmd = cfservl_ctrlcmd;
service->layer.modemcmd = cfservl_modemcmd;
service->dev_info = *dev_info;
service->supports_flowctrl = supports_flowctrl;
kref_init(&service->ref);
}

Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfutill.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ struct cflayer *cfutill_create(u8 channel_id, struct dev_info *dev_info)
}
caif_assert(offsetof(struct cfsrvl, layer) == 0);
memset(util, 0, sizeof(struct cfsrvl));
cfsrvl_init(util, channel_id, dev_info);
cfsrvl_init(util, channel_id, dev_info, true);
util->layer.receive = cfutill_receive;
util->layer.transmit = cfutill_transmit;
snprintf(util->layer.name, CAIF_LAYER_NAME_SZ - 1, "util1");
Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfveil.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct cflayer *cfvei_create(u8 channel_id, struct dev_info *dev_info)
}
caif_assert(offsetof(struct cfsrvl, layer) == 0);
memset(vei, 0, sizeof(struct cfsrvl));
cfsrvl_init(vei, channel_id, dev_info);
cfsrvl_init(vei, channel_id, dev_info, true);
vei->layer.receive = cfvei_receive;
vei->layer.transmit = cfvei_transmit;
snprintf(vei->layer.name, CAIF_LAYER_NAME_SZ - 1, "vei%d", channel_id);
Expand Down
2 changes: 1 addition & 1 deletion net/caif/cfvidl.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ struct cflayer *cfvidl_create(u8 channel_id, struct dev_info *dev_info)
caif_assert(offsetof(struct cfsrvl, layer) == 0);

memset(vid, 0, sizeof(struct cfsrvl));
cfsrvl_init(vid, channel_id, dev_info);
cfsrvl_init(vid, channel_id, dev_info, false);
vid->layer.receive = cfvidl_receive;
vid->layer.transmit = cfvidl_transmit;
snprintf(vid->layer.name, CAIF_LAYER_NAME_SZ - 1, "vid1");
Expand Down

0 comments on commit b1c7424

Please sign in to comment.