1 // mtcr.c : Defines the entry point for the DLL application.
\r
5 #include <ib_types.h>
\r
12 #include "mtcr_i2c.h"
\r
13 #include "mthca_vc.h"
\r
15 //-----------------------------------------------------
\r
17 //-----------------------------------------------------
\r
19 #define SUPPORT_I2CM 1
\r
21 #define USB_DEV_NAME "mtusb-1"
\r
22 #define CLEAR(st) memset(&(st), 0, sizeof(st))
\r
26 #define MTCR_DEBUG_ENV "MTCR_DEBUG_LEVEL"
\r
28 ULONG g_DebugLevel = DEBUG_LEVEL_MID;
\r
30 ULONG g_DebugLevel = DEBUG_LEVEL_LOW;
\r
33 //-----------------------------------------------------
\r
35 #define MAX_HCA_NUM 16
\r
38 typedef struct mfile_ibal_t {
\r
40 ib_al_handle_t h_al;
\r
41 ib_ca_handle_t h_ca;
\r
46 BOOL APIENTRY DllMain( HANDLE hModule,
\r
47 DWORD ul_reason_for_call,
\r
52 switch (ul_reason_for_call)
\r
54 case DLL_PROCESS_ATTACH:
\r
55 // s_hCtl = (HANDLE)-1;
\r
56 // ConnectToDriver();
\r
58 pszDbgLevel = getenv(MTCR_DEBUG_ENV);
\r
60 g_DebugLevel = atol(pszDbgLevel);
\r
65 case DLL_PROCESS_DETACH:
\r
66 // DisconnectFromDriver();
\r
69 case DLL_THREAD_ATTACH:
\r
70 case DLL_THREAD_DETACH:
\r
77 #define DEVASYS_DEV_ID 12345 /* dummy */
\r
78 #define TAVOR_DEV_ID 23108
\r
79 #define TAVOR_CONF_DEV_ID 23109
\r
80 #define ARBEL_TM_DEV_ID 25208
\r
81 #define ARBEL_TM_CONF_DEV_ID 25209
\r
82 #define ARBEL_DEV_ID 25218
\r
83 #define ARBEL_CONF_DEV_ID 25219
\r
84 #define SINAI_4X_DEV_ID 24204
\r
85 #define SINAI_4X_CONF_DEV_ID 24205
\r
86 #define SINAI_8X_DEV_ID 25204
\r
87 #define SINAI_8X_CONF_DEV_ID 25205
\r
89 #define IS_CONF_DEV(dev_id) \
\r
90 ((dev_id == TAVOR_CONF_DEV_ID) || \
\r
91 (dev_id == ARBEL_TM_CONF_DEV_ID) || \
\r
92 (dev_id == ARBEL_CONF_DEV_ID) || \
\r
93 (dev_id == SINAI_4X_CONF_DEV_ID) || \
\r
94 (dev_id == SINAI_8X_CONF_DEV_ID))
\r
96 #define MAX_DEV_NAME 32
\r
98 USHORT DevId; // Device Id, e.g. 23108
\r
99 UCHAR DevName[MAX_DEV_NAME]; // exported name, e.g. "InfiniHost"
\r
101 } DEVICE_DB_T, *PDEVICE_DB_T;
\r
104 #define TAVOR_TYPE_DEVICE_NAME_FMT "mt%hu_pci%s%hu"
\r
105 #define MDT_DEVICE_NAME_FMT "%s%hu"
\r
107 static DEVICE_DB_T db[] = {
\r
108 { DEVASYS_DEV_ID, "devasys_usb", MDEVS_TAVOR },
\r
109 { TAVOR_DEV_ID, "InfiniHost", MDEVS_TAVOR },
\r
110 { TAVOR_CONF_DEV_ID, "InfiniHostBd", MDEVS_TAVOR_CR },
\r
111 { ARBEL_TM_DEV_ID, "InfiniHost", MDEVS_TAVOR },
\r
112 { ARBEL_TM_CONF_DEV_ID, "InfiniHostBd", MDEVS_TAVOR_CR },
\r
113 { ARBEL_DEV_ID, "InfiniHost_III_Ex", MDEVS_TAVOR },
\r
114 { ARBEL_CONF_DEV_ID, "InfiniHostBd", MDEVS_TAVOR_CR },
\r
115 { SINAI_4X_DEV_ID, "InfiniHost_III_Lx", MDEVS_TAVOR },
\r
116 { SINAI_4X_CONF_DEV_ID, "InfiniHostBd", MDEVS_TAVOR_CR },
\r
117 { SINAI_8X_DEV_ID, "InfiniHost_III_Lx", MDEVS_TAVOR },
\r
118 { SINAI_8X_CONF_DEV_ID, "InfiniHostBd", MDEVS_TAVOR_CR },
\r
120 #define DEVICE_DB_SIZE (sizeof(db) / sizeof(DEVICE_DB_T))
\r
122 Mdevs dmasks[] = { MDEVS_TAVOR_CR, MDEVS_TAVOR_CR, MDEVS_TAVOR_UAR, MDEVS_TAVOR_DDR };
\r
123 char *dsuffix[] = { "conf", "_cr", "_uar", "_ddr"};
\r
124 #define MASKS_SIZE (sizeof(dmasks) / sizeof(Mdevs))
\r
127 // Return: < 0 - Error. > 0 - Numbern of characters written (including last '\0')
\r
128 int create_mst_names_by_dev_id(USHORT dev_id, int dev_ix, int mask, char *name, int name_len, int *cnt)
\r
130 int i,j; char *suffix; BOOL found = FALSE; char *nm_ptr = name;
\r
133 DPRINT3(( "create_mst_names_by_dev_id: dev_id %d, dev_ix %d, mask %#x, name_len %d\n",
\r
134 dev_id, dev_ix, mask, name_len ));
\r
136 // specific stuff: for CONF devices create only "_cr" device
\r
139 if (IS_CONF_DEV(dev_id)) {
\r
141 tot_len += _snprintf(name, name_len, TAVOR_TYPE_DEVICE_NAME_FMT, dev_id, "conf", dev_ix );
\r
142 tot_len++; // trailing null
\r
146 DPRINT3(( "create_mst_names_by_dev_id: not conf device %hu, is_conf_dev %d \n",
\r
147 dev_id, IS_CONF_DEV(dev_id) ));
\r
150 for (i=0; i<DEVICE_DB_SIZE; i++) {
\r
151 if ((db[i].DevId == dev_id) && (db[i].mask & mask)) {
\r
157 DPRINT1(( "create_mst_names_by_dev_id: device %hu, mask %#x not found \n",
\r
162 // names generation
\r
163 for (j=0; j<MASKS_SIZE; j++) {
\r\r
164 if ((db[i].mask & mask) & dmasks[j]) {
\r
165 char l_name[MAX_DEV_NAME]; int len;
\r
167 len = _snprintf(l_name, sizeof(l_name), TAVOR_TYPE_DEVICE_NAME_FMT, dev_id, dsuffix[j], dev_ix );
\r
169 // check whether we have enough place
\r
170 if (len > name_len) {
\r
171 DPRINT1(( "create_mst_names_by_dev_id: not enough length (%d > %d)\n",
\r
175 // copy the results
\r
176 DPRINT5(( "create_mst_names_by_dev_id: name %s\n",
\r
178 memcpy( nm_ptr, l_name, len );
\r
190 // Return: 0 - error, 1 - OK
\r
191 int parse_mst_name(const char *mst_name,
\r
194 MType* mst_dev_type,
\r
195 Mdevs* access_type)
\r
198 char suffix[MAX_DEV_NAME];
\r
201 // Unix device name compatibility: Remove path (if exists) from device name:
\r
203 if ((fname = strrchr(mst_name, '/')) || (fname = strrchr(mst_name, '\\'))) {
\r
204 DPRINT3(("Removing path from file: %s --> %s\n", mst_name, fname + 1));
\r
205 mst_name = fname + 1;
\r
210 if (strstr(mst_name, USB_DEV_NAME)) {
\r
211 *dev_id = DEVASYS_DEV_ID;
\r
213 *mst_dev_type = MST_USB;
\r
216 // get dev_id and suffix. dev_ix gets a dummy value.
\r
217 sscanf( mst_name, TAVOR_TYPE_DEVICE_NAME_FMT, dev_id, suffix, dev_ix );
\r
218 // step over the suffix. ptr will be at the card's number
\r
219 if ((ptr=strstr( suffix, "conf"))) { /* CONF device */
\r
221 *mst_dev_type = MST_PCICONF;
\r
222 } else if ((ptr=strstr( suffix, "_cr"))) {
\r
224 *mst_dev_type = MST_PCI;
\r
225 *access_type = MDEVS_TAVOR_CR;
\r
226 } else if ((ptr=strstr( suffix, "_uar"))) {
\r
228 *mst_dev_type = MST_PCI;
\r
229 *access_type = MDEVS_TAVOR_UAR;
\r
230 } else if ((ptr=strstr( suffix, "_ddr"))) {
\r
232 *mst_dev_type = MST_PCI;
\r
233 *access_type = MDEVS_TAVOR_DDR;
\r
235 DPRINT1(( "parse_mst_name: incorrect device name '%s' \n", mst_name ));
\r
240 sscanf( ptr, "%hu", dev_ix );
\r
243 DPRINT3( ("parse_mst_name: name %s, dev_id %d, dev_ix %d\n",
\r
244 mst_name, *dev_id, *dev_ix));
\r
249 // Return: 0 - error, 1 - OK
\r
250 int create_mdt_name_by_dev_id(USHORT dev_id, USHORT dev_ix, char *name, int name_len)
\r
254 DPRINT3(( "create_mdt_name_by_dev_id: dev_id %d, dev_ix %d\n",
\r
259 for (i=0; i<DEVICE_DB_SIZE; i++) {
\r
260 DPRINT5(( "create_mdt_name_by_dev_id: dev_id %d, i %d\n",
\r
262 if (db[i].DevId == dev_id) {
\r
263 _snprintf(name, name_len, MDT_DEVICE_NAME_FMT, db[i].DevName, dev_ix );
\r
267 DPRINT1(( "create_mdt_name_by_dev_id: not found device with dev_id %hu\n", dev_id));
\r
273 // IBAL Access function
\r
279 ib_api_status_t ibal_access(ib_ca_handle_t h_ca, u_int32_t offset, void *p_data, uint32_t length, uint32_t operation )
\r
283 ib_api_status_t ib_status;
\r
288 ci_op.buf_size = length;
\r
289 ci_op.p_buf = p_data;
\r
290 ci_op.buf_info = offset;
\r
291 ci_op.num_bytes_ret = sizeof (ib_ci_op_t);
\r
292 ci_op.command = operation;
\r
294 ib_status = ib_ci_call (h_ca, NULL, 0, &ci_op);
\r
296 if ( ib_status != IB_SUCCESS )
\r
298 DPRINTS1(("Failed ib_ci_call , cmd %x.\n", operation), ib_status );
\r
306 // Return an array of dev IDs of the HCAs on local machine.
\r
307 // IDs are returned in the dev_ids array (allocated by caller)
\r
309 // Returns number of HCAs found or -1 for error
\r
311 int get_dev_ids(ib_al_handle_t h_al, USHORT* dev_ids, u_int32_t size) {
\r
317 ib_net64_t guids[MAX_HCA_NUM];
\r
318 ib_api_status_t ib_status;
\r
319 size_t ca_guids_count = MAX_HCA_NUM;
\r
321 ib_status = ib_get_ca_guids ( h_al, guids, &ca_guids_count );
\r
322 if (ib_status != IB_SUCCESS) {
\r
323 DPRINTS1(("Failed to get CA GUIDs\n"), ib_status);
\r
327 if (ca_guids_count == 0) {
\r
328 DPRINT3(("FOUND NO GUIDS\n"));
\r
332 if (ca_guids_count > size) {
\r
333 DPRINT1(("get_dev_ids(): Got buffer for %d HCAs, but %d HCAs found on machine.\n", size, ca_guids_count));
\r
337 for (i = 0; i < ca_guids_count ; i++) {
\r
338 ib_ca_attr_t* ca_data;
\r
344 ib_status = ib_query_ca_by_guid(h_al, guids[i], NULL, &bsize);
\r
345 if(ib_status != IB_INSUFFICIENT_MEMORY)
\r
347 DPRINTS1(("Failed to get size of query ca %d by guid.\n", i), ib_status);
\r
352 ca_data = (ib_ca_attr_t*)malloc(bsize);
\r
353 if (ca_data == NULL) {
\r
354 DPRINT1(("get_dev_ids: malloc failed.\n"));
\r
358 ca_data->dev_id = 0;
\r
360 ib_status = ib_query_ca_by_guid(h_al, guids[i], ca_data, &bsize);
\r
361 if(ib_status != IB_SUCCESS)
\r
363 DPRINTS1(("Failed to query ca %d by guid.\n", i), ib_status);
\r
366 // Get the device id:
\r
367 dev_ids[i] = ca_data->dev_id;
\r
384 int get_hca_idx(ib_al_handle_t h_al, USHORT dev_id, USHORT dev_ix) {
\r
385 USHORT dev_ids[MAX_HCA_NUM];
\r
388 int matching_devs_found = 0;
\r
390 cnt = get_dev_ids(h_al, dev_ids, MAX_HCA_NUM);
\r
396 for (i = 0 ; i < cnt ; i++) {
\r
397 if (dev_ids[i] == dev_id) {
\r
398 if (matching_devs_found == dev_ix) {
\r
399 DPRINT3(("get_hca_idx, type=%d, idx=%d. HCA index = %d\n", dev_id, dev_ix, i));
\r
402 matching_devs_found++;
\r
406 DPRINT3(("get_hca_idx, type=%d, idx=%d. No matching device found in %d HCAs\n", dev_id, dev_ix, i));
\r
414 // dev_idx_by_type - stores current hca type idx for each type. Assumed to
\r
415 // be in the same size of DEVICE_DB_SIZE
\r
417 int get_and_inc_dev_idx(u_int32_t* dev_idx_by_type, USHORT dev_id) {
\r
421 for (i = 0; i < DEVICE_DB_SIZE; i++) {
\r
422 if (dev_id == db[i].DevId) {
\r
423 ret = dev_idx_by_type[i];
\r
424 dev_idx_by_type[i]++;
\r
435 // List devices in their MST compatible names.
\r
436 // Each device type is indexed sepetrately.
\r
440 MTCR_API int mdevices(char *buf, int len, int mask)
\r
442 u_int32_t tot_len = 0;
\r
447 u_int32_t dev_idx_by_type[DEVICE_DB_SIZE];
\r
448 USHORT dev_ids[MAX_HCA_NUM];
\r
451 ib_api_status_t ib_status;
\r
452 ib_al_handle_t h_al = 0;
\r
456 memset( (char*)dev_idx_by_type, 0, sizeof(dev_idx_by_type));
\r
458 ib_status = ib_open_al( &h_al );
\r
459 if ( ib_status != IB_SUCCESS ) {
\r
460 DPRINTS1(("Failed to open AL\n"), ib_status );
\r
463 cnt = get_dev_ids(h_al, dev_ids, MAX_HCA_NUM);
\r
473 for(i = 0; i < cnt; i++) {
\r
478 if (dev_ids[i] == 0) {
\r
482 idx = get_and_inc_dev_idx(dev_idx_by_type, dev_ids[i]);
\r
485 DPRINT1(("mdevices: Unknown dev id detected: %d. skipped.\n", dev_ids[i]));
\r
489 // For now - get only TAVOR_CR (cr, conf ) devices.
\r
490 curr_len = create_mst_names_by_dev_id(dev_ids[i], idx, MDEVS_TAVOR_CR , p , len - tot_len , &curr_cnt);
\r
491 if (curr_cnt < 0) {
\r
495 tot_len += curr_len;
\r
501 if (usb_is_connected() ) {
\r
502 sprintf(p, USB_DEV_NAME );
\r
511 MTCR_API mfile *mopen(const char *name)
\r
513 return mopend(name, MST_TAVOR);
\r
516 MTCR_API mfile *mopend(const char *name, DType dtype)
\r
518 USHORT dev_id=0, dev_ix=0;
\r
520 MType mst_dev_type;
\r
524 /* allocate mfile struct */
\r
525 mfile_ibal *mf = (mfile_ibal *)malloc(sizeof(mfile_ibal));
\r
531 memset( (char*)mf, 0, sizeof(mfile_ibal));
\r
537 if (!parse_mst_name(name, &dev_id, &dev_ix, &mst_dev_type, &access_type )) {
\r
541 DPRINT3(( "mopend: %s, dtype %d, devid %d\n", name, dtype, dev_id));
\r
545 case TAVOR_DEV_ID: case ARBEL_TM_DEV_ID:
\r
546 case ARBEL_DEV_ID: case SINAI_4X_DEV_ID:
\r
547 case SINAI_8X_DEV_ID:
\r
548 mf->s.itype = MST_TAVOR;
\r
551 mf->s.itype = MST_GAMLA;
\r
555 /* Type of device */
\r
556 mf->s.dtype = dtype;
\r
557 if (dtype == MST_TAVOR)
\r
558 mf->s.i2c_slave = 0x48;
\r
560 mf->s.i2c_slave = 0x5a;
\r
562 #ifdef SUPPORT_I2CM
\r
563 /* Use the device as I2C master? */
\r
564 mf->s.is_i2cm = strstr(name, "i2cm") ? 1 : 0;
\r
566 /* Type of interface (relevant when is_i2cm==1, unused otherwise */
\r
570 case TAVOR_DEV_ID: case ARBEL_TM_DEV_ID:
\r
571 case ARBEL_DEV_ID: case SINAI_4X_DEV_ID:
\r
572 case SINAI_8X_DEV_ID:
\r
573 mf->s.itype = MST_TAVOR;
\r
581 if (dev_id != DEVASYS_DEV_ID ) {
\r
582 /* Open ibal HCA handle */
\r
585 ib_net64_t guids[MAX_HCA_NUM];
\r
587 ib_api_status_t ib_status;
\r
588 size_t ca_guids_count = MAX_HCA_NUM;
\r
590 ib_status = ib_open_al( &mf->h_al );
\r
592 if ( ib_status != IB_SUCCESS ) {
\r
593 M_DEBUGS(("Failed to open AL\n"), ib_status );
\r
598 ib_status = ib_get_ca_guids ( mf->h_al, guids, &ca_guids_count );
\r
599 if (ib_status != IB_SUCCESS) {
\r
600 M_DEBUGS(("Failed to get CA GUIDs\n"), ib_status);
\r
604 if (ca_guids_count == 0) {
\r
605 DPRINT1(("FOUND NO GUIDS\n"));
\r
609 target_hca = get_hca_idx(mf->h_al, dev_id , dev_ix );
\r
610 if (target_hca < 0) {
\r
614 ib_status = ib_open_ca( mf->h_al, guids[target_hca], NULL, mf, &mf->h_ca );
\r
615 if (ib_status != IB_SUCCESS)
\r
617 DPRINTS1(("Failed to open CA\n"), ib_status);
\r
621 if(mst_dev_type == MST_PCICONF) {
\r
623 mf->s.tp = MST_PCICONF;
\r
625 DPRINT5(("Calling: ibal_access(mf->h_ca, 0x0, &stub, 4, FW_OPEN_IF )\n"));
\r
626 if (ibal_access(mf->h_ca, 0x0, &stub, 4, FW_OPEN_IF ) != IB_SUCCESS) {
\r
634 mf->s.tp = MST_PCI;
\r
636 // calculate bar number
\r
637 if (access_type == MDEVS_TAVOR_CR) {
\r
638 // TODO: See what about UAR and DDR bars - not supported for now.
\r
641 DPRINT1(("Only _cr access is supported"));
\r
645 // check FW_MAP_CRSPACE
\r
646 if (ibal_access(mf->h_ca, 0x0, &mf->cr_map, sizeof(mf->cr_map), FW_MAP_CRSPACE ) != IB_SUCCESS) {
\r
650 mf->s.ptr = mf->cr_map.va;
\r
653 } else if (dev_id == DEVASYS_DEV_ID) {
\r
656 if ( h == INVALID_HANDLE_VALUE )
\r
658 mf->s.fd = FromHandle(h);
\r
659 // mf->s.tp = (usb_is_dimax()) ? MST_USB_DIMAX : MST_USB;
\r
660 mf->s.tp = MST_USB;
\r
670 mclose((mfile*)mf);
\r
675 MTCR_API void maccelerate(mfile *mf)
\r
677 #ifdef SUPPORT_I2CM
\r
679 i2c_master_set((mfile*)mf);
\r
683 MTCR_API void mrestore(mfile *mf)
\r
685 #ifdef SUPPORT_I2CM
\r
687 i2c_master_restore(mf);
\r
691 MTCR_API int mclose(mfile *mf)
\r
695 if (mf->tp == MST_USB) {
\r
696 rc = usb_close( (HANDLE)mf->fd);
\r
698 mfile_ibal* mfi = (mfile_ibal*)mf;
\r
701 if (mf->tp == MST_PCICONF) {
\r
702 ibal_access(mfi->h_ca, 0x0, &stub, 4, FW_CLOSE_IF );
\r
703 } else if (mf->tp = MST_PCI) {
\r
704 if (mfi->cr_map.size) {
\r
706 if (ibal_access(mfi->h_ca, 0x0, NULL, 0, FW_UNMAP_CRSPACE ) != IB_SUCCESS) {
\r
707 DPRINT1(("Unmap crspace failed"));
\r
713 ib_close_ca( mfi->h_ca, NULL );
\r
715 ib_close_al( mfi->h_al);
\r
722 MTCR_API int mread4(mfile *mf, unsigned int offset, u_int32_t *value)
\r
726 mfile_ibal* mfi = (mfile_ibal*)mf;
\r
734 if (offset >= mfi->cr_map.size) {
\r
735 DPRINT1(("MTCR:mread4: Tried to access value at offset %x, which is out of pci bar (size %x)\n",
\r
737 mfi->cr_map.size));
\r
743 #ifdef SUPPORT_I2CM
\r
745 return i2c_master_read_cr(mf, value, offset, 4);
\r
748 if (mf->dtype == MST_TAVOR)
\r
749 *value = __be32_to_cpu(*((volatile unsigned int *)((char *)mf->ptr + offset)));
\r
751 *value = *((volatile unsigned int *)((char *)mf->ptr + offset));
\r
757 #ifdef SUPPORT_I2CM
\r
759 return i2c_master_read_cr(mf, value, offset, 4);
\r
762 if (ibal_access(((mfile_ibal*)mf)->h_ca, offset, value, 4, FW_READ_CMD) == IB_SUCCESS) {
\r
777 unsigned int offs = (usb_is_dimax()) ? offset : __cpu_to_be32(offset);
\r
778 unsigned int addr_len = 2;
\r
779 rc = usb_read( (HANDLE)mf->fd, I2C_TRANS_32ADR, mf->i2c_slave, offs, addr_len,
\r
780 (u_int8_t*)&lvalue, 4 );
\r
786 unsigned int offs = (usb_is_dimax()) ? offset : __cpu_to_be32(offset);
\r
787 unsigned int addr_len = 4;
\r
788 rc = usb_read( (HANDLE)mf->fd, I2C_TRANS_32ADR, mf->i2c_slave, offs, addr_len,
\r
789 (u_int8_t*)&lvalue, 4 );
\r
795 *value = __be32_to_cpu(lvalue);
\r
806 DPRINT5(( "MTCR:mread4: off 0x%x, val 0x%x\n", offset, *value));
\r
810 MTCR_API int mwrite4(mfile *mf, unsigned int offset, u_int32_t value)
\r
813 unsigned int lvalue;
\r
814 mfile_ibal* mfi = (mfile_ibal*)mf;
\r
822 if (offset >= mfi->cr_map.size) {
\r
823 DPRINT1(("MTCR:mwrite4: Tried to access value at offset %x, which is out of pci bar (size %x)\n",
\r
825 mfi->cr_map.size));
\r
830 #ifdef SUPPORT_I2CM
\r
832 return i2c_master_write_cr(mf, value, offset, 4);
\r
835 if (mf->dtype == MST_TAVOR)
\r
836 *((volatile unsigned int *)((char *)mf->ptr + offset)) = __cpu_to_be32(value);
\r
838 *((volatile unsigned int *)((char *)mf->ptr + offset)) = value;
\r
844 #ifdef SUPPORT_I2CM
\r
846 return i2c_master_write_cr(mf, value, offset, 4);
\r
849 if (ibal_access(((mfile_ibal*)mf)->h_ca, offset, &value, 4, FW_WRITE_CMD) == IB_SUCCESS) {
\r
865 unsigned int offs = (usb_is_dimax()) ? offset : __cpu_to_be32(offset);
\r
866 unsigned int addr_len = 2;
\r
867 lvalue = __cpu_to_be32(value);
\r
868 rc = usb_write( (HANDLE)mf->fd, I2C_TRANS_32ADR, mf->i2c_slave, offs, addr_len,
\r
869 (u_int8_t*)&lvalue, 4 );
\r
875 unsigned int offs = (usb_is_dimax()) ? offset : __cpu_to_be32(offset);
\r
876 unsigned int addr_len = 4;
\r
877 lvalue = __cpu_to_be32(value);
\r
878 rc = usb_write( (HANDLE)mf->fd, I2C_TRANS_32ADR, mf->i2c_slave, offs, addr_len,
\r
879 (u_int8_t*)&lvalue, 4 );
\r
893 DPRINT5(("MTCR:mwrite4: off 0x%x, val 0x%x\n", offset, value));
\r
897 MTCR_API int mread64(mfile *mf, unsigned int offset, void *data, int length)
\r
901 if (length > MAX_TRANS_SIZE)
\r
913 unsigned char *cdata = (unsigned char *)data;
\r
915 for (i=0; i<length; i++)
\r
917 rc = i2c_master_read_cr(mf, cdata++, offset++, 1);
\r
927 #ifdef MTCR_USB_SUPPORT
\r
932 int trans_type = I2C_TRANS_NOADR;
\r
935 case MST_NOADDR: trans_type = I2C_TRANS_NOADR; aw = 0; break;
\r
936 case MST_DIMM: trans_type = I2C_TRANS_8ADR; aw = 1; break;
\r
937 case MST_GAMLA: trans_type = I2C_TRANS_16ADR; aw = 2; break;
\r
938 case MST_TAVOR: trans_type = I2C_TRANS_32ADR; aw = 4; break;
\r
941 ret = usb_read((HANDLE)mf->fd, trans_type, mf->i2c_slave, offset, aw, data, length);
\r
942 if (ret == MT_OK) {
\r
959 MTCR_API int mwrite64(mfile *mf, unsigned int offset, void *data, int length)
\r
964 if (length > MAX_TRANS_SIZE)
\r
976 unsigned char *cdata = (unsigned char *)data;
\r
978 for (i=0; i<length; i++)
\r
980 rc = i2c_master_write_cr(mf, *cdata++, offset++, 1);
\r
989 #ifdef MTCR_USB_SUPPORT
\r
994 int trans_type = I2C_TRANS_NOADR;
\r
997 case MST_NOADDR: trans_type = I2C_TRANS_NOADR; aw = 0; break;
\r
998 case MST_DIMM: trans_type = I2C_TRANS_8ADR; aw = 1; break;
\r
999 case MST_GAMLA: trans_type = I2C_TRANS_16ADR; aw = 2; break;
\r
1000 case MST_TAVOR: trans_type = I2C_TRANS_32ADR; aw = 4; break;
\r
1003 ret = usb_write((HANDLE)mf->fd, trans_type, mf->i2c_slave, offset, aw, data, length);
\r
1004 if (ret == MT_OK) {
\r
1019 unsigned char mset_i2c_slave(mfile *mf, unsigned char new_i2c_slave)
\r
1021 unsigned char ret;
\r
1024 ret = mf->i2c_slave;
\r
1025 mf->i2c_slave = new_i2c_slave;
\r