|
|
|
@ -1,565 +0,0 @@
|
|
|
|
|
diff --git a/driver/linux/crystalhd_cmds.c b/driver/linux/crystalhd_cmds.c
|
|
|
|
|
index cecd710..ba743df 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_cmds.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_cmds.c
|
|
|
|
|
@@ -32,6 +32,11 @@ static struct crystalhd_user *bc_cproc_get_uid(struct crystalhd_cmd *ctx)
|
|
|
|
|
struct crystalhd_user *user = NULL;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
+ if (!ctx) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return user;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
for (i = 0; i < BC_LINK_MAX_OPENS; i++) {
|
|
|
|
|
if (!ctx->user[i].in_use) {
|
|
|
|
|
user = &ctx->user[i];
|
|
|
|
|
@@ -46,6 +51,11 @@ int bc_get_userhandle_count(struct crystalhd_cmd *ctx)
|
|
|
|
|
{
|
|
|
|
|
int i, count = 0;
|
|
|
|
|
|
|
|
|
|
+ if (!ctx) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
for (i = 0; i < BC_LINK_MAX_OPENS; i++) {
|
|
|
|
|
if (ctx->user[i].in_use)
|
|
|
|
|
count++;
|
|
|
|
|
@@ -154,7 +164,7 @@ static BC_STATUS bc_cproc_get_hwtype(struct crystalhd_cmd *ctx, crystalhd_ioctl_
|
|
|
|
|
static BC_STATUS bc_cproc_reg_rd(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
- if (!ctx || !idata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
idata->udata.u.regAcc.Value = ctx->hw_ctx->pfnReadDevRegister(ctx->adp,
|
|
|
|
|
idata->udata.u.regAcc.Offset);
|
|
|
|
|
@@ -164,7 +174,7 @@ static BC_STATUS bc_cproc_reg_rd(struct crystalhd_cmd *ctx,
|
|
|
|
|
static BC_STATUS bc_cproc_reg_wr(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
- if (!ctx || !idata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
|
|
|
|
|
ctx->hw_ctx->pfnWriteDevRegister(ctx->adp, idata->udata.u.regAcc.Offset,
|
|
|
|
|
@@ -176,7 +186,7 @@ static BC_STATUS bc_cproc_reg_wr(struct crystalhd_cmd *ctx,
|
|
|
|
|
static BC_STATUS bc_cproc_link_reg_rd(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
- if (!ctx || !idata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
|
|
|
|
|
idata->udata.u.regAcc.Value = ctx->hw_ctx->pfnReadFPGARegister(ctx->adp,
|
|
|
|
|
@@ -187,7 +197,7 @@ static BC_STATUS bc_cproc_link_reg_rd(struct crystalhd_cmd *ctx,
|
|
|
|
|
static BC_STATUS bc_cproc_link_reg_wr(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
- if (!ctx || !idata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
|
|
|
|
|
ctx->hw_ctx->pfnWriteFPGARegister(ctx->adp, idata->udata.u.regAcc.Offset,
|
|
|
|
|
@@ -201,7 +211,7 @@ static BC_STATUS bc_cproc_mem_rd(struct crystalhd_cmd *ctx,
|
|
|
|
|
{
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata || !idata->add_cdata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata || !idata->add_cdata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
|
|
|
|
|
if (idata->udata.u.devMem.NumDwords > (idata->add_cdata_sz / 4)) {
|
|
|
|
|
@@ -220,7 +230,7 @@ static BC_STATUS bc_cproc_mem_wr(struct crystalhd_cmd *ctx,
|
|
|
|
|
{
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata || !idata->add_cdata)
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata || !idata->add_cdata)
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
|
|
|
|
|
if (idata->udata.u.devMem.NumDwords > (idata->add_cdata_sz / 4)) {
|
|
|
|
|
@@ -307,7 +317,7 @@ static BC_STATUS bc_cproc_download_fw(struct crystalhd_cmd *ctx,
|
|
|
|
|
|
|
|
|
|
dev_dbg(chddev(), "Downloading FW\n");
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata || !idata->add_cdata || !idata->add_cdata_sz) {
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata || !idata->add_cdata || !idata->add_cdata_sz) {
|
|
|
|
|
dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
@@ -350,7 +360,7 @@ static BC_STATUS bc_cproc_do_fw_cmd(struct crystalhd_cmd *ctx, crystalhd_ioctl_d
|
|
|
|
|
BC_STATUS sts;
|
|
|
|
|
uint32_t *cmd;
|
|
|
|
|
|
|
|
|
|
- if (!(ctx->state & BC_LINK_INIT)) {
|
|
|
|
|
+ if ( !ctx || !idata || !(ctx->state & BC_LINK_INIT) || !ctx->hw_ctx) {
|
|
|
|
|
dev_dbg(dev, "Link invalid state do fw cmd %x \n", ctx->state);
|
|
|
|
|
return BC_STS_ERR_USAGE;
|
|
|
|
|
}
|
|
|
|
|
@@ -395,7 +405,7 @@ static void bc_proc_in_completion(struct crystalhd_dio_req *dio_hnd,
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (sts == BC_STS_IO_USER_ABORT || sts == BC_STS_PWR_MGMT)
|
|
|
|
|
- return;
|
|
|
|
|
+ return;
|
|
|
|
|
|
|
|
|
|
dio_hnd->uinfo.comp_sts = sts;
|
|
|
|
|
dio_hnd->uinfo.ev_sts = 1;
|
|
|
|
|
@@ -407,6 +417,9 @@ static BC_STATUS bc_cproc_codein_sleep(struct crystalhd_cmd *ctx)
|
|
|
|
|
wait_queue_head_t sleep_ev;
|
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
|
|
+ if (!ctx)
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+
|
|
|
|
|
if (ctx->state & BC_LINK_SUSPEND)
|
|
|
|
|
return BC_STS_PWR_MGMT;
|
|
|
|
|
|
|
|
|
|
@@ -432,7 +445,7 @@ static BC_STATUS bc_cproc_hw_txdma(struct crystalhd_cmd *ctx,
|
|
|
|
|
wait_queue_head_t event;
|
|
|
|
|
int rc = 0;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata || !dio) {
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata || !dio) {
|
|
|
|
|
dev_err(dev, "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
@@ -573,7 +586,7 @@ static BC_STATUS bc_cproc_add_cap_buff(struct crystalhd_cmd *ctx,
|
|
|
|
|
struct crystalhd_dio_req *dio_hnd = NULL;
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata) {
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
dev_err(dev, "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
@@ -612,6 +625,11 @@ static BC_STATUS bc_cproc_fmt_change(struct crystalhd_cmd *ctx,
|
|
|
|
|
{
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
+ if (!ctx || !dio) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
sts = crystalhd_hw_add_cap_buffer(ctx->hw_ctx, dio, 0);
|
|
|
|
|
if (sts != BC_STS_SUCCESS)
|
|
|
|
|
return sts;
|
|
|
|
|
@@ -673,6 +691,10 @@ static BC_STATUS bc_cproc_fetch_frame(struct crystalhd_cmd *ctx,
|
|
|
|
|
static BC_STATUS bc_cproc_start_capture(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
ctx->state |= BC_LINK_CAP_EN;
|
|
|
|
|
|
|
|
|
|
if( idata->udata.u.RxCap.PauseThsh )
|
|
|
|
|
@@ -705,7 +727,7 @@ static BC_STATUS bc_cproc_flush_cap_buffs(struct crystalhd_cmd *ctx,
|
|
|
|
|
struct device *dev = chddev();
|
|
|
|
|
struct crystalhd_rx_dma_pkt *rpkt;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata) {
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
dev_err(dev, "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
@@ -745,8 +767,8 @@ static BC_STATUS bc_cproc_get_stats(struct crystalhd_cmd *ctx,
|
|
|
|
|
bool readTxOnly = false;
|
|
|
|
|
unsigned long irqflags;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata) {
|
|
|
|
|
- dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg ctx,hw,data: 0x%lx 0x%lx 0x%lx\n", __func__, (uintptr_t)(ctx->hw_ctx), (uintptr_t)ctx, (uintptr_t)idata);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -828,6 +850,10 @@ get_out:
|
|
|
|
|
static BC_STATUS bc_cproc_reset_stats(struct crystalhd_cmd *ctx,
|
|
|
|
|
crystalhd_ioctl_data *idata)
|
|
|
|
|
{
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
crystalhd_hw_stats(ctx->hw_ctx, NULL);
|
|
|
|
|
|
|
|
|
|
return BC_STS_SUCCESS;
|
|
|
|
|
@@ -948,9 +974,9 @@ BC_STATUS crystalhd_suspend(struct crystalhd_cmd *ctx, crystalhd_ioctl_data *ida
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
struct crystalhd_rx_dma_pkt *rpkt = NULL;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !idata) {
|
|
|
|
|
- dev_err(dev, "Invalid Parameters\n");
|
|
|
|
|
- return BC_STS_ERROR;
|
|
|
|
|
+ if (!ctx || !ctx->hw_ctx || !idata) {
|
|
|
|
|
+ dev_err(dev, "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ctx->state & BC_LINK_SUSPEND)
|
|
|
|
|
@@ -1017,6 +1043,11 @@ BC_STATUS crystalhd_resume(struct crystalhd_cmd *ctx)
|
|
|
|
|
{
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
|
|
|
|
|
+ if (!ctx) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid Arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
sts = crystalhd_hw_resume(ctx->hw_ctx);
|
|
|
|
|
if (sts != BC_STS_SUCCESS)
|
|
|
|
|
return sts;
|
|
|
|
|
@@ -1049,13 +1080,13 @@ BC_STATUS crystalhd_user_open(struct crystalhd_cmd *ctx,
|
|
|
|
|
struct crystalhd_user *uc;
|
|
|
|
|
|
|
|
|
|
if (!ctx || !user_ctx) {
|
|
|
|
|
- dev_err(dev, "Invalid arg..\n");
|
|
|
|
|
+ dev_err(dev, "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uc = bc_cproc_get_uid(ctx);
|
|
|
|
|
if (!uc) {
|
|
|
|
|
- dev_info(dev, "No free user context...\n");
|
|
|
|
|
+ dev_info(dev, "%s No free user context.\n", __func__);
|
|
|
|
|
return BC_STS_BUSY;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1093,19 +1124,21 @@ BC_STATUS crystalhd_user_open(struct crystalhd_cmd *ctx,
|
|
|
|
|
*
|
|
|
|
|
* Called at the time of driver load.
|
|
|
|
|
*/
|
|
|
|
|
-BC_STATUS __devinit crystalhd_setup_cmd_context(struct crystalhd_cmd *ctx,
|
|
|
|
|
+BC_STATUS crystalhd_setup_cmd_context(struct crystalhd_cmd *ctx,
|
|
|
|
|
struct crystalhd_adp *adp)
|
|
|
|
|
{
|
|
|
|
|
- struct device *dev = &adp->pdev->dev;
|
|
|
|
|
+ struct device *dev;
|
|
|
|
|
int i = 0;
|
|
|
|
|
|
|
|
|
|
- if (!ctx || !adp) {
|
|
|
|
|
- dev_err(dev, "%s: Invalid arg\n", __func__);
|
|
|
|
|
+ if (!ctx || !adp || !adp->pdev) {
|
|
|
|
|
+ printk(KERN_ERR "%s: Invalid arg.\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+ dev = &adp->pdev->dev;
|
|
|
|
|
+
|
|
|
|
|
if (ctx->adp)
|
|
|
|
|
- dev_dbg(dev, "Resetting Cmd context delete missing..\n");
|
|
|
|
|
+ dev_dbg(dev, "Resetting Cmd context delete missing.\n");
|
|
|
|
|
|
|
|
|
|
ctx->adp = adp;
|
|
|
|
|
for (i = 0; i < BC_LINK_MAX_OPENS; i++) {
|
|
|
|
|
@@ -1114,15 +1147,19 @@ BC_STATUS __devinit crystalhd_setup_cmd_context(struct crystalhd_cmd *ctx,
|
|
|
|
|
ctx->user[i].mode = DTS_MODE_INV;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- ctx->hw_ctx = (struct crystalhd_hw*)kmalloc(sizeof(struct crystalhd_hw), GFP_KERNEL);
|
|
|
|
|
-
|
|
|
|
|
- memset(ctx->hw_ctx, 0, sizeof(struct crystalhd_hw));
|
|
|
|
|
+ if(ctx->hw_ctx == NULL) {
|
|
|
|
|
+ ctx->hw_ctx = (struct crystalhd_hw*)kmalloc(sizeof(struct crystalhd_hw), GFP_KERNEL);
|
|
|
|
|
+ if(ctx->hw_ctx != NULL)
|
|
|
|
|
+ memset(ctx->hw_ctx, 0, sizeof(struct crystalhd_hw));
|
|
|
|
|
+ else
|
|
|
|
|
+ return BC_STS_ERROR;
|
|
|
|
|
|
|
|
|
|
- /*Open and Close the Hardware to put it in to sleep state*/
|
|
|
|
|
- crystalhd_hw_open(ctx->hw_ctx, ctx->adp);
|
|
|
|
|
- crystalhd_hw_close(ctx->hw_ctx, ctx->adp);
|
|
|
|
|
- kfree(ctx->hw_ctx);
|
|
|
|
|
- ctx->hw_ctx = NULL;
|
|
|
|
|
+ /*Open and Close the Hardware to put it in to sleep state*/
|
|
|
|
|
+ crystalhd_hw_open(ctx->hw_ctx, ctx->adp);
|
|
|
|
|
+ crystalhd_hw_close(ctx->hw_ctx, ctx->adp);
|
|
|
|
|
+ kfree(ctx->hw_ctx);
|
|
|
|
|
+ ctx->hw_ctx = NULL;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
return BC_STS_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
@@ -1136,10 +1173,15 @@ BC_STATUS __devinit crystalhd_setup_cmd_context(struct crystalhd_cmd *ctx,
|
|
|
|
|
*
|
|
|
|
|
* Called at the time of driver un-load.
|
|
|
|
|
*/
|
|
|
|
|
-BC_STATUS __devexit crystalhd_delete_cmd_context(struct crystalhd_cmd *ctx)
|
|
|
|
|
+BC_STATUS crystalhd_delete_cmd_context(struct crystalhd_cmd *ctx)
|
|
|
|
|
{
|
|
|
|
|
dev_dbg(chddev(), "Deleting Command context..\n");
|
|
|
|
|
|
|
|
|
|
+ if (!ctx) {
|
|
|
|
|
+ dev_err(chddev(), "%s: Invalid arg\n", __func__);
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
ctx->adp = NULL;
|
|
|
|
|
|
|
|
|
|
return BC_STS_SUCCESS;
|
|
|
|
|
@@ -1165,8 +1207,8 @@ crystalhd_cmd_proc crystalhd_get_cmd_proc(struct crystalhd_cmd *ctx, uint32_t cm
|
|
|
|
|
crystalhd_cmd_proc cproc = NULL;
|
|
|
|
|
unsigned int i, tbl_sz;
|
|
|
|
|
|
|
|
|
|
- if (!ctx) {
|
|
|
|
|
- dev_err(dev, "Invalid arg.. Cmd[%d]\n", cmd);
|
|
|
|
|
+ if (!ctx || !uc) {
|
|
|
|
|
+ dev_err(dev, "Invalid arg. Cmd[%d]\n", cmd);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
diff --git a/driver/linux/crystalhd_fleafuncs.c b/driver/linux/crystalhd_fleafuncs.c
|
|
|
|
|
index 1aa7115..f76d122 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_fleafuncs.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_fleafuncs.c
|
|
|
|
|
@@ -1344,7 +1344,9 @@ BCHP_SCRUB_CTRL_BI_CMAC_127_96 0x000f6018 CMAC Bits[127:96]
|
|
|
|
|
bool crystalhd_flea_start_device(struct crystalhd_hw *hw)
|
|
|
|
|
{
|
|
|
|
|
uint32_t regVal = 0;
|
|
|
|
|
- bool bRetVal = false;
|
|
|
|
|
+
|
|
|
|
|
+ if (!hw)
|
|
|
|
|
+ return false;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
-- Issue Core reset to bring in the default values in place
|
|
|
|
|
@@ -1430,7 +1432,7 @@ bool crystalhd_flea_start_device(struct crystalhd_hw *hw)
|
|
|
|
|
|
|
|
|
|
msleep_interruptible(1);
|
|
|
|
|
|
|
|
|
|
- return bRetVal;
|
|
|
|
|
+ return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/driver/linux/crystalhd_hw.c b/driver/linux/crystalhd_hw.c
|
|
|
|
|
index cf8fefb..bffb468 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_hw.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_hw.c
|
|
|
|
|
@@ -38,7 +38,7 @@
|
|
|
|
|
BC_STATUS crystalhd_hw_open(struct crystalhd_hw *hw, struct crystalhd_adp *adp)
|
|
|
|
|
{
|
|
|
|
|
struct device *dev;
|
|
|
|
|
- if (!hw || !adp) {
|
|
|
|
|
+ if (!hw || !adp || !adp->pdev) {
|
|
|
|
|
printk(KERN_ERR "%s: Invalid Arguments\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
@@ -110,7 +110,10 @@ BC_STATUS crystalhd_hw_open(struct crystalhd_hw *hw, struct crystalhd_adp *adp)
|
|
|
|
|
hw->rx_pkt_tag_seed = 0x70029070;
|
|
|
|
|
|
|
|
|
|
hw->stop_pending = 0;
|
|
|
|
|
- hw->pfnStartDevice(hw);
|
|
|
|
|
+ if (!hw->pfnStartDevice(hw)) {
|
|
|
|
|
+ printk(KERN_ERR "%s: Failed to Start Device! \n", __func__);
|
|
|
|
|
+ return BC_STS_ERROR;
|
|
|
|
|
+ }
|
|
|
|
|
hw->dev_started = true;
|
|
|
|
|
|
|
|
|
|
dev_dbg(dev, "Opening HW. hw:0x%lx, hw->adp:0x%lx\n",
|
|
|
|
|
@@ -121,9 +124,9 @@ BC_STATUS crystalhd_hw_open(struct crystalhd_hw *hw, struct crystalhd_adp *adp)
|
|
|
|
|
|
|
|
|
|
BC_STATUS crystalhd_hw_close(struct crystalhd_hw *hw, struct crystalhd_adp *adp)
|
|
|
|
|
{
|
|
|
|
|
- if (!hw) {
|
|
|
|
|
+ if (!hw || !adp) {
|
|
|
|
|
printk(KERN_ERR "%s: Invalid Arguments\n", __func__);
|
|
|
|
|
- return BC_STS_SUCCESS;
|
|
|
|
|
+ return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!hw->dev_started)
|
|
|
|
|
@@ -390,12 +393,12 @@ BC_STATUS crystalhd_hw_tx_req_complete(struct crystalhd_hw *hw,
|
|
|
|
|
struct tx_dma_pkt *tx_req;
|
|
|
|
|
|
|
|
|
|
if (!hw || !list_id) {
|
|
|
|
|
- printk(KERN_ERR "%s: Invalid Arg!!\n", __func__);
|
|
|
|
|
+ printk(KERN_ERR "%s: Invalid Arg\n", __func__);
|
|
|
|
|
return BC_STS_INV_ARG;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tx_req = (struct tx_dma_pkt *)crystalhd_dioq_find_and_fetch(hw->tx_actq, list_id);
|
|
|
|
|
- if (!tx_req) {
|
|
|
|
|
+ if (!tx_req || !tx_req->dio_req || !tx_req->cb_event) {
|
|
|
|
|
if (cs != BC_STS_IO_USER_ABORT)
|
|
|
|
|
dev_err(&hw->adp->pdev->dev, "Find/Fetch: no req!\n");
|
|
|
|
|
return BC_STS_NO_DATA;
|
|
|
|
|
@@ -1047,8 +1050,8 @@ BC_STATUS crystalhd_hw_resume(struct crystalhd_hw *hw)
|
|
|
|
|
hw->rx_list_post_index = 0;
|
|
|
|
|
hw->tx_list_post_index = 0;
|
|
|
|
|
|
|
|
|
|
- if (hw->pfnStartDevice(hw)) {
|
|
|
|
|
- dev_info(&hw->adp->pdev->dev, "Failed to Start Device!!\n");
|
|
|
|
|
+ if (!hw->pfnStartDevice(hw)) {
|
|
|
|
|
+ dev_info(&hw->adp->pdev->dev, "Failed to resume start device!\n");
|
|
|
|
|
return BC_STS_ERROR;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
diff --git a/driver/linux/crystalhd_linkfuncs.c b/driver/linux/crystalhd_linkfuncs.c
|
|
|
|
|
index 8366cc3..c8be3ab 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_linkfuncs.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_linkfuncs.c
|
|
|
|
|
@@ -469,8 +469,8 @@ bool crystalhd_link_start_device(struct crystalhd_hw *hw)
|
|
|
|
|
uint32_t dbg_options, glb_cntrl = 0, reg_pwrmgmt = 0;
|
|
|
|
|
struct device *dev;
|
|
|
|
|
|
|
|
|
|
- if (!hw)
|
|
|
|
|
- return -EINVAL;
|
|
|
|
|
+ if (!hw || !hw->adp || !hw->adp->pdev)
|
|
|
|
|
+ return false;
|
|
|
|
|
|
|
|
|
|
dev = &hw->adp->pdev->dev;
|
|
|
|
|
|
|
|
|
|
@@ -957,6 +957,9 @@ void crystalhd_link_tx_isr(struct crystalhd_hw *hw, uint32_t int_sts)
|
|
|
|
|
{
|
|
|
|
|
uint32_t err_sts;
|
|
|
|
|
|
|
|
|
|
+ if (!hw)
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
if (int_sts & INTR_INTR_STATUS_L0_TX_DMA_DONE_INTR_MASK)
|
|
|
|
|
crystalhd_hw_tx_req_complete(hw, hw->tx_ioq_tag_seed + 0,
|
|
|
|
|
BC_STS_SUCCESS);
|
|
|
|
|
@@ -1995,22 +1998,15 @@ bool crystalhd_link_hw_interrupt_handle(struct crystalhd_adp *adp, struct crysta
|
|
|
|
|
{
|
|
|
|
|
uint32_t intr_sts = 0;
|
|
|
|
|
uint32_t deco_intr = 0;
|
|
|
|
|
- bool rc = false;
|
|
|
|
|
|
|
|
|
|
- if (!adp || !hw->dev_started)
|
|
|
|
|
- return rc;
|
|
|
|
|
+ if (!adp || !hw || !hw->dev_started)
|
|
|
|
|
+ return false;
|
|
|
|
|
|
|
|
|
|
hw->stats.num_interrupts++;
|
|
|
|
|
|
|
|
|
|
deco_intr = hw->pfnReadDevRegister(hw->adp, Stream2Host_Intr_Sts);
|
|
|
|
|
intr_sts = hw->pfnReadFPGARegister(hw->adp, INTR_INTR_STATUS);
|
|
|
|
|
|
|
|
|
|
- if (intr_sts) {
|
|
|
|
|
- /* let system know we processed interrupt..*/
|
|
|
|
|
- rc = true;
|
|
|
|
|
- hw->stats.dev_interrupts++;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
if (deco_intr && (deco_intr != 0xdeaddead)) {
|
|
|
|
|
|
|
|
|
|
if (deco_intr & 0x80000000) {
|
|
|
|
|
@@ -2026,7 +2022,6 @@ bool crystalhd_link_hw_interrupt_handle(struct crystalhd_adp *adp, struct crysta
|
|
|
|
|
|
|
|
|
|
hw->pfnWriteDevRegister(hw->adp, Stream2Host_Intr_Sts, deco_intr);
|
|
|
|
|
hw->pfnWriteDevRegister(hw->adp, Stream2Host_Intr_Sts, 0);
|
|
|
|
|
- rc = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Rx interrupts */
|
|
|
|
|
@@ -2036,14 +2031,17 @@ bool crystalhd_link_hw_interrupt_handle(struct crystalhd_adp *adp, struct crysta
|
|
|
|
|
crystalhd_link_tx_isr(hw, intr_sts);
|
|
|
|
|
|
|
|
|
|
/* Clear interrupts */
|
|
|
|
|
- if (rc) {
|
|
|
|
|
- if (intr_sts)
|
|
|
|
|
- hw->pfnWriteFPGARegister(hw->adp, INTR_INTR_CLR_REG, intr_sts);
|
|
|
|
|
+ if (intr_sts)
|
|
|
|
|
+ hw->pfnWriteFPGARegister(hw->adp, INTR_INTR_CLR_REG, intr_sts);
|
|
|
|
|
|
|
|
|
|
- hw->pfnWriteFPGARegister(hw->adp, INTR_EOI_CTRL, 1);
|
|
|
|
|
+ hw->pfnWriteFPGARegister(hw->adp, INTR_EOI_CTRL, 1);
|
|
|
|
|
+
|
|
|
|
|
+ if (intr_sts) {
|
|
|
|
|
+ /* Let system know we have processed interrupts, and rc ret is always true unless invalid args. */
|
|
|
|
|
+ hw->stats.dev_interrupts++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
- return rc;
|
|
|
|
|
+ return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Dummy private function */
|
|
|
|
|
diff --git a/driver/linux/crystalhd_lnx.c b/driver/linux/crystalhd_lnx.c
|
|
|
|
|
index 64e66ad..8608aea 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_lnx.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_lnx.c
|
|
|
|
|
@@ -431,7 +431,7 @@ static const struct file_operations chd_dec_fops = {
|
|
|
|
|
.llseek = noop_llseek,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
-static int __devinit chd_dec_init_chdev(struct crystalhd_adp *adp)
|
|
|
|
|
+static int chd_dec_init_chdev(struct crystalhd_adp *adp)
|
|
|
|
|
{
|
|
|
|
|
struct device *xdev = &adp->pdev->dev;
|
|
|
|
|
struct device *dev;
|
|
|
|
|
@@ -498,7 +498,7 @@ fail:
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-static void __devexit chd_dec_release_chdev(struct crystalhd_adp *adp)
|
|
|
|
|
+static void chd_dec_release_chdev(struct crystalhd_adp *adp)
|
|
|
|
|
{
|
|
|
|
|
crystalhd_ioctl_data *temp = NULL;
|
|
|
|
|
if (!adp)
|
|
|
|
|
@@ -523,7 +523,7 @@ static void __devexit chd_dec_release_chdev(struct crystalhd_adp *adp)
|
|
|
|
|
/*crystalhd_delete_elem_pool(adp); */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-static int __devinit chd_pci_reserve_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
+static int chd_pci_reserve_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
{
|
|
|
|
|
struct device *dev = &pinfo->pdev->dev;
|
|
|
|
|
int rc;
|
|
|
|
|
@@ -582,7 +582,7 @@ static int __devinit chd_pci_reserve_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-static void __devexit chd_pci_release_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
+static void chd_pci_release_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
{
|
|
|
|
|
if (!pinfo)
|
|
|
|
|
return;
|
|
|
|
|
@@ -597,7 +597,7 @@ static void __devexit chd_pci_release_mem(struct crystalhd_adp *pinfo)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-static void __devexit chd_dec_pci_remove(struct pci_dev *pdev)
|
|
|
|
|
+static void chd_dec_pci_remove(struct pci_dev *pdev)
|
|
|
|
|
{
|
|
|
|
|
struct crystalhd_adp *pinfo;
|
|
|
|
|
BC_STATUS sts = BC_STS_SUCCESS;
|
|
|
|
|
@@ -625,7 +625,7 @@ static void __devexit chd_dec_pci_remove(struct pci_dev *pdev)
|
|
|
|
|
g_adp_info = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-static int __devinit chd_dec_pci_probe(struct pci_dev *pdev,
|
|
|
|
|
+static int chd_dec_pci_probe(struct pci_dev *pdev,
|
|
|
|
|
const struct pci_device_id *entry)
|
|
|
|
|
{
|
|
|
|
|
struct device *dev = &pdev->dev;
|
|
|
|
|
@@ -815,7 +815,7 @@ MODULE_DEVICE_TABLE(pci, chd_dec_pci_id_table);
|
|
|
|
|
static struct pci_driver bc_chd_driver = {
|
|
|
|
|
.name = "crystalhd",
|
|
|
|
|
.probe = chd_dec_pci_probe,
|
|
|
|
|
- .remove = __devexit_p(chd_dec_pci_remove),
|
|
|
|
|
+ .remove = chd_dec_pci_remove,
|
|
|
|
|
.id_table = chd_dec_pci_id_table,
|
|
|
|
|
.suspend = chd_dec_pci_suspend,
|
|
|
|
|
.resume = chd_dec_pci_resume
|
|
|
|
|
diff --git a/driver/linux/crystalhd_misc.c b/driver/linux/crystalhd_misc.c
|
|
|
|
|
index 410ab9d..56fbb51 100644
|
|
|
|
|
--- a/driver/linux/crystalhd_misc.c
|
|
|
|
|
+++ b/driver/linux/crystalhd_misc.c
|
|
|
|
|
@@ -512,8 +512,8 @@ void *crystalhd_dioq_fetch_wait(struct crystalhd_hw *hw, uint32_t to_secs, uint3
|
|
|
|
|
if(down_interruptible(&hw->fetch_sem))
|
|
|
|
|
goto sem_error;
|
|
|
|
|
r_pkt = crystalhd_dioq_fetch(ioq);
|
|
|
|
|
- /* If format change packet, then return with out checking anything */
|
|
|
|
|
- if (r_pkt->flags & (COMP_FLAG_PIB_VALID | COMP_FLAG_FMT_CHANGE))
|
|
|
|
|
+ /* If format change packet then return without checking anything */
|
|
|
|
|
+ if (!r_pkt || r_pkt->flags & (COMP_FLAG_PIB_VALID | COMP_FLAG_FMT_CHANGE))
|
|
|
|
|
goto sem_rel_return;
|
|
|
|
|
if (hw->adp->pdev->device == BC_PCI_DEVID_LINK) {
|
|
|
|
|
picYcomp = link_GetRptDropParam(hw, hw->PICHeight, hw->PICWidth, (void *)r_pkt);
|