@@ -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;
}
@@ -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;
}
@@ -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;
}
@@ -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 */
@@ -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
@@ -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);