Example #1
0
//---------------------------------------------------------------------------
int part_connect(mass_dev* dev)
{
	part_table partTable;
	unsigned int count = 0, i;
	XPRINTF("USBHDFSD: part_connect devId %i \n", dev->devId);

	if (part_getPartitionTable(dev, &partTable) < 0)
		return -1;

	for ( i = 0; i < 4; i++)
	{
		if(
			partTable.record[ i ].sid == 6    ||
			partTable.record[ i ].sid == 4    ||
			partTable.record[ i ].sid == 1    ||  // fat 16, fat 12
			partTable.record[ i ].sid == 0x0B ||
			partTable.record[ i ].sid == 0x0C ||  // fat 32
			partTable.record[ i ].sid == 0x0E)    // fat 16 LBA
		{
			XPRINTF("USBHDFSD: mount partition %d\n", i);
			if (fat_mount(dev, partTable.record[i].start, partTable.record[i].count) >= 0)
				count++;
		}
	}

	if ( count == 0 )
	{	// no partition table detected
		// try to use "floppy" option
		XPRINTF("USBHDFSD: mount drive\n");
		if (fat_mount(dev, 0, dev->maxLBA) < 0)
			return -1;
	}

	return 0;
}
Example #2
0
/*
 * (*kp) and k have the same mod and keysym.  Both have a non-null ->chain.
 * if there is a key in the (*kp)->chain list (*lp) that has the same mod and
 * keysm as k->chain, then free (*lp) and set its location to *kp->chain
 */
static void
mergechain(Key *c, Key *k)
{
	Key **lp;
	Key *next = k->chain;

	XPRINTF("Merging chain %s\n", showchain(k));
	XPRINTF("   into chain %s\n", showchain(c));
	k->chain = NULL;
	freekey(k);
	k = next;

	for (lp = &c->chain; *lp; lp = &(*lp)->cnext)
		if ((*lp)->mod == k->mod && (*lp)->keysym == k->keysym)
			break;
	if (*lp) {
		if ((*lp)->chain && k->chain)
			mergechain(*lp, k);
		else {
			XPRINTF("Overriding previous key alternate %s!\n", showchain(k));
			k->cnext = (*lp)->cnext;
			(*lp)->cnext = NULL;
			freechain(*lp);
			*lp = k;
		}
	} else {
		k->cnext = NULL;
		*lp = k;
	}
}
Example #3
0
File: erq.c Project: amotzkau/ldmud
/*-------------------------------------------------------------------------*/
int
writen (int fd, char *mesg, int len, struct equeue_s **qpp)

/* Send or queue the message <mesg> (length <len> bytes) to <fd>.
 * If *<qpp> is non-NULL, the message is queued immediately.
 * Otherwise, the function tries to send as much of the message
 * as possible, and the queues whatever is left.
 */

{
    int l = 0;

    XPRINTF((stderr, "%s writen(%d, %p:%d, %p (-> %p) ))\n"
                   , time_stamp(), fd, mesg, len, qpp, *qpp));
    if (!(*qpp))
    {
        /* Send as much of the message as possible */
        do
            l = write(fd, mesg, len);
        while (l == -1 && errno == EINTR);
        XPRINTF((stderr, "%s   Wrote %d bytes.\n", time_stamp(), l));
        if (l < 0 || l == len)
            return l;
        mesg += l;
        len -= l;
    }

    if (!len)
        return 0;

    XPRINTF((stderr, "%s   Queuing data %p:%d\n", time_stamp(), mesg, len));
    add_to_queue(qpp, mesg, len, 0);
    return l;
} /* writen() */
Example #4
0
static int mass_stor_warmup(mass_dev *dev) {
	inquiry_data id;
	sense_data sd;
	read_capacity_data rcd;
	int stat;

	XPRINTF("USBHDFSD: mass_stor_warmup\n");

	if (!(dev->status & USBMASS_DEV_STAT_CONN)) {
		printf("USBHDFSD: Error - no mass storage device found!\n");
		return -1;
	}

	stat = usb_bulk_get_max_lun(dev);
	XPRINTF("USBHDFSD: usb_bulk_get_max_lun %d\n", stat);

	memset(&id, 0, sizeof(inquiry_data));
	if ((stat = cbw_scsi_inquiry(dev, &id, sizeof(inquiry_data))) < 0) {
		printf("USBHDFSD: Error - cbw_scsi_inquiry %d\n", stat);
		return -1;
	}

	printf("USBHDFSD: Vendor: %.8s\n", id.vendor);
	printf("USBHDFSD: Product: %.16s\n", id.product);
	printf("USBHDFSD: Revision: %.4s\n", id.revision);

	while((stat = cbw_scsi_test_unit_ready(dev)) != 0)
	{
		printf("USBHDFSD: Error - cbw_scsi_test_unit_ready %d\n", stat);

		stat = cbw_scsi_request_sense(dev, &sd, sizeof(sense_data));
		if (stat != 0)
			printf("USBHDFSD: Error - cbw_scsi_request_sense %d\n", stat);

		if ((sd.error_code == 0x70) && (sd.sense_key != 0x00))
		{
			printf("USBHDFSD: Sense Data key: %02X code: %02X qual: %02X\n", sd.sense_key, sd.add_sense_code, sd.add_sense_qual);

			if ((sd.sense_key == 0x02) && (sd.add_sense_code == 0x04) && (sd.add_sense_qual == 0x02))
			{
				printf("USBHDFSD: Error - Additional initalization is required for this device!\n");
				if ((stat = cbw_scsi_start_stop_unit(dev)) != 0) {
					printf("USBHDFSD: Error - cbw_scsi_start_stop_unit %d\n", stat);
					return -1;
				}
			}
		}
	}

	if ((stat = cbw_scsi_read_capacity(dev, &rcd, sizeof(read_capacity_data))) != 0) {
		printf("USBHDFSD: Error - cbw_scsi_read_capacity %d\n", stat);
		return -1;
	}

	dev->sectorSize = getBI32(&rcd.block_length);
	dev->maxLBA     = getBI32(&rcd.last_lba);
	printf("USBHDFSD: sectorSize %u maxLBA %u\n", dev->sectorSize, dev->maxLBA);

	return 0;
}
Example #5
0
//---------------------------------------------------------------------------
static int fs_getstat(iop_file_t *fd, const char *name, fio_stat_t *stat)
{
	fat_driver* fatd;
	int ret;
	unsigned int cluster = 0;
	fat_dir fatdir;

	_fs_lock();

	XPRINTF("USBHDFSD: fs_getstat called: unit %d name %s\n", fd->unit, name);

	fatd = fat_getData(fd->unit);
	if (fatd == NULL) { _fs_unlock(); return -ENODEV; }

	XPRINTF("USBHDFSD: Calling fat_getFileStartCluster from fs_getstat\n");
	ret = fat_getFileStartCluster(fatd, name, &cluster, &fatdir);
	if (ret < 0) {
		_fs_unlock();
		return ret;
	}

	memset(stat, 0, sizeof(fio_stat_t));
	fillStat(stat, &fatdir);

	_fs_unlock();
	return 0;
}
Example #6
0
static Key *
parsechain(const char *s, const char *e, Key *spec)
{
	const char *p, *q;
	Key *chain = NULL, *last = NULL;

	XPRINTF("Parsing chain from: '%s'\n", s);

	for (p = s; p < e; p = (*q == ':' ? q + 1 : q)) {
		Key *k;

		for (q = p;
		     q < e && (isalnum(*q) || isblank(*q) || *q == '_' || *q == '+');
		     q++) ;
		if (q < e && *q != ':')
			q = e;
		k = ecalloc(1, sizeof(*k));
		*k = *spec;
		if (!parsekey(p, q, k)) {
			freekey(k);
			freechain(chain);
			chain = last = NULL;
			break;
		}
		chain = chain ? : k;
		if (last) {
			last->func = &k_chain;
			last->chain = k;
		}
		last = k;
	}
	if (chain)
		XPRINTF("Parsed chain: %s\n", showchain(chain));
	return chain;
}
Example #7
0
//---------------------------------------------------------------------------
int scache_writeSector(cache_set* cache, unsigned int sector) {
	int index; //index is given in single sectors not octal sectors
	//int ret;

	XPRINTF("cache: writeSector devId = %i sector = %i \n", cache->dev->devId, sector);

	index = getSlot(cache, sector);
	if (index <  0) { //sector not found in cache
		printf("cache: writeSector: ERROR! the sector is not allocated! \n");
		return -1;
	}
	XPRINTF("cache: slotFound=%i \n", index);

	//prefere written sectors to stay in cache longer than read sectors
	cache->rec[index].tax += 2;

	//set dirty status
	cache->rec[index].writeDirty = 1;
	cache->writeFlag++;

	XPRINTF("cache: done soft writing sector \n");

	//write precaution
	//cache->flushCounter++;
	//if (cache->flushCounter == FLUSH_TRIGGER) {
		//scache_flushSectors(devId);
	//}

	return cache->sectorSize;
}
Example #8
0
/*
	flush dirty sectors
 */
int scache_flushSectors(cache_set* cache) {
	int i,ret;
	int counter = 0;

	XPRINTF("cache: flushSectors devId = %i \n", cache->dev->devId);

	//cache->flushCounter = 0;

	XPRINTF("scache: flushSectors writeFlag=%d\n", cache->writeFlag);
	//no write operation occured since last flush
	if (cache->writeFlag==0) {
		return 0;
	}

	for (i = 0; i < CACHE_SIZE; i++) {
		if (cache->rec[i].writeDirty) {
			XPRINTF("scache: flushSectors dirty index=%d sector=%d \n", i, cache->rec[i].sector);
			ret = WRITE_SECTOR(cache->dev, cache->rec[i].sector, cache->sectorBuf + (i * BLOCK_SIZE), BLOCK_SIZE);
			cache->rec[i].writeDirty = 0;
			//TODO - error handling
			if (ret < 0) {
				printf("scache: ERROR writing sector to disk! sector=%d\n", cache->rec[i].sector);
				return ret;
			}
			counter ++;
		}
	}
	cache->writeFlag = 0;
	return counter;
}
Example #9
0
//---------------------------------------------------------------------------
cache_set* scache_init(mass_dev* dev, int sectSize)
{
	cache_set* cache;
	XPRINTF("cache: init devId = %i sectSize = %i \n", dev->devId, sectSize);

	cache = malloc(sizeof(cache_set));
	if (cache == NULL) {
		printf("scache init! Sector cache: can't alloate cache!\n");
		return NULL;
	}
    
    XPRINTF("scache init! \n");
    cache->dev = dev;
    
    XPRINTF("sectorSize: 0x%x\n", cache->sectorSize);
    cache->sectorBuf = (unsigned char*) malloc(BLOCK_SIZE * CACHE_SIZE);
    if (cache->sectorBuf == NULL) {
        printf("Sector cache: can't alloate memory of size:%d \n", BLOCK_SIZE * CACHE_SIZE);
        free(cache);
        return NULL;
    }
    XPRINTF("Sector cache: allocated memory at:%p of size:%d \n", cache->sectorBuf, BLOCK_SIZE * CACHE_SIZE);

    //added by Hermes
    cache->sectorSize = sectSize;
    cache->indexLimit = BLOCK_SIZE/cache->sectorSize; //number of sectors per 1 cache slot
    cache->cacheAccess = 0;
    cache->cacheHits = 0;
    initRecords(cache);
	return cache;
}
Example #10
0
int ieee1394_SendCommandBlockORB(struct SBP2Device *dev, struct CommandDescriptorBlock *firstCDB){
	int result, retries;
	struct sbp2_pointer address;

	memset((unsigned char *)statusFIFO, 0, sizeof(statusFIFO));

	address.low=(u32)firstCDB;
	address.NodeID=dev->InitiatorNodeID;
	address.high=0;

	retries=0;

	/* Write the pointer to the first ORB in the fetch agent's NEXT_ORB register. */
	while((result=iLinkTrWrite(dev->trContext, dev->CommandBlockAgent_high, dev->CommandBlockAgent_low+0x08, &address, 8))<0){
		XPRINTF("Error writing to the Fetch Agent's ORB_POINTER register @ 0x%08lx %08lx. Code: %d.\n", dev->CommandBlockAgent_high, dev->CommandBlockAgent_low+0x08, result);

		DelayThread(200000);
		ieee1394_ResetFetchAgent(dev);

		retries++;
		if(retries>3) return(-1);
	}

#if 0
	/* Write a value to the fetch agent's DOORBELL register. */
	result=1;
	if((result=iLinkTrWrite(dev->trContext, dev->CommandBlockAgent_high, dev->CommandBlockAgent_low+0x10, &result, 4))<0){
		XPRINTF("Error writing to the Fetch Agent's DOORBELL register @ 0x%08lx %08lx. Code: %d.\n", dev->CommandBlockAgent_high, dev->CommandBlockAgent_low+0x10, result);
		return -2;
	}
#endif

	return 1;
}
Example #11
0
/*-------------------------------------------------------------------------*/
static void
free_socket (socket_t *sp)

/* The socket in structure <sp> has been closed already, now remove the
 * structure from the socket list and free it and all still pending
 * data.
 */

{
    socket_t **spp;
    equeue_t *qp, *qnext;

    XPRINTF((stderr, "%s Freeing socket %p\n", time_stamp(), sp));
    /* Remove the socket from the socket */
    for (spp = &sockets; *spp; spp = &(*spp)->next)
    {
        if (*spp != sp)
            continue;
        XPRINTF((stderr, "%s   Unlinking socket %p\n", time_stamp(), sp));
        *spp = sp->next;
        break;
    }

    /* Free all pending queued data */
    for (qp = sp->queue; qp;)
    {
        XPRINTF((stderr, "%s   Freeing queue %p\n", time_stamp(), qp));
        qnext = qp->next;
        free(qp);
        qp = qnext;
    }
    
    free(sp);
} /* free_socket() */
Example #12
0
int mass_stor_probe(int devId)
{
	UsbDeviceDescriptor *device = NULL;
	UsbConfigDescriptor *config = NULL;
	UsbInterfaceDescriptor *intf = NULL;

	XPRINTF("USBHDFSD: probe: devId=%i\n", devId);

    mass_dev* mass_device = mass_stor_findDevice(devId, 0);
    
	/* only one device supported */
	if ((mass_device != NULL) && (mass_device->status & DEVICE_DETECTED))
	{
		printf("USBHDFSD: Error - only one mass storage device allowed ! \n");
		return 0;
	}

	/* get device descriptor */
	device = (UsbDeviceDescriptor*)UsbGetDeviceStaticDescriptor(devId, NULL, USB_DT_DEVICE);
	if (device == NULL)  {
		printf("USBHDFSD: Error - Couldn't get device descriptor\n");
		return 0;
	}

	/* Check if the device has at least one configuration */
	if (device->bNumConfigurations < 1) { return 0; }

	/* read configuration */
	config = (UsbConfigDescriptor*)UsbGetDeviceStaticDescriptor(devId, device, USB_DT_CONFIG);
	if (config == NULL) {
	    printf("USBHDFSD: Error - Couldn't get configuration descriptor\n");
	    return 0;
	}
	/* check that at least one interface exists */
    XPRINTF("USBHDFSD: bNumInterfaces %d\n", config->bNumInterfaces);
	if ((config->bNumInterfaces < 1) ||
		(config->wTotalLength < (sizeof(UsbConfigDescriptor) + sizeof(UsbInterfaceDescriptor)))) {
		    printf("USBHDFSD: Error - No interfaces available\n");
		    return 0;
	}
        /* get interface */
	intf = (UsbInterfaceDescriptor *) ((char *) config + config->bLength); /* Get first interface */
    XPRINTF("USBHDFSD: bInterfaceClass %X bInterfaceSubClass %X bInterfaceProtocol %X\n",
        intf->bInterfaceClass, intf->bInterfaceSubClass, intf->bInterfaceProtocol);

	if ((intf->bInterfaceClass		!= USB_CLASS_MASS_STORAGE) ||
		(intf->bInterfaceSubClass	!= USB_SUBCLASS_MASS_SCSI  &&
		 intf->bInterfaceSubClass	!= USB_SUBCLASS_MASS_SFF_8070I) ||
		(intf->bInterfaceProtocol	!= USB_PROTOCOL_MASS_BULK_ONLY) ||
		(intf->bNumEndpoints < 2))    { //one bulk endpoint is not enough because
			return 0;		//we send the CBW to te bulk out endpoint
	}
	return 1;
}
Example #13
0
inline int cbw_scsi_read_capacity(mass_dev* dev, void *buffer, int size)
{
    int ret;
    cbw_packet cbw;
    int retryCount;
    
    XPRINTF("USBHDFSD: cbw_scsi_read_capacity\n");

    cbw.signature = CBW_TAG;
    cbw.lun = 0;
	cbw.tag = -TAG_READ_CAPACITY;
	cbw.dataTransferLength = size;	//READ_CAPACITY_REPLY_LENGTH
	cbw.flags = 0x80;			//inquiry data will flow In
	cbw.comLength = 12;

	//scsi command packet
	cbw.comData[0] = 0x25;		//read capacity operation code
	cbw.comData[1] = 0;			//lun/reserved/RelAdr
	cbw.comData[2] = 0;			//LBA 1
	cbw.comData[3] = 0;			//LBA 2
	cbw.comData[4] = 0;			//LBA 3
	cbw.comData[5] = 0;			//LBA 4
	cbw.comData[6] = 0;			//Reserved
	cbw.comData[7] = 0;			//Reserved
	cbw.comData[8] = 0;			//Reserved/PMI
	cbw.comData[9] = 0;			//reserved
	cbw.comData[10] = 0;		//reserved
	cbw.comData[11] = 0;		//reserved

	ret = 1;
	retryCount = 6;
	while (ret != 0 && retryCount > 0) {
		usb_bulk_command(dev, &cbw);

		ret = usb_bulk_transfer(dev->bulkEpI, buffer, size);
        if (ret != 0)
            printf("USBHDFSD: cbw_scsi_read_capacity error from usb_bulk_transfer %d\n", ret);

		//HACK HACK HACK !!!
		//according to usb doc we should allways
		//attempt to read the CSW packet. But in some cases
		//reading of CSW packet just freeze ps2....:-(
        if (ret == USB_RC_STALL) {
            XPRINTF("USBHDFSD: call reset recovery ...\n");
			usb_bulk_reset(dev, 1);
		} else {
			ret = usb_bulk_manage_status(dev, -TAG_READ_CAPACITY);
		}
		retryCount--;
	}
    return ret;
}
Example #14
0
/* test that endpoint is bulk endpoint and if so, update device info */
static void usb_bulk_probeEndpoint(int devId, mass_dev* dev, UsbEndpointDescriptor* endpoint) {
	if (endpoint->bmAttributes == USB_ENDPOINT_XFER_BULK) {
		/* out transfer */
		if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT && dev->bulkEpO < 0) {
			dev->bulkEpO = UsbOpenEndpointAligned(devId, endpoint);
			XPRINTF("USBHDFSD: register Output endpoint id =%i addr=%02X packetSize=%i\n", dev->bulkEpO, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB<<8 | endpoint->wMaxPacketSizeLB);
		} else
		/* in transfer */
		if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN && dev->bulkEpI < 0) {
			dev->bulkEpI = UsbOpenEndpointAligned(devId, endpoint);
			XPRINTF("USBHDFSD: register Input endpoint id =%i addr=%02X packetSize=%i\n", dev->bulkEpI, endpoint->bEndpointAddress, (unsigned short int)endpoint->wMaxPacketSizeHB<<8 | endpoint->wMaxPacketSizeLB);
		}
	}
}
Example #15
0
static int ieee1394_GetFetchAgentState(struct SBP2Device *dev){
	unsigned long int FetchAgentState;
	int result;

	if((result=iLinkTrRead(dev->trContext, dev->CommandBlockAgent_high, dev->CommandBlockAgent_low, &FetchAgentState, 4))<0){
		XPRINTF("Error reading the Fetch Agent's AGENT_STATE register @ 0x%08lx %08lx. Code: %d.\n", dev->CommandBlockAgent_high, dev->CommandBlockAgent_low, result);
		return -1;
	}
	else{
		FetchAgentState=BSWAP32(FetchAgentState);
		XPRINTF("Fetch Agent state: %lu.\n", FetchAgentState);
		return FetchAgentState;
	}
}
Example #16
0
int InitUSB(void)
{
	int i;
	int ret = 0;
	for (i = 0; i < NUM_DEVICES; ++i)
	{
		g_mass_device[i].status = 0;
		g_mass_device[i].devId = -1;
	}

	driver.next 		= NULL;
	driver.prev		= NULL;
	driver.name 		= "mass-stor";
	driver.probe 		= mass_stor_probe;
	driver.connect		= mass_stor_connect;
	driver.disconnect	= mass_stor_disconnect;

	ret = UsbRegisterDriver(&driver);
	XPRINTF("USBHDFSD: registerDriver=%i \n", ret);
	if (ret < 0)
	{
		printf("USBHDFSD: register driver failed! ret=%d\n", ret);
		return(-1);
	}

	return(0);
}
Example #17
0
//---------------------------------------------------------------------------
static int part_getPartitionTable(mass_dev* dev, part_table* part)
{
	part_raw_record* part_raw;
	int ret;
	unsigned int i;
	unsigned char* sbuf;

	ret = READ_SECTOR(dev, 0, sbuf);  // read sector 0 - Disk MBR or boot sector
	if ( ret < 0 )
	{
		XPRINTF("USBHDFSD: part_getPartitionTable read failed %d!\n", ret);
		return -EIO;
	}

	printf("USBHDFSD: boot signature %X %X\n", sbuf[0x1FE], sbuf[0x1FF]);
	if (sbuf[0x1FE] == 0x55 && sbuf[0x1FF] == 0xAA)
	{
		for ( i = 0; i < 4; i++)
		{
			part_raw = ( part_raw_record* )(  sbuf + 0x01BE + ( i * 16 )  );
			part_getPartitionRecord(part_raw, &part->record[i]);
		}
		return 4;
	}
	else
	{
		for ( i = 0; i < 4; i++)
		{
			part->record[i].sid = 0;;
		}
		return 0;
	}
}
Example #18
0
static int usb_bulk_status(mass_dev* dev, csw_packet* csw, unsigned int tag) {
	int ret;
	usb_callback_data cb_data;

	cb_data.semh = dev->ioSema;

	csw->signature = CSW_TAG;
	csw->tag = tag;
	csw->dataResidue = 0;
	csw->status = 0;

	ret = UsbBulkTransfer(
		dev->bulkEpI,		//bulk input pipe
		csw,			//data ptr
		13,	//data length
		usb_callback,
		(void*)&cb_data
        );

	if (ret == USB_RC_OK) {
		WaitSema(cb_data.semh);
		ret = cb_data.returnCode;

#ifdef DEBUG
		if (cb_data.returnSize != 13)
			printf("USBHDFSD: bulk csw.status returnSize: %i != 13\n", cb_data.returnSize);
		if (csw->dataResidue != 0)
			printf("USBHDFSD: bulk csw.status residue: %i\n", csw->dataResidue);
		XPRINTF("USBHDFSD: bulk csw result: %d, csw.status: %i\n", ret, csw->status);
#endif
	}

	return ret;
}
Example #19
0
int mass_stor_configureNextDevice(void)
{
	int i;

	XPRINTF("USBHDFSD: configuring devices... \n");

	for (i = 0; i < NUM_DEVICES; ++i)
	{
		mass_dev *dev = &g_mass_device[i];
		if (dev->devId != -1 && (dev->status & USBMASS_DEV_STAT_CONN) && !(dev->status & USBMASS_DEV_STAT_CONF))
		{
			int ret;
			usb_set_configuration(dev, dev->configId);
			usb_set_interface(dev, dev->interfaceNumber, dev->interfaceAlt);
			dev->status |= USBMASS_DEV_STAT_CONF;

			ret = mass_stor_warmup(dev);
			if (ret < 0)
			{
				printf("USBHDFSD: Error - failed to warmup device %d\n", dev->devId);
				mass_stor_release(dev);
				continue;
			}

			dev->cache = scache_init(dev, dev->sectorSize); // modified by Hermes
			if (dev->cache == NULL) {
				printf("USBHDFSD: Error - scache_init failed \n" );
				continue;
			}

			return part_connect(dev) >= 0;
		}
	}
	return 0;
}
Example #20
0
void
parsekeys(const char *s, Key *spec)
{
	const char *p, *e;
	Key *k;

	XPRINTF("Parsing key: '%s'\n", s);
	for (p = s; *p != '\0'; p = (*e == ',' ? e + 1 : e)) {
		/* need to escape ',' in command */
		for (e = p; *e != '\0' && (*e != ',' || (e > p && *(e - 1) == '\\')); e++) ;
		if ((k = parsechain(p, e, spec))) {
			XPRINTF("Adding key: '%s'\n", s);
			addchain(k);
		}
	}
}
Example #21
0
/* select the best record where to store new sector */
int getIndexWrite(cache_set* cache, unsigned int sector) {
	int i, ret;
	int minTax = 0x0FFFFFFF;
	int index = 0;

	for (i = 0; i < CACHE_SIZE; i++) {
		if (cache->rec[i].tax < minTax) {
			index = i;
			minTax = cache->rec[i].tax;
		}
	}

	//this sector is dirty - we need to flush it first
	if (cache->rec[index].writeDirty) {
		XPRINTF("scache: getIndexWrite: sector is dirty : %d   index=%d \n", cache->rec[index].sector, index);
		ret = WRITE_SECTOR(cache->dev, cache->rec[index].sector, cache->sectorBuf + (index * BLOCK_SIZE), BLOCK_SIZE);
		cache->rec[index].writeDirty = 0;
		//TODO - error handling
		if (ret < 0) {
			printf("scache: ERROR writing sector to disk! sector=%d\n", sector);
		}

	}
	cache->rec[index].tax +=2;
	cache->rec[index].sector = sector;

	return index * cache->indexLimit;
}
Example #22
0
static Bool
parsekey(const char *s, const char *e, Key *k)
{
	const char *p, *q;

	XPRINTF("Parsing key from: '%s'\n", s);
	for (p = s; p < e && (isalnum(*p) || isblank(*p) || *p == '_'); p++) ;
	if (p < e && *p == '+') {
		k->mod = parsemod(s, p);
		p++;
	} else
		p = s;
	for (q = p; q < e && (isalnum(*q) || isblank(*q) || *q == '_'); q++) ;
	if (q < e && *q != '=')
		q = e;
	if ((k->keysym = parsesym(p, q)) == NoSymbol) {
		EPRINTF("Failed to parse symbol from '%s' to '%s'\n", p, q);
		return False;
	}
	if (q < e)
		k->arg = parsearg(q + 1, e);
	else if (k->arg)
		k->arg = strdup(k->arg);
	return True;
}
Example #23
0
static int usb_bulk_command(mass_dev* dev, cbw_packet* packet ) {
	int ret;
	usb_callback_data cb_data;

	if(dev->status & USBMASS_DEV_STAT_ERR){
		printf("USBHDFSD: Rejecting I/O to offline device %d.\n", dev->devId);
		return -1;
	}

	cb_data.semh = dev->ioSema;

	ret =  UsbBulkTransfer(
		dev->bulkEpO,		//bulk output pipe
		packet,			//data ptr
		31,	//data length
		usb_callback,
		(void*)&cb_data
	);

	if (ret == USB_RC_OK) {
		WaitSema(cb_data.semh);
		ret = cb_data.returnCode;
	}
	if (ret != USB_RC_OK) {
		XPRINTF("USBHDFSD: Error - sending bulk command %d. Calling reset recovery.\n", ret);
		usb_bulk_reset(dev, 3);
	}

	return ret;
}
Example #24
0
static KeySym
parsesym(const char *s, const char *e)
{
	char *t;
	KeySym sym = NoSymbol;

	for (; s < e && isblank(*s); s++) ;
	for (; e > s && isblank(*(e - 1)); e--) ;
	XPRINTF("Parsing keysym from '%s'\n", s);
	if (s < e && (t = strndup(s, e - s))) {
		if ((sym = XStringToKeysym(t)) == NoSymbol)
			XPRINTF("Failed to parse symbol '%s'\n", t);
		free(t);
	}
	return sym;
}
Example #25
0
static int scsiStartStopUnit(struct SBP2Device* dev)
{
	struct CommandDescriptorBlock cdb;

	XPRINTF("IEEE1394_disk: scsiStartStopUnit.\n");

	cdb.misc=(ORB_NOTIFY | ORB_REQUEST_FORMAT(0) | CDB_MAX_PAYLOAD(dev->max_payload) | CDB_DIRECTION(WRITE_TRANSACTION) | CDB_SPEED(dev->speed));

	cdb.DataDescriptor.low=cdb.DataDescriptor.high=0;
	cdb.DataDescriptor.NodeID=dev->InitiatorNodeID;

	cdb.NextOrb.high=cdb.NextOrb.low=0;
	cdb.NextOrb.reserved=NULL_POINTER;

	//scsi command packet
	cdb.CDBs[3] = 0x1B;		//start stop unit operation code
	cdb.CDBs[2] = 1;		//reserved/immed
	cdb.CDBs[1] = 0;		//reserved
	cdb.CDBs[0] = 0;		//reserved
	cdb.CDBs[7] = 1;		//POWER CONDITIONS/reserved/LoEj/Start "Start the media and acquire the format type"
	cdb.CDBs[6] = 0;		//reserved
	cdb.CDBs[5] = 0;		//reserved
	cdb.CDBs[4] = 0;		//reserved
	cdb.CDBs[11] = 0;		//reserved
	cdb.CDBs[10] = 0;		//reserved
	cdb.CDBs[9] = 0;		//reserved
	cdb.CDBs[8] = 0;		//reserved

     	ieee1394_SendCommandBlockORB(dev, &cdb);
	return(ieee1394_Sync());
}
Example #26
0
static int scsiReadCapacity(struct SBP2Device* dev, void *buffer, int size)
{
	struct CommandDescriptorBlock cdb;

	XPRINTF("IEEE1394_disk: scsiReadCapacity.\n");

	cdb.misc=(ORB_NOTIFY | ORB_REQUEST_FORMAT(0) | CDB_MAX_PAYLOAD(dev->max_payload) | CDB_DIRECTION(WRITE_TRANSACTION) | CDB_SPEED(dev->speed) | CDB_DATA_SIZE(size));

	cdb.DataDescriptor.low=(u32)buffer;
	cdb.DataDescriptor.high=0;
	cdb.DataDescriptor.NodeID=dev->InitiatorNodeID;

	cdb.NextOrb.high=cdb.NextOrb.low=0;
	cdb.NextOrb.reserved=NULL_POINTER;

	//scsi command packet
	cdb.CDBs[3] = 0x25;		//read capacity operation code
	cdb.CDBs[2] = 0;		//reserved
	cdb.CDBs[1] = 0;		//LBA 1
	cdb.CDBs[0] = 0;		//LBA 2
	cdb.CDBs[7] = 0;		//LBA 3
	cdb.CDBs[6] = 0;		//LBA 4
	cdb.CDBs[5] = 0;		//Reserved
	cdb.CDBs[4] = 0;		//Reserved
	cdb.CDBs[11] = 0;		//Reserved
	cdb.CDBs[10] = 0;		//reserved
	cdb.CDBs[9] = 0;		//reserved
	cdb.CDBs[8] = 0;		//reserved

     	ieee1394_SendCommandBlockORB(dev, &cdb);
	return(ieee1394_Sync());
}
Example #27
0
static int scsiTestUnitReady(struct SBP2Device* dev){
	struct CommandDescriptorBlock cdb;

	XPRINTF("IEEE1394_disk: scsiTestUnitReady.\n");

	cdb.misc=(u32)(ORB_NOTIFY | ORB_REQUEST_FORMAT(0) | CDB_MAX_PAYLOAD(dev->max_payload) | CDB_DIRECTION(WRITE_TRANSACTION) | CDB_SPEED(dev->speed));

	cdb.DataDescriptor.low=cdb.DataDescriptor.high=0;
	cdb.DataDescriptor.NodeID=dev->InitiatorNodeID;

	cdb.NextOrb.high=cdb.NextOrb.low=0;
	cdb.NextOrb.reserved=NULL_POINTER;

	//scsi command packet
	cdb.CDBs[3] = 0x00;		//test unit ready operation code
	cdb.CDBs[2] = 0;		//reserved
	cdb.CDBs[1] = 0;		//reserved
	cdb.CDBs[0] = 0;		//reserved
	cdb.CDBs[7] = 0;		//reserved
	cdb.CDBs[6] = 0;		//reserved
	cdb.CDBs[5] = 0;		//reserved
	cdb.CDBs[4] = 0;		//reserved
	cdb.CDBs[11] = 0;		//reserved
	cdb.CDBs[10] = 0;		//reserved
	cdb.CDBs[9] = 0;		//reserved
	cdb.CDBs[8] = 0;		//reserved

    	ieee1394_SendCommandBlockORB(dev, &cdb);
	return(ieee1394_Sync());
}
Example #28
0
inline int cbw_scsi_start_stop_unit(mass_dev* dev)
{
    int ret;
    cbw_packet cbw;
    
    XPRINTF("USBHDFSD: cbw_scsi_start_stop_unit\n");

    cbw.signature = CBW_TAG;
    cbw.lun = 0;
	cbw.tag = -TAG_START_STOP_UNIT;
	cbw.dataTransferLength = 0;	//START_STOP_REPLY_LENGTH
	cbw.flags = 0x80;			//inquiry data will flow In
	cbw.comLength = 12;

	//scsi command packet
	cbw.comData[0] = 0x1B;		//start stop unit operation code
	cbw.comData[1] = 1;			//lun/reserved/immed
	cbw.comData[2] = 0;			//reserved
	cbw.comData[3] = 0;			//reserved
	cbw.comData[4] = 1;			//reserved/LoEj/Start "Start the media and acquire the format type"
	cbw.comData[5] = 0;			//reserved
	cbw.comData[6] = 0;			//reserved
	cbw.comData[7] = 0;			//reserved
	cbw.comData[8] = 0;			//reserved
	cbw.comData[9] = 0;			//reserved
	cbw.comData[10] = 0;		//reserved
	cbw.comData[11] = 0;		//reserved

    usb_bulk_command(dev, &cbw);

    ret = usb_bulk_manage_status(dev, -TAG_START_STOP_UNIT);
    return ret;
}
Example #29
0
/* This is declared as inline as there is only one call to it. */
static inline int ieee1394_Sync_withTimeout(u32 n500mSecUnits){
/*	iop_sys_clock_t timeout_clk;
	u32 ef_result;

	USec2SysClock(n500mSecUnits*500000, &timeout_clk);

	SetAlarm(&timeout_clk, &alarm_cb, NULL);
	WaitEventFlag(sbp2_event_flag, WRITE_REQ_INCOMING|ERROR_TIME_OUT, WEF_OR|WEF_CLEAR, &ef_result);

	if(ef_result&ERROR_TIME_OUT){
		XPRINTF("-=Time out=-\n");
		return(-1);
	}
	else CancelAlarm(&alarm_cb, NULL); */

	unsigned int i=0;

	while(RESP_SRC(((struct sbp2_status *)statusFIFO)->status)==0){
		if(i>n500mSecUnits*10000){
			XPRINTF("-=Time out=-\n");
			return(-1);
		}

		DelayThread(50);
		i++;
	};

	return(ProcessStatus());
}
Example #30
0
inline int cbw_scsi_test_unit_ready(mass_dev* dev)
{
    int ret;
    cbw_packet cbw;
    
    XPRINTF("USBHDFSD: cbw_scsi_test_unit_ready\n");
    
    cbw.signature = CBW_TAG;
    cbw.lun = 0;
	cbw.tag = -TAG_TEST_UNIT_READY;
	cbw.dataTransferLength = 0;		//TUR_REPLY_LENGTH
	cbw.flags = 0x80;			//data will flow In
	cbw.comLength = 12;

	//scsi command packet
	cbw.comData[0] = 0x00;		//test unit ready operation code
	cbw.comData[1] = 0;			//lun/reserved
	cbw.comData[2] = 0;			//reserved
	cbw.comData[3] = 0;			//reserved
	cbw.comData[4] = 0;			//reserved
	cbw.comData[5] = 0;			//reserved
	cbw.comData[6] = 0;			//reserved
	cbw.comData[7] = 0;			//reserved
	cbw.comData[8] = 0;			//reserved
	cbw.comData[9] = 0;			//reserved
	cbw.comData[10] = 0;		//reserved
	cbw.comData[11] = 0;		//reserved

    usb_bulk_command(dev, &cbw);

    ret = usb_bulk_manage_status(dev, -TAG_TEST_UNIT_READY);
    return ret;
}