コード例 #1
0
static irqreturn_t cp_idpram_irq_handler(int irq, void *data)
{
	struct dpram_link_device *dpld = (struct dpram_link_device *)data;
	struct link_device *ld = (struct link_device *)&dpld->ld;
	u16 int2ap;

	if (unlikely(ld->mode == LINK_MODE_OFFLINE))
		return IRQ_HANDLED;

	if (dpram_wake_up(dpld) < 0) {
		log_dpram_status(dpld);
		trigger_force_cp_crash(dpld);
		return IRQ_HANDLED;
	}

	int2ap = recv_intr(dpld);

	dpram_intr_handler(dpld, int2ap);

	clear_intr(dpld);

	dpram_allow_sleep(dpld);

	return IRQ_HANDLED;
}
コード例 #2
0
static irqreturn_t dpram_irq_handler(int irq, void *data)
{
	struct dpram_link_device *dpld = (struct dpram_link_device *)data;
	struct link_device *ld = (struct link_device *)&dpld->ld;
	u16 int2ap = 0;

	if (unlikely(ld->mode == LINK_MODE_OFFLINE))
		return IRQ_HANDLED;

	if (dpram_wake_up(dpld) < 0) {
		log_dpram_status(dpld);
		trigger_force_cp_crash(dpld);
		return IRQ_HANDLED;
	}

	int2ap = recv_intr(dpld);

	if (unlikely(int2ap == INT_POWERSAFE_FAIL)) {
		mif_info("%s: int2ap == INT_POWERSAFE_FAIL\n", ld->name);
		goto exit;
	} else if (int2ap == 0x1234 || int2ap == 0xDBAB || int2ap == 0xABCD) {
		if (dpld->ext_op && dpld->ext_op->dload_cmd_handler) {
			dpld->ext_op->dload_cmd_handler(dpld, int2ap);
			goto exit;
		}
	}

	if (unlikely(EXT_UDL_CMD(int2ap))) {
		if (likely(EXT_INT_VALID(int2ap))) {
			if (UDL_CMD_VALID(int2ap))
				udl_command_handler(dpld, int2ap);
			else if (EXT_CMD_VALID(int2ap))
				ext_command_handler(dpld, int2ap);
			else
				mif_info("%s: ERR! invalid intr 0x%04X\n",
					ld->name, int2ap);
		} else {
			mif_info("%s: ERR! invalid intr 0x%04X\n",
				ld->name, int2ap);
		}
	} else {
		if (likely(INT_VALID(int2ap))) {
			if (unlikely(INT_CMD_VALID(int2ap)))
				command_handler(dpld, int2ap);
			else
				non_command_handler(dpld, int2ap);
		} else {
			mif_info("%s: ERR! invalid intr 0x%04X\n",
				ld->name, int2ap);
		}
	}

exit:
	clear_intr(dpld);
	dpram_allow_sleep(dpld);
	return IRQ_HANDLED;
}
コード例 #3
0
ファイル: message.c プロジェクト: no7dw/cpp-learning
static void
printer_flushing(void)
{
    clear_intr();            /* don't catch SIGINT */

    tty_flush();            /* empty tty input and output queues */
    block_write(&eofc, 1);    /* send an EOF to the printer */

    proc_upto_eof(1);        /* this call won't be recursive,
                               since we specify to ignore input */
    get_page(&end_page);
    do_acct();
    exit(EXIT_SUCCESS);
}
コード例 #4
0
static int dpram_ioctl(struct link_device *ld, struct io_device *iod,
		unsigned int cmd, unsigned long arg)
{
	int err = -EFAULT;
	struct dpram_link_device *dpld = to_dpram_link_device(ld);

	mif_info("%s: cmd 0x%08X\n", ld->name, cmd);

	switch (cmd) {
	case IOCTL_DPRAM_SEND_BOOT:
		if (dpld->ext_op && dpld->ext_op->download_boot) {
			err = dpld->ext_op->download_boot(dpld, (void *)arg);
			if (err < 0) {
				mif_info("%s: ERR! download_boot fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_PHONE_POWON:
		if (dpld->ext_op && dpld->ext_op->prepare_download) {
			err = dpld->ext_op->prepare_download(dpld);
			if (err < 0) {
				mif_info("%s: ERR! prepare_download fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_PHONEIMG_LOAD:
		if (dpld->ext_op && dpld->ext_op->download_bin) {
			err = dpld->ext_op->download_bin(dpld, (void *)arg);
			if (err < 0) {
				mif_info("%s: ERR! download_bin fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_NVDATA_LOAD:
		if (dpld->ext_op && dpld->ext_op->download_nv) {
			err = dpld->ext_op->download_nv(dpld, (void *)arg);
			if (err < 0) {
				mif_info("%s: ERR! download_nv fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_PHONE_BOOTSTART:
		if (dpld->ext_op && dpld->ext_op->cp_boot_start) {
			err = dpld->ext_op->cp_boot_start(dpld);
			if (err < 0) {
				mif_info("%s: ERR! cp_boot_start fail\n",
					ld->name);
				goto exit;
			}
		}
		if (dpld->ext_op && dpld->ext_op->cp_boot_post_process) {
			err = dpld->ext_op->cp_boot_post_process(dpld);
			if (err < 0) {
				mif_info("%s: ERR! cp_boot_post_process fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_PHONE_UPLOAD_STEP1:
		disable_irq_nosync(dpld->irq);

		if (dpld->ext_op && dpld->ext_op->upload_step1) {
			err = dpld->ext_op->upload_step1(dpld);
			if (err < 0) {
				clear_intr(dpld);
				enable_irq(dpld->irq);
				mif_info("%s: ERR! upload_step1 fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_PHONE_UPLOAD_STEP2:
		if (dpld->ext_op->upload_step2) {
			err = dpld->ext_op->upload_step2(dpld, (void *)arg);
			if (err < 0) {
				clear_intr(dpld);
				enable_irq(dpld->irq);
				mif_info("%s: ERR! upload_step2 fail\n",
					ld->name);
				goto exit;
			}
		}
		break;

	case IOCTL_DPRAM_INIT_STATUS:
		mif_debug("%s: get dpram init status\n", ld->name);
		return dpld->dpram_init_status;

	case IOCTL_MODEM_DL_START:
		err = dpram_set_dload_magic(ld, iod);
		if (err < 0) {
			mif_info("%s: ERR! dpram_set_dload_magic fail\n",
				ld->name);
			goto exit;
		}

	default:
		break;
	}

	return 0;

exit:
	return err;
}