/* Driver for Microtech DPCM-USB CompactFlash/SmartMedia reader
 *
 * $Id: dpcm.c,v 1.4 2001/06/11 02:54:25 mdharm Exp $
 *
 * DPCM driver v0.1:
 *
 * First release
 *
 * Current development and maintenance by:
 *   (c) 2000 Brian Webb (webbb@earthlink.net)
 *
 * This device contains both a CompactFlash card reader, which
 * uses the Control/Bulk w/o Interrupt protocol and
 * a SmartMedia card reader that uses the same protocol
 * as the SDDR09.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>

#include "usb.h"
#include "transport.h"
#include "protocol.h"
#include "debug.h"
#include "dpcm.h"
#include "sddr09.h"

/*
 * Transport for the Microtech DPCM-USB
 *
 */
int dpcm_transport(struct scsi_cmnd *srb, struct us_data *us)
{
	int ret;

	if (srb == NULL)
		return USB_STOR_TRANSPORT_ERROR;

	US_DEBUGP("dpcm_transport: LUN=%d\n", srb->device->lun);

	switch (srb->device->lun) {
		case 0:

			/*
			 * LUN 0 corresponds to the CompactFlash card reader.
			 */
			ret = usb_stor_CB_transport(srb, us);
			break;

#ifdef CONFIG_USB_STORAGE_SDDR09
		case 1:

			/*
			 * LUN 1 corresponds to the SmartMedia card reader.
			 */

			/*
			 * Set the LUN to 0 (just in case).
			 */
			srb->device->lun = 0; us->srb->device->lun = 0;
			ret = sddr09_transport(srb, us);
			srb->device->lun = 1; us->srb->device->lun = 1;
			break;

#endif

		default:
			US_DEBUGP("dpcm_transport: Invalid LUN %d\n", srb->device->lun);
			ret = USB_STOR_TRANSPORT_ERROR;
			break;
	}
	return ret;
}
